返回介绍

2.1 开始使用图像

发布于 2019-07-01 11:38:49 字数 3451 浏览 1190 评论 0 收藏 0

目标

  • 在这里,你将会学到如何加载一副图像,如何显示它,如何保存它
  • 你将会学到这些函数: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 显示它的时候会出现问题,阅读这个讨论来理解这个问题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文