opencv库(一): 输入输出图像
1 导入模块
数字图像数据可以用矩阵来表示,因而我们可以采用矩阵理论和矩阵算法对数字图像进行分析和处理。
opencv
库依赖与 numpy
库的矩阵运算,所以两者需要同时加载。
matplotlib
库不是必须加载的,但是很多时候我们需要用到这个强大的图像处理模块。
import cv2
import numpy as np
import matplotlib.pyplot as plt
2 读取图像
原始图像:
img = cv2.imread('img1.png')
img 实际上是一个3维矩阵:
print(type(img))
# <class 'numpy.ndarray'>
print(img.shape)
# (219, 218, 3)
print(img.ndim)
# 3
彩色图像有 RGB 三个通道,所以我们可以将这个三维矩阵分成三个部分。
3 图像输出
用 opencv
输出
# opencv 设置窗口 图像输出 窗口关闭
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() # 等价于cv2.destroyWindow('image')
cv2.namedWindow()
其实可以不需要,但是如果图片尺寸比较大,输出的图像会装不下电脑屏幕。该命令第一个参数是输出的窗口的名称。cv2.imshow()
是图像输出的命令,第一个参数为输出的窗口的名称,第二个参数是读取的图像变量。cv2.waitKey(0)
是等待按键关闭窗口的时间,传递的数值单位为毫秒,设置成 0 的话是无限等待。cv2.destroyAllWindows()
是关闭窗口命令。若需要指定关闭某个窗口,可以使用cv2.destroyWindow('image_name')
。
用 matplotlib
输出
img = cv2.imread('img1.png')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.imshow(img2)
plt.show()
需要注意的是, opencv
用 cv2.imread()
命令读取到的三原色顺序为blue,green,red ,用 opencv
展示出来的是图像正确的颜色;而一般而言,三原色的顺序为RGB,所以我们如果用 matplotlib
显示图像,需要重组矩阵以正确显示图像的颜色。参见此处:stack overflow
命令实现:
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
我们可以用下面的语句看看拆分的矩阵是什么:
print(b)
print('\n')
print(b.shape)
print('\n')
print(np.all(b==img[:,:,0]))
输出结果为:
上面的命令表明:
- 我们可以通过 img
矩阵的切片得到RGB矩阵,比如 img[:,:,0]
得到 blue 通道
- img.shape
或者 b.shape
的第一个数字代表图像的高度,第二个数字代表图像的宽度。
测试以下命令:
img = cv2.imread('img1.png')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.subplot(221)
plt.title('BRG')
plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.subplot(222)
plt.title('RGB')
plt.xticks([]), plt.yticks([])
plt.imshow(img2)
plt.subplot(223)
plt.imshow(img, interpolation = 'bicubic')
plt.title('BRG+interpolation')
plt.subplot(224)
plt.imshow(img2, interpolation = 'bicubic')
plt.title('RGB+interpolation')
plt.show()
输出结果:
说明:
第一幅图片以 BRG 显示图像,第二幅以 RGB 正常显示图像;
第三、四幅图片经过插值之后,消除了图像锯齿。
4 综合例子
来自官网的一个例子:
img = cv2.imread('img1.png')
cv2.imshow('image',img)
k = cv2.waitKey(0) & 0xFF # 32位的电脑该命令为 k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('img_from_cv2.png',img)
cv2.destroyAllWindows()
该命令可以实现按 Esc
键关闭窗口,按 s
键保存图片
来源:OpenCV-Python Tutorials » Gui Features in OpenCV » Getting Started with Images