当前位置: 首页 > 文档资料 > OpenCV 中文文档 >

2.1 开始使用图像

优质
小牛编辑
126浏览
2023-12-01

目标

  • 在这里,你将会学到如何加载一副图像,如何显示它,如何保存它
  • 你将会学到这些函数:cv2.imread()cv2.imshow()cv2.imwrite()
  • 可选的,你会学到如何使用Matplotlib显示图像

使用OpenCV

读取一幅图像

使用 cv2.imread() 来读取一副图像。图像应该在工作目录下,否则就需要输入图像的完整目录。

使用Unix-based操作系统的同学请注意,在 OpenCV 中输入图像路径时 ~ 并不能用来指代家目录!

第二个参数是标记了应该以何种方式来读取图像的一个标志。

  • cv2.IMREAD_COLOR:读取一副有颜色的图片。图片的任何透明度都将被忽略,这是默认的标志。
  • cv2.IMREAD_GRAYSCALE:图片会以灰度格式被读入。
  • cv2.IMREAD_UNCHANGED:按照图片本身的颜色设置读入,包含alpha通道。

如果你觉得这三个标志太长了,你可以简单地传入1、0或是-1。

看下面的代码:

import numpy as np
import cv2
# 读一幅灰度格式的图像
img = cv2.imread('messi5.jpg',0)

警告

即使图片路径错误,imread 函数也不会抛出任何错误,但是 print img 将会输出 None

显示一幅图片

使用函数 cv2.imshow() 来在一个窗口中显示一幅图片。窗口会自动适应图片的大小。

第一个参数是窗口的名字(字符串)。第二个参数是我们的图片。你可以创建任意数量的窗口,但必须要给他们不同的窗口名字。

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.waitKey() 是一个键盘操作函数。它的参数是以毫秒为单位的时间值。这个函数在一段时间(指定的毫秒数)内等待键盘被按下,如果你在这段时间内按下了任何按键,程序将会继续执行。如果传入 $0$,它将会一直等待一个键被按下。它也能用来拦截特定按键被按下的事件等等,我们会在下面说到这一点。

除了绑定键盘事件外这个函数还要处理很多其他GUI事件,所以你必须使用它来“真正地”显示出图片。

cv2.destroyAllWindows() 简单地销毁你创建的所有窗口。如果你希望销毁特定的某一个窗口,你需要使用 cv2.destroyWindow(),这个函数接受窗口的名字作为参数。

有一种特别的情况,就是你要先创建一个窗口然后再在稍后为其加载图片。在这种情况下,你可以声明这个窗口是否可以改变大小。这是通过函数 cv2.namedWindow() 来完成的。默认情况下,这个标志是 cv2.WINDOW_AUTOSIZE。但你如果你使用 cv2.WINDOW_NORMAL,你就可以手动改变窗口的大小。这对于尺寸太大的图片和创建滑块控制条很有帮助。

看下面的代码:

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

写入一幅图片

使用函数 cv2.imwrite() 来保存一幅图片。

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

cv2.imwrite('messigray.png',img)

者将会把 png 格式的图片保存到工作目录下。

把它们结合起来

下面的代码读取灰度格式的图片,显示它,如果你按下 s 键,则保存并退出,如果你按下ESC键则只退出不保存。

import numpy as np
import cv2

img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # 按下ESC键,直接退出
    cv2.destroyAllWindows()
elif k == ord('s'): # 按下's'键,保存并退出
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

警告

如果你在使用64位机,你需要把 k = cv2.waitKey(0) 改成:k = cv2.waitKey(0) & 0xFF

使用 Matplotlib

Matplotlib 是一个 Python 绘图库,它给予了你很多种不同的绘图方式。你将在下面的文章中看到它们。在这里,你会学到如何使用 Matplotlib 显示图片。你可以使用 Matplotlib 缩放图片、保存它等等。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.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 中并不会正确地显示。请看练习部分来获取更多相关细节。

更多资源

Matplotlib绘图样式和特性

练习

当你试着用 OpenCV 读取有颜色的图片,然后用 Matplotlib 显示它的时候会出现问题,阅读这个讨论来理解这个问题。