0|为什么选择OpenCV-Python

虽然python 很强大,而且也有自己的图像处理库PIL,但是相对于 OpenCV 来讲,它还是弱小很多。跟很多开源软件一样OpenCV 也提供了完善的python 接口,非常便于调用。OpenCV 的最新版是4.3,包含了超过2500 个算法和函数,几乎任何一个能想到的成熟算法都可以通过调用OpenCV 的函数来实现,超级方便。

目标

  • 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像
  • 你将要学习如下函数:cv2.imread(),cv2.imshow(),cv2.imwrite()
  • 如果你愿意的话,我会教你如何使用Matplotlib 显示一幅图片

1|图片





1.1 读入图像

使用函数cv2.imread() 读入图像。

这幅图像应该在此程序的工作路径,或者给函数提供完整路径

第二个参数是要告诉函数应该如何读取这幅图片。

  • cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略。这是默认参数。
  • cv2.IMREAD_GRAYSCALE:以灰度模式读入图像

1.2 显示图像

cv2.imshow(): 显示图像,窗口会自动调整为图像大小

第一个参数是窗口的名字,其次才是我们的图像。

你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。

cv2.waitKey():是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为-1,如果我们设置这个函数的参数为0,那它将会无限期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键a 是否被按下,这个后面我们会接着讨论。

cv2.destroyAllWindows():可以轻易删除任何我们建立的窗口。

如果你想删除特定的窗口可以使用cv2.destroyWindow(),在括号内输入你想删除的窗口名。

建议:一种特殊的情况是,你也可以先创建一个窗口,之后再加载图像。这种情况下,你可以决定窗口是否可以调整大小。使用到的函数是cv2.namedWindow()。

初始设定函数标签是cv2.WINDOW_AUTOSIZE。

但是如果你把标签改成cv2.WINDOW_NORMAL,

你就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用。

#导入响应的支持库import cv2 as cv#读取图片src = cv.imread("D:/Programs/PyCharm_Code/openCV/code_001/test_img.jpg")#设置显示的窗口,及其响应格式cv.namedWindow("input", cv.WINDOW_AUTOSIZE) #窗口设置为自适应大小#显示cv.imshow("input", src)#显示等待0秒,即显示窗口(无时间限制)cv.waitKey(0)#销毁所有窗口cv.destroyAllWindows()


自适应显示图像


import numpy as np import cv2 as cvsrc1 = cv.imread("D:/Programs/PyCharm_Code/openCV/code_001/test_img.jpg")#设置显示的窗口,及其响应格式cv.namedWindow("input2", cv.WINDOW_NORMAL) #窗口设置为NORMAL#显示cv.imshow("input2", src1)#显示等待0秒,即显示窗口(无时间限制)cv.waitKey(0)#销毁所有窗口cv.destroyAllWindows()


图像拉伸显示


1.1.3 保存图像

cv2.imwrite():来保存一个图像。首先需要一个文件名,之后才是你要保存的图像。

1.1.4 总结一下

下面的程序将会加载一个灰度图,显示图片,按下‘s’键保存后退出,或者按下ESC键退出不保存。

import numpy as npimport cv2 as cvsrc2 = cv.imread('test_img.jpg',0) #此语句读取灰度图cv.imshow('image',src2)k = cv.waitKey(0)if k ==27:           # wait for ESC Key to exit    cv.destroyAllWindows()elif k == ord('s'):  #wait for 's' Key to save and exit    cv.imwrite('test000.png',src2)    cv.destroyAllWindows()警告:如果你用的是64 位系统,你需要将k = cv2.waitKey(0) 这行改成 k = cv2.waitKey(0)&0xFF。1.1.5 使用Matplotlib Matplotlib是python的一个绘图库,里头有各种的绘图方法。之后会陆续了解到。现在,你可以学习怎样用Matplotlib显示图像。你可以放大图像,保存它等等。代码如下:

警告:如果你用的是64 位系统,你需要将

k = cv2.waitKey(0) 这行改成 k = cv2.waitKey(0)&0xFF。

1.1.5 使用Matplotlib

Matplotlib是python的一个绘图库,里头有各种的绘图方法。之后会陆续了解到。现在,你可以学习怎样用Matplotlib显示图像。你可以放大图像,保存它等等。

代码如下:

from matplotlib import pyplot as pltplt.imshow(src)plt.xticks([]),plt.yticks([]) #隐藏Matplotlib中默认的坐标轴线plt.show()


matploylib中RGB模式读取图像


注意:彩色图像使用OpenCV 加载时是BGR 模式。但是Matplotib 是RGB模式。所以彩色图像如果已经被OpenCV 读取,那它将不会被Matplotib 正确显示。具体细节请看练习

解决办法:

法一:

src = cv.imread("D:/Programs/PyCharm_Code/openCV/code_001/test_img.jpg") #此语句读取原图像b,g,r = cv.split(src)img2 = cv.merge([r,g,b])from matplotlib import pyplot as pltplt.imshow(img2)plt.xticks([]),plt.yticks([])plt.show()

法二:

#读取图片src = cv.imread("D:/Programs/PyCharm_Code/openCV/code_001/test_img.jpg") #此语句读取原图像img2 = src[:,:,::-1]from matplotlib import pyplot as pltplt.imshow(img2)plt.xticks([]),plt.yticks([])plt.show()