learningCV 2020-08-25
01 图像的读取、显示和保存
OpenCV提供了cv2模块,用于进行图像的处理操作。
1. 读取图像
OpenCV提供了cv2.imread()函数用于进行图像的读取操作。该函数的基本格式为:
retval = cv2.imread(filename[, flags])
其中:
▲表3-1 常用flags标记值
代码如下:
import cv2 as cv image = cv2.imread("F:/picture/lena.png") # 读取lena图像 print(image)
运行代码会得到lena图像的像素值,如图3-3所示。
▲图3-3 lena图像部分像素值
2. 显示图像
OpenCV提供了多个与图像显示有关的函数,下面简单介绍常用的几个。
namedWindow()函数用来创建指定的窗口,一般格式如下:
None = cv2.namedWindow(window)
其中,window是窗口的名字。例如:
cv2.namedWindow("image")
这句程序会新建一个名字为image的窗口。
imshow()函数用来显示图像,其一般格式如下:
None = cv2.imshow(window, image)
其中:
waitKey()函数用来等待按键,当有键被按下时,该语句会被执行。其一般格式如下:
retval= cv2.waitKey([delay])
其中:
destroyAllWindows函数用来释放所有窗口,其一般格式为:
None = cv2. destroyAllWindows ()
代码如下:
import cv2 as cv # 导入从cv2模块 image = cv.imread("F:/picture/lena.png") # 读取lena图像 cv.namedWindow("image") # 创建一个image的窗口 cv.imshow("image", image) # 显示图像 cv.waitKey() # 默认为0,无限等待 cv.destroyAllWindows() # 释放所有窗口
程序运行结果如图3-4所示。
▲图3-4 例3-2的运行结果
3. 保存图像
OpenCV中提供了cv2.imwrite()函数来保存图像,其一般格式为:
retval= cv2.imwrite(filename, img[, params])
其中:
代码如下:
import cv2 as cv # 导入从cv2模块 image = cv.imread("F:/picture/lena.png") # 读取lena图像 cv.imwrite("F:/picture/lenaresult.png",image) #将图像保存到F:/picture/下,名字为lenaresult
02 图像通道的基本操作
在图像处理过程中,有时会根据需要对通道进行拆分与合并。在OpenCV中提供了split()和merge()函数对图像进行拆分与合并。下面对这两个函数进行介绍。
1. split()拆分函数
函数split()可以拆分图像的通道,例如BGR图像的三个通道。其一般格式如下:
b,g,r = cv2.split(img)
其中:
代码如下:
import cv2 as cv image = cv.imread("F:/picture/lena.png") b,g,r = cv.split(image) # 拆分图像通道分为b,g,r三个通道 cv.imshow("b",b) # 显示b通道的图像信息 cv.imshow("g",g) # 显示g通道的图像信息 cv.imshow("r",r) # 显示r通道的图像信息 cv.imshow("image", image) cv.waitKey() cv.destroyAllWindows()
程序运行结果如图3-5所示。
▲图3-5 例3-4的运行结果:a)原始图像,b)B通道图像,c)G通道图像,d)R通道图像
其中,图3-5a是原图,图3-5b是B通道的图像,图3-5c是G通道的图像,图3-5d是R通道的图像。
2. merge()合并函数
通道合并是通道拆分的逆过程,可以将三个通道的灰度图像合并为一张彩色图像。OpenCV中提供了merge()函数来实现图像通道的合并,其基本格式为:
imagebgr = cv2.merge([b,g,r])
其中:
代码如下:
import cv2 as cv image = cv.imread("F:/picture/lena.png") b,g,r = cv.split(image) # 拆分图像通道分为b,g,r三个通道 imagebgr = cv.merge([b,g,r]) # 将b,g,r三个通道的图像合并 cv.imshow("image", image) cv.imshow("imagegbgr", imagebgr) cv.waitKey() cv.destroyAllWindows()
程序运行结果如图3-6所示。
▲图3-6 例3-5的运行结果:a)原始图像 b)拆分并合并后的图像
其中,图3-6a是原始图像,图3-6b是经过拆分后又合并的图像。
03 图像属性的获取
在进行图像处理时经常需要获取图像的大小、类型等属性信息。下面介绍几个常用属性。
代码如下:
import cv2 as cv image = cv.imread("F:/picture/lena.png") print("image.shape",image.shape) # 输出图像的大小属性 print("image.size",image.size) # 输出图像的像素数目属性 print("image.dtype",image.dtype) # 输出图像的类型属性
程序运行结果为:
image.shape (512, 512, 3) image.size 786432 image.dtype uint8
关于作者:高敬鹏,博士学历,硕士生导师,2002年至今,任职于哈尔滨工程大学信息与通信工程学院。研究方向主要包括人工智能、机器学习、图像处理、信号检测、目标识别、现代通信技术与电子系统等。
江志烨,博士学历,研究员,任职于北京航天长征飞行器研究所。