1、目标
a、在这里将会学到怎样读取一副图像,怎样显示幅图像,以及如何保存一副图像
b、要学习的函数如下:
cv2.imread(),cv2.imshow(),cv2.imwrite()
c、还可以使用Matplotlib显示一幅图片
2、读入一幅图像
警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命
令print img时得到的结果是None。3、保存一幅图像
4、总结
下面的程序将会加载一个灰度图,显示图片,按下’s’键保存后退出,或者
按下 ESC 键退出不保存。5、使用Matplotlib
Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。之后
会陆续了解到。现在,你可以学习怎样用 Matplotib 显示图像。你可以放大图像,保存它等等。参见:Matplotib 有多种绘图选择。具体可以参见 Matplotib docs。我们也
会陆续了解一些注意:彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB
模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正确显示。具体细节请看练习附加资源:
Matplotlib Plotting Styles and Featureshttp://matplotlib.org/api/pyplot_api.html
练习:
1. 当你用 OpenCV 加载一个彩色图像,并用 Matplotib 显示它时会遇到一些困难。请阅读this discussion并且尝试理解它。在opencv中彩色图的顺序是BGR,而在matplotlib中彩色图的顺序是RGB,如何相互转换,
import cv2import numpy as np import matplotlib.pyplot as plt img = cv2.imread('messi4.jpg') b,g,r = cv2.split(img) img2 = cv2.merge([r,g,b]) plt.subplot(121);plt.imshow(img) # expects distorted color plt.subplot(122);plt.imshow(img2) # expect true color plt.show() cv2.imshow('bgr image',img) # expects true color cv2.imshow('rgb image',img2) # expects distorted color cv2.waitKey(0) cv2.destroyAllWindows()
NB : Please check @Amro 's comment below for better method of conversion between BGR and RGB. img2 = img[:,:,::-1]
. Very simple.
Run this code and see the difference in result yourself. Below is what I got :
补充:
1、用cv2.imshow显示图像,这种方式显示的窗口无法调整,当显示的图像较大时,就无法看到完整的图像,因此选择先创建窗口再显示图像。
- import cv2
- img = cv2.imread('lena.jpg')
- win = cv2.namedWindow('test', flags=0)
- cv2.imshow('test', img)
- cv2.waitKey(0)
采用窗口名称来访问窗口,而不是窗口句柄之类的东西。
flags为0表示窗口可以用鼠标来改变大小,此时显示的图像也跟着窗口大小变化,需要注意的是它可能会导致图像的变形:
2、matplotlib图像显示
- mport cv2
- import matplotlib.pyplot as plt
- img = cv2.imread('lena.jpg')
- plt.imshow(img)
- plt.show()
颜色有问题,下面将第1通道和第3通道交换后显示:
- import numpy as np
- import cv2
- import matplotlib.pyplot as plt
- img = cv2.imread('lena.jpg')
- (r, g, b)=cv2.split(img)
- img=cv2.merge([b,g,r])
- plt.imshow(img)
- plt.show()
就正常了
3、用plt读取图像
再比较一下plt.imread和cv2.imread的差别:
- import numpy as np
- import cv2
- import matplotlib.pyplot as plt
- img1 = cv2.imread('lena.jpg')
- img2 = plt.imread('lena.jpg')
- plt.subplot(121)
- plt.imshow(img1)
- plt.subplot(122)
- plt.imshow(img2)
- plt.show()
上述代码读取同一张图像并用相同的方法显示,差异还是在颜色通道上:
4、matplotlib显示灰度图
对于只有一个颜色通道的图像,matplotlib可以指定一个map,将单个颜色通道的图像转换为彩色图像。
matplotlib支持下面的map。