OpenCV-Python — загрузка изображений, отображение, сохранение
В этом разделе мы научимся использовать библиотеку OpenCV на языке Python для чтения, отображения и сохранения изображений.Все эти изображения являются numpy.ndarray, эти три операции реализуются тремя функциями cv2.imread(), cv2.imshow() и cv2.imwrite(), при этом в конце статьи кратко описано использование Matplotlib для отображения картинок представил. OpenCV, используемый в этой статье, является версией opencv3.2, Картинки следующие:
1. Прочитайте картинку
Используйте функцию cv2.imread() в OpenCV для загрузки изображения, форма функции выглядит следующим образом:
cv2.imread(path, flags)
Смысл параметров следующий:
- path: этот параметр указывает путь к изображению, можно использовать как относительный, так и абсолютный путь;
-
flags: Укажите, как загрузить изображение, есть три значения:
-
cv2.IMREAD_COLOR: прочитать копию
彩色图片
, прозрачность изображения будет игнорироваться, это значение по умолчанию, фактическое значение равно 1; -
cv2.IMREAD_GRAYSCALE:от
灰度模式
Прочитайте картинку, фактическое значение равно 0 - cv2.IMREAD_UNCHANGED: загрузить цветное изображение, прозрачность не будет игнорироваться.
-
cv2.IMREAD_COLOR: прочитать копию
Если указанный путь к изображению неверен, функция не выдаст исключение, а вернет None,Если указан правильный путь к изображению, вернет[height, width, channel]
изnumpy.ndarray
объект, высота представляет собой высоту изображения, ширина представляет собой ширину изображения, а канал представляет собой канал изображения.
import numpy as np
import cv2
img = cv2.imread("pic.jpg")
# img = cv2.imread("pic.jpg", cv2.IMREAD_COLOR)
# img = cv2.imread("pic.jpg", cv2.IMREAD_GRAYSCALE)
# img = cv2.imread("pic.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("image", img) # 显示图片,后面会讲解
cv2.waitKey(0) #等待按键
Эффект следующий:
2. Отображение изображений
Используйте функцию cv2.imshow() для отображения изображения в окне, которое адаптируется к размеру изображения, в следующей форме:
cv2.imshow(winname, mat)
Смысл параметров следующий:
1. winame:一个字符串,表示创建的窗口名字,每一个窗口必须有一个唯一的名字;
2. mat:是一个图片矩阵,numpy.ndarray类型
В процессе отображения изображения обычно есть несколько других функций, а именно:
- cv2.waitKey()
- cv2.destroyAllWindows()
- cv2.destroyWindow()
- cv2.namedWindow()
Так как наша программа выполняется последовательно, если неcv2.waitKey()
функция, изображение не будет отображаться (возможно, во вспышке, мы не можем увидеть это человеческим глазом),cv2.waitKey()
Функция представляет собой функцию привязки клавиатуры (эквивалентно разрешению программе приостанавливать и приостанавливать выполнение здесь), она принимает время в миллисекундах, она ожидает события клавиатуры в течение указанного времени, событие клавиатуры происходит в течение указанного времени, и программа продолжает выполняться, В противном случае он должен дождаться окончания времени, чтобы продолжить выполнение. Если параметр равен 0, это означает ожидание бесконечно долгого события.
cv2.destroyAllWindows()
Используется для уничтожения всех созданных окон, если вам нужно уничтожить указанное окно, используйтеcv2.destroyWindow()
функция, которая принимает имя, представляющее имя окна.
Здесь мы непосредственно используемcv2.imshow()
Созданное окно автоматически адаптируется к размеру изображения и не может масштабироваться, если мы хотим увеличивать и уменьшать масштаб окна, мы должны использовать его отдельно.cv2.namedWindow()
, и черезflag
Параметр указывает оконный режим как cv2.WINDOW_NORMAL, а значение по умолчанию — cv2.WINDOW_AUTOSIZE.
Вот пример окна, которое можно уменьшить для отображения изображения:
import numpy as np
import cv2
img = cv2.imshow('picture.jpg')
cv2.namedWindow('image')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. Сохраните изображение
использоватьcv2.imwrite()
Функция для сохранения изображения в следующем виде:
cv2.imwrite(filename, img)
Смысл параметров следующий:
- filename: путь к сохраненному файлу
- img: объект numpy.ndarray, представляющий изображение
4. Полная программа
import numpy as np
import cv2
img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
## k = cv2.waitKey(0) & 0xFF # 64位机器
if k == 27: # 按下esc时,退出
cv2.destroyAllWindows()
elif k == ord('s'): # 按下s键时保存并退出
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
5. Используйте matplotlib для отображения изображений
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏x、y轴
plt.show()
Поскольку opencv загружает изображения в режиме BGR, а matplotlib отображает изображения в режиме RGB, цветные изображения, загруженные с помощью opencv, не могут правильно отображаться в matplotlib.Следующее является решением
OpenCV — решение проблемы отображения цветных изображений Opencv в matplot
Поскольку OpenCV загружает изображения в режиме BGR, а matplotlib отображает изображения в обычном режиме RGB, будут проблемы при отображении цветных изображений, загруженных через OpenCV с помощью matplotlib, Для этой проблемы здесь предлагаются три основных решения.
Давайте сначала посмотрим на эффект прямых линий, используя matplotlib для отображения внешнего вида цветных изображений, загруженных opencv:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("messi5.jpg")
cv2.imshow("BGR", img)
cv2.waitKey(0)
plt.imshow(img)
plt.title("BGR")
plt.show()
первый способ
Таким образом, функции cv2.split() и cv2.merge() используются для разделения загруженных изображений в соответствии с режимом BGR, а затем объединяют изображения в соответствии с режимом RGB Код выглядит следующим образом:
import cv2
import matplotlib.pyplot as plt
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title("BGR")
plt.subplot(1, 2, 2)
plt.imshow(img2)
plt.title('RGB')
plt.show()
Эффект следующий:
Второй метод
Этот метод заключается в использовании обратного порядка массива и переносе последнего бита.Код выглядит следующим образом:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("messi5.jpg")
img2 = img[...,::-1]
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title("BGR")
plt.subplot(1, 2, 2)
plt.imshow(img2)
plt.title('RGB')
plt.show()
Эффект следующий:
третий метод
Используйте функцию преобразования режима, которая поставляется с opencv.cv2.cvtColor()
, код показан ниже:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("messi5.jpg")
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title("BGR")
plt.subplot(1, 2, 2)
plt.imshow(img2)
plt.title('RGB')
plt.show()
Эффект следующий: