目录
目标
使用OpenCV
显示图像
写入图像
总结使用
使用Matplotlib
注:图片后续补充
在这里,你将了解如何使用Python编程语言中的OpenCV库,实现读取、显示和保存图像的功能。具体来说,你将学习以下函数的用法:cv.imread() 用于读取图像,cv.imshow() 用于显示图像,cv.imwrite() 用于将图像保存到本地文件系统中。
如果你有兴趣,还可以学习如何使用Matplotlib库来显示图像,这也是一种常见的图像显示方式。
在使用OpenCV库读取图像时,需要使用cv.imread()函数。读取图像时,需要提供图像文件的路径或文件名,函数将返回一个图像对象。
除此之外,cv.imread()函数还可以接收一个额外的参数,用于指定图像的读取方式。具体来说,可以使用以下三个标志:
此外,还可以传递整数1、0或-1来表示这三个标志。
下面是使用cv.imread()函数读取图像的示例代码:
import numpy as np
import cv2 as cv
#加载彩色灰度图像
img = cv.imread('messi5.jpg', 0)
在这里:0代表读取灰度图像,即将彩色图像转换为灰度图像
另外:
- cv.IMREAD_COLOR 或 1:读取彩色图像,忽略 alpha 通道,相当于使用默认值 1。
- cv.IMREAD_GRAYSCALE 或 0:读取灰度图像。
- cv.IMREAD_UNCHANGED 或 -1:读取原始图像,包括 alpha 通道(如果有)。
下面为效果图(没有报错代表读取成功):
警告
如果在使用OpenCV库读取图像时,提供的图像路径错误,不会引发任何错误,但是打印读取的图像对象时将返回None。换句话说,即使图像路径错误,程序也不会崩溃或抛出异常,而是返回一个空对象。
因此,为了确保程序能够正确读取图像,建议在提供图像路径之前,先检查路径是否正确,以避免意外的错误。
使用函数**cv.imshow()**可以在窗口中显示图像。该函数会自动根据图像尺寸调整窗口大小。
在调用**cv.imshow()**函数时,第一个参数是窗口名称,是一个字符串类型的值。第二个参数是要显示的图像对象。你可以创建多个窗口,并指定不同的窗口名称,以显示多个图像。
import cv2 as cv
#加载彩色灰度图像
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
窗口的屏幕截图如下所示:
在使用OpenCV库显示图像时,我们需要使用函数cv.imshow()。该函数需要一个窗口名称作为第一个参数,并需要传递要显示的图像作为第二个参数。调用该函数后,可以使用**cv.waitKey()**函数等待用户交互事件。
cv.waitKey()函数是一个键盘绑定函数,它等待指定毫秒数的时间,等待用户按下任何键或交互事件发生。
如果时间到期时仍未发生交互事件,则程序将继续执行。如果将0作为参数传递,则程序将无限等待用户交互事件。该函数还可以用于检测特定按键的按下事件,例如按下键盘上的字母a。需要注意的是,为了确保图像能够正确显示,必须在显示图像后使用cv.waitKey()**函数。
cv.destroyAllWindows()函数可以用于销毁我们创建的所有窗口,而cv.destroyWindow()函数可以销毁特定的窗口。
需要注意的是,在某些情况下,可以在创建一个空的窗口之后再将图像加载到该窗口中。这时,可以使用cv.namedWindow()**函数来设置窗口的属性,例如是否可以调整窗口大小。如果需要显示的图像尺寸过大或需要在窗口中添加跟踪栏时,可以使用该函数来设置窗口大小。
下面是使用OpenCV库显示图像的示例代码:
cv.namedWindow('image',cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
效果图
在使用OpenCV库保存图像时,需要使用函数cv.imwrite()。该函数需要两个参数:第一个参数是要保存的文件名,第二个参数是要保存的图像对象。
具体来说,你可以像这样调用cv.imwrite()函数:cv.imwrite('messigray.png',img)。这将会把图像以PNG格式保存在工作目录中,文件名为'messigray.png'。
需要注意的是,cv.imwrite()函数可以保存多种不同格式的图像,例如PNG、JPEG、BMP等。在调用该函数时,需要根据需要指定要保存的图像格式,即文件扩展名。
下面的代码演示了如何使用OpenCV库加载、显示和保存图像。具体来说,它加载一张灰度图像,将其显示在屏幕上,等待用户按下键盘按键。如果用户按下's'键,则程序将保存图像到本地,并退出;如果用户按下'ESC'键,则程序将直接退出而不保存图像。
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # 等待ESC退出
cv.destroyAllWindows()
elif k == ord('s'): # 等待关键字,保存和退出
cv.imwrite('messigray.png',img)
cv.destroyAllWindows()
警告
如果使用的是64位计算机,则必须k = cv.waitKey(0)按如下所示修改行:k = cv.waitKey(0) & 0xFF。
这是因为在64位计算机上,**cv.waitKey()**函数返回一个64位整数,但是ASCII码值只有8位。因此,将返回值与0xFF(即255)进行按位与运算,可以保留返回值的低8位,这是ASCII码的有效范围。
这种修改可以确保在64位计算机上正确读取键盘输入,并避免潜在的兼容性问题。
Matplotlib是一款Python的绘图库,可以提供多种绘图方法,方便进行数据可视化和图像处理。在接下来的学习中,你将学习到如何使用Matplotlib库来展示和处理图像。通过Matplotlib,你可以方便地对图像进行缩放、保存等操作。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值
plt.show()
窗口的屏幕截图如下所示:
另外,有空可看看:
Matplotlib提供了许多绘图选项,可以根据需求进行图像的处理和展示。如果需要了解更多的绘图选项,可以参考Matplotlib文档以获取更多详细信息,其中会涵盖许多实用的技巧和方法。
需要注意的是:
当使用OpenCV加载彩色图像时,它处于BGR模式,而Matplotlib以RGB模式显示图像。因此,如果使用OpenCV加载彩色图像,那么在Matplotlib中将无法正确显示彩色图像。如果遇到这种情况,可以采用一些转换方法来将图像从BGR模式转换为RGB模式,以便正确地在Matplotlib中显示彩色图像。关于这个问题,我们将在接下来的练习中进行更详细的讨论。