图像入门

目标

在本次会议中:

  • 在这里,你将学习如何读取图像、如何显示图像以及如何将其保存起来
  • 你要学习这些函数:cv.imread()cv.imshow()cv.imwrite()
  • 您还可以选择学习如何使用 Matplotlib 显示图像。

使用 OpenCV

读取图像

使用 cv.imread() 函数读取一张图像,图片应该在工作目录中,或者应该提供完整的图像路径。

第二个参数是一个 flag,指定了应该读取图像的方式

Note

  • 你可以简单地分别传递整数 1、0 或-1,而不是这三个 flag。

看下面的代码

  1. import numpy as np
  2. import cv2 as cv
  3. # 用灰度模式加载图像
  4. img = cv.imread('messi5.jpg', 0)

注意

即使图像路径错误,它也不会抛出任何错误,但是打印 img会给你None

显示图像

cv.imshow() 函数在窗口中显示图像,窗口自动适应图像的大小。

第一个参数是窗口名,它是一个字符串,第二个参数就是我们的图像。你可以根据需要创建任意数量的窗口,但是窗口名字要不同。

  1. cv.imshow('image', img)
  2. cv.waitKey(0)
  3. cv.destroyAllWindows()

一个窗口的截图可能看起来像这样 (in Fedora-Gnome machine): 图片

cv.waitKey() 是一个键盘绑定函数,它的参数是以毫秒为单位的时间。该函数为任意键盘事件等待指定毫秒。如果你在这段时间内按下任意键,程序将继续。如果传的是 0,它会一直等待键盘按下。它也可以设置检测特定的击键,例如,按下键 a 等,我们将在下面讨论。

Note

  • 除了绑定键盘事件,该函数还会处理许多其他 GUI 事件,因此你必须用它来实际显示图像。

cv.destroyAllWindows() 简单的销毁我们创建的所有窗口。如果你想销毁任意指定窗口,应该使用函数 cv.destroyWindow() 参数是确切的窗口名。

Note

有一种特殊情况,你可以先创建一个窗口然后加载图像到该窗口。在这种情况下,你能指定窗口是否可调整大小。它是由这个函数完成的 cv.namedWindow()。默认情况下,flag 是 cv.WINDOW_AUTOSIZE。但如果你指定了 flag 为 cv.WINDOW_NORMAL,你能调整窗口大小。当图像尺寸太大,在窗口中添加跟踪条是很有用的。

看下面的代码:

  1. cv.namedWindow('image', cv.WINDOW_NORMAL)
  2. cv.imshow('image',img)
  3. cv.waitKey(0)
  4. cv.destroyAllWindows()

保存图像

保存图像,用这个函数 cv.imwrite()

第一个参数是文件名,第二个参数是你要保存的图像。

  1. cv.imwrite('messigray.png',img)

将该图像用 PNG 格式保存在工作目录。

总结一下

下面的程序以灰度模式读取图像,显示图像,如果你按下 ‘s‘ 会保存和退出图像,或者按下 ESC 退出不保存。

  1. import numpy as np
  2. import cv2 as cv
  3. img = cv.imread('messi5.jpg',0)
  4. cv.imshow('image',img)
  5. k = cv.waitKey(0)
  6. if k == 27: # ESC 退出
  7. cv.destroyAllWindows()
  8. elif k == ord('s'): # 's' 保存退出
  9. cv.imwrite('messigray.png',img)
  10. cv.destroyAllWindows()

注意

如果你使用的是 64 位机器,你需要修改k = cv.waitKey(0)像这样:k = cv.waitKey(0) & 0xFF

使用 Matplotlib

Matplotlib 是一个 Python 的绘图库,提供了丰富多样的绘图函数。你将在接下来的文章中看到它们。在这里,你将学习如何使用 Matplotlib 来显示图像。你还能用 Matplotlib 缩放图像,保存图像等。

  1. import numpy as np
  2. import cv2 as cv
  3. from matplotlib import pyplot as plt
  4. img = cv.imread('messi5.jpg',0)
  5. plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
  6. plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
  7. plt.show()

窗口的屏幕截图是这样的: 图片

参考

Matplotlib 提供了大量的绘图选项。有关更多详情信息,请参阅 Matplotlib 文档。有一些,我们用这种方式将会知道。

注意

彩色图像 OpenCV 用的 BGR 模式,但是 Matplotlib 显示用的 RGB 模式。因此如果图像用 OpenCV 加载,则 Matplotlib 中彩色图像将无法正常显示。更多细节请看练习。

其他资源

  1. Matplotlib Plotting Styles and Features

练习

  1. 当你尝试用 OpenCV 加载图像并用 Matplotlib 来显示,就会出现一些问题。阅读这篇 讨论 并理解它。