OpenCV-Python教程001——图像的读取、显示和保存

目标:在本部分内容,您将学习如何读取图像、如何显示图像以及如何将其保存起来。

您将学习以下函数:cv2.imread()、cv2.imshow()、cv2.imwrite()。

(1)使用OpenCV读取图像

使用函数cv2.imread()读取图像。映像应该在工作目录中,或者应该给出映像的完整路径。

第二个参数是一个标志,指定读取图像的方式。

cv2.IMREAD_COLOR:加载彩色图像。任何图像的透明度都将被忽略。它是默认标志。

cv2.IMREAD_GRAYSCALE:以灰度模式加载图像。

cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道。

注意,您只需分别传递整数1、0或-1,而不是这三个标志。

请参见下面的代码:

<code>import numpy as np
import cv2
img = cv2.imread('D:/python_opencv/images/lena.png',cv2.IMREAD_UNCHANGED)/<code>

(2)显示图像

使用函数cv2.imshow()在窗口中显示图像。窗口自动适应图像大小。

第一个参数是一个窗口名,它是一个字符串。第二个参数是我们的图像。您可以创建任意多个窗口,但使用不同的窗口名。

<code>cv2.imshow('image',img) #窗口名字,要显示的图像
cv2.waitKey(0) #无限等待,直到任意键按下
cv2.destroyAllWindows() #销毁所有窗口/<code>

图像显示如下:

OpenCV-Python教程001——图像的读取、显示和保存

waitKey()是一个键盘绑定函数。它的参数是以毫秒为单位的时间。该函数等待指定的毫秒,等待任何键盘事件。如果在该时间按任何键,程序将继续。如果0被传递,它将无限期地等待一个键按下。它还可以设置为检测特定的按键按下,例如,如果按下a键等,我们将在下面讨论。

注意除了绑定键盘事件之外,这个函数还处理许多其他的GUI事件,因此您必须使用它来实际显示图像。

destroyAllWindows()只会销毁我们创建的所有窗口。如果要销毁任何特定窗口,请使用函数cv2.destroyWindow(),在该函数中将确切的窗口名称作为参数传递。

注意,有一种特殊情况,您可以在其中创建一个窗口,然后将图像加载到该窗口。在这种情况下,可以指定窗口是否可调整大小。它是用函数cv2.namedWindow()完成的。默认情况下,标志为cv2.WINDOW_AUTOSIZE。但是,如果将标志指定为cv2.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸太大并在窗口中添加轨迹栏时,这将非常有用。

请参见下面的代码:

<code>#cv2.WINDOW_NORMAL,可以调整窗口大小
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)

cv2.waitKey(0)
cv2.destroyAllWindows()/<code>

图像显示如下,图中通过鼠标拖动人为改变了图像的形状。

OpenCV-Python教程001——图像的读取、显示和保存

(3)写一幅图像

使用函数cv2.imwrite()保存图像。

第一个参数是文件名,第二个参数是要保存的图像。以下代码将上面读取的图像横向拼接并保存、读取、显示。

<code>img2=np.concatenate((img,img),axis=1)   #将图像横向拼接
cv2.imwrite('D:/python_opencv/images/lena2.jpg',img2) #保存图像
img = cv2.imread('D:/python_opencv/images/lena2.jpg',cv2.IMREAD_COLOR)
cv2.imshow('image',img) #窗口名字,要显示的图像
cv2.waitKey(0) #无限等待,直到任意键按下
cv2.destroyAllWindows() #销毁所有窗口/<code>
OpenCV-Python教程001——图像的读取、显示和保存

(4)总结一下

下面通过一个综合例子,以灰度加载图像,显示它,如果按“s”并退出,则保存图像,如果按ESC键,则只需退出而不保存。

<code>#按Esc退出,按s键保存图像
import numpy as np
import cv2
img = cv2.imread('D:/python_opencv/images/lena.png',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: # 等待按ESC键退出
cv2.destroyAllWindows()
elif k == ord('s'): # 等待按's' 键保存并退出
cv2.imwrite('D:/python_opencv/images/lena.jpg',img)
cv2.destroyAllWindows()/<code>

图像显示如下:

OpenCV-Python教程001——图像的读取、显示和保存

需要说明的是,如果使用64位计算机,则必须按如下方式修改k=cv2.waitKey(0)行:k=cv2.waitKey(0)&0xFF. 这样能够保证获得8位的ASCII码。

需要说明的是,OpenCV加载的彩色图像处于BGR模式。如果您要使用其它方式如Matplotlib显示图像,需要将其转换为RGB模式。否则使用OpenCV读取的彩色图像将无法在Matplotlib中正确显示。我们将在后续内容中介绍颜色空间转换的方法。


分享到:


相關文章: