01读取、显示和保存图像OpenCV提供了cv2模块进行图像处理操作。1、读取图像OpenCV提供了cv2.imread()函数来读取图像。该函数的基本格式为:retval=cv2.imread(filename[,flags])其中:retval为返回值,其值为读取的图像。filename是要读取的图像的完整文件名。flags是一个读取标志,用来控制读取文件的类型。一些常用的标签值如表3-1所示,其中第一列的值与第三列的值含义相同。▲表3-1常用flags标签取值示例3-1使用cv2.imread()函数读取一张图片代码如下:importcv2ascvimage=cv2.imread("F:/picture/lena.png")#读取lena图像print(image)运行代码得到lena图像的像素值,如图3-3所示。▲图3-3lena图像的像素值2.显示图像OpenCV提供了几个与图像显示相关的函数。下面简单介绍一些常用的功能。namedWindow()函数用于创建指定窗口。一般格式如下:None=cv2.namedWindow(window)其中window是窗口的名称。例如:cv2.namedWindow("image")将创建一个名为image的新窗口。imshow()函数用于显示图像,其一般格式如下:None=cv2.imshow(window,image)其中:window为窗口名称。图像是要显示的图像。waitKey()函数用于等待一个键。当按下一个键时,语句将被执行。其一般格式如下:retval=cv2.waitKey([delay])其中:retval为返回值。delay表示等待键盘触发的时间,单位是ms。当值为负数或0时,表示无限等待,默认为0。destroyAllWindows函数用于释放所有窗口,一般格式为:None=cv2.destroyAllWindows()例3-2显示读取图像代码如下:importcv2ascv#importfromcv2moduleimage=cv.imread("F:/picture/lena.png")#读取lena图像cv.namedWindow("image")#创建图像窗口cv.imshow("image",image)#显示图像cv.waitKey()#默认为0,等待cvinfinitely.destroyAllWindows()#释放所有窗口程序运行结果如图3-4所示。▲图3-4例3-2运行结果3.保存图片OpenCV提供了cv2.imwrite()函数来保存图片,一般格式为:retval=cv2.imwrite(filename,img[,params])其中:retval是返回值。filename是要保存的图像的完整路径名,包括文件的扩展名。img是要保存的图像的名称。params是保存的类型参数,可选。例3-3编写程序保存读取的图像如下:importcv2ascv#importfromcv2moduleimage=cv.imread("F:/picture/lena.png")#readlenaimagecv.imwrite("F:/picture/lenaresult.png",image)#将图像保存到F:/picture/,名称为lenaresult02图像通道的基本操作在图像处理过程中,有时会根据需要对通道进行拆分和合并。OpenCV中提供了split()和merge()函数来分割和合并图像。下面分别介绍这两个功能。1.split()拆分函数split()函数可以拆分图像的通道,例如BGR图像的三个通道。其一般格式如下:b,g,r=cv2.split(img)其中:b,g,r分别为通道B、通道G、通道R的图像信息。img是要拆分的图像。示例3-4编写程序并使用split()函数分割图像。代码如下:importcv2ascvimage=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])其中:imagebgr为合并后的图像。b、g、r分别为B通道、G通道和R通道的图像信息。例3-5编写一个程序来演示合并图像的过程。代码如下:importcv2ascvimage=cv.imread("F:/picture/lena.png")b,g,r=cv.split(image)#Splitimagechannels对于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图像属性的获取在进行图像处理时,往往需要获取图像的尺寸、类型等属性信息。下面介绍几个常用的属性。shape:表示图像的大小。如果是彩色图像,则返回包含行数、列数和通道数的数组;如果是二值图像或灰度图像,则返回包含行数和列数的数组。size:表示返回图像的像素数。dtype:表示返回图像的数据类型。例3-6编写程序观察图像的属性值。代码如下:importcv2ascvimage=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.size786432image.dtypeuint8作者简介:高景鹏,博士,硕士生导师,2002年至今在哈尔滨工程大学信息与通信工程学院工作。研究方向主要包括人工智能、机器学习、图像处理、信号检测、目标识别、现代通信技术与电子系统等。姜志业,博士,研究员,就职于北京航天长征飞行器研究所。赵娜,博士,讲师,就职于重庆电子工程职业学院。本文节选自《机器学习:基于OpenCV和Python的智能图像处理》,经发布者授权发布。
