⚠️这个系列是自己瞎翻的,文法很丑,跳着跳着捡重要的部分翻,翻错了不负责,就这样。
⚠️基于3.4.3,Getting Started with Images,附原文。
目标
- 在此,你会学到如何读取一个图像,如何显示它,如何再把它保存回来。
- 你会学到这些方法 : cv.imread(), cv.imshow() , cv.imwrite()
- 顺带,你会学到如何用Matplotlib显示图像
使用OpenCV
读取图像
使用方法 cv.imread() 来读取图像。图像应该被放在工作路径之下或者给出完整的路径地址。
第二个参数是一个用于表示读取图像的独特方式的标识。
- cv.IMREAD_COLOR : 加载彩图。图像的任何透明度都会被忽略。这是默认的标识。
- cv.IMREAD_GRAYSCALE : 用灰度模式加载图像
- cv.IMREAD_UNCHANGED : 用包含alpha通道的模式加载图像
提示
你可以分别简单的传入1,0 或者 -1来代替这三个标识。
看下面的代码:
import numpy as np
import cv2 as cv
# 加载一张灰度图像
img = cv.imread('messi5.jpg',0)
警告
即使图像地址有误,它也不会抛出任何异常,但 print img
会给你 None
显示图像
使用方法 cv.imshow() 来在一个窗口中显示图像。窗口会自动适配图像的大小。
第一个参数是窗口名称的字符串。第二个参数是我们的图像对象。你可以如你所愿的创建很多窗口,只要窗口名称不重复。
cv.imshow('image',img)
cv.waitKey(0)
窗口的快照大概长这样(在 Fedora-Gnome 机器上):
cv.waitKey() 是一个键盘绑定方法。它的参数是一个毫秒为单位的时间。这个方法会为任何键盘事件等待一个特定的毫秒数。如果你在那段时间内按下了任意键,程序就会继续运行。如果参数传的是0,它就会为了一次键盘敲击无限等待下去。它也能被设置成检测特定的键盘敲击,比如,如果A键被按下等等,这些我们往后再讨论。
提示
除了绑定键盘事件,这个方法也处理其他的GUI(用户图形界面)事件,所以你若真想展示出图像来,就必须用它。
cv.destroyAllWindows() 简单的销毁所有我们创建的窗口。如果你想要销毁一个特定的窗口, 使用fa cv.destroyWindow()且把窗口名称当作参数传入。
提示
有这样一种特殊情况,你已经创建了一个窗口并且在过后才加载图像。这种情况下,你可以指定窗口是否要重新设定大小。它会被 cv.namedWindow() 这个方法来完成。默认的标识是 cv.WINDOW_AUTOSIZE。但如果你把标识指定为 cv.WINDOW_NORMAL,你就可以重新设定窗口大小。这在图像的像素维度非常大,并且在窗口上添加了滚动条的时候非常有帮助。
看下面的代码:
cv.namedWindow('image', cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
保存图像
用方法 cv.imwrite() 来保存一张图像。
第一个参数是文件名,第二个参数是你想要保存的文件对象。
cv.imwrite('messigray.png',img)
这段代码会以PNG格式保存图像在你的当前工作目录下。
把之前所学汇总起来
下面的程序以灰度模式加载一张图像,显示它,如果你按下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键退出
elif k == ord('s'): # 等你按s键就保存再退出
cv.imwrite('messigray.png',img)
警告
如果你使用的是一台64位的机器,你必须把 k = cv.waitKey(0)
这一行改成这样: k = cv.waitKey(0) & 0xFF
使用 Matplotlib
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([]) # to hide tick values on X and Y axis
plt.show()
一个窗口的快照大概长这样:
参阅
Matplotlib里可以使用大量的测绘选项。请参阅Matplotlib的文档来了解更多细节。我们在学习道路上也会遇到一些。Plenty of plotting options are available in Matplotlib. Please refer to Matplotlib docs for more details. Some, we will see on the way.
警告
OpenCV加载彩图用的是BGR(蓝绿红三色)模式。但Matplotlib显示使用的是RGB(红绿蓝三色)模式。所以彩图无法在Matplotlib里正常显示,如果这个图是用OpenCV读的的话。请看练习获取更多细节。
额外资源
练习
- 当你想用Matplotlib显示用OpenCV读到的彩图的话会遇到一些问题。读一下这个讨论并且了解它。