6个案例手把手教你用Python和OpenCV进行图像处理

开发 后端
图像是由若干个像素组成的,因此,图像处理可以看作计算机对像素的处理。在面向Python的OpenCV中,可以通过位置索引的方式对图像内的像素进行访问和处理。

 

01 图像的读取、显示和保存

OpenCV提供了cv2模块,用于进行图像的处理操作。

1. 读取图像

OpenCV提供了cv2.imread()函数用于进行图像的读取操作。该函数的基本格式为: 

  1. retval = cv2.imread(filename[, flags]) 

其中:

  •  retval是返回值,其值是读取到的图像。
  •  filename是要读取图像的完整文件名。
  •  flags是读取标记,用来控制读取文件的类型。部分常用的标记值如表3-1所示,其中第一列的值与第三列的数值表示的含义一致。

▲表3-1 常用flags标记值

  •  例3-1 使用cv2.imread()函数读取一幅图像

代码如下: 

  1. import cv2 as cv  
  2. image = cv2.imread("F:/picture/lena.png")      # 读取lena图像  
  3. print(image) 

运行代码会得到lena图像的像素值,如图3-3所示。

▲图3-3 lena图像部分像素值

2. 显示图像

OpenCV提供了多个与图像显示有关的函数,下面简单介绍常用的几个。

namedWindow()函数用来创建指定的窗口,一般格式如下: 

  1. None = cv2.namedWindow(window) 

其中,window是窗口的名字。例如: 

  1. cv2.namedWindow("image") 

这句程序会新建一个名字为image的窗口。

imshow()函数用来显示图像,其一般格式如下:

  1. None = cv2.imshow(window, image) 

其中:

  •  window是窗口的名字。
  •  image是要显示的图像。

waitKey()函数用来等待按键,当有键被按下时,该语句会被执行。其一般格式如下: 

  1. retvalcv2.waitKey([delay]) 

其中:

  •  retval是返回值。
  •  delay表示等待键盘触发的时间,单位是ms。当该值为负数或0时表示无限等待,默认值为0。

destroyAllWindows函数用来释放所有窗口,其一般格式为: 

  1. None = cv2. destroyAllWindows () 
  •  例3-2 显示读取的图像

代码如下: 

  1. import cv2 as cv               # 导入从cv2模块  
  2. image = cv.imread("F:/picture/lena.png")     # 读取lena图像  
  3. cv.namedWindow("image")     # 创建一个image的窗口  
  4. cv.imshow("image", image)    # 显示图像  
  5. cv.waitKey()               # 默认为0,无限等待  
  6. cv.destroyAllWindows()      # 释放所有窗口 

程序运行结果如图3-4所示。

▲图3-4 例3-2的运行结果

3. 保存图像

OpenCV中提供了cv2.imwrite()函数来保存图像,其一般格式为: 

  1. retvalcv2.imwrite(filename, img[, params]) 

其中:

  •  retval是返回值。
  •  filename是要保存的图像的完整路径名,包括文件的扩展名。
  •  img是要保存的图像的名字。
  •  params是保存的类型参数,可选。
  •  例3-3 编写程序,将读取到的图像保存

代码如下: 

  1. import cv2 as cv               # 导入从cv2模块  
  2. image = cv.imread("F:/picture/lena.png")     # 读取lena图像  
  3. cv.imwrite("F:/picture/lenaresult.png",image) #将图像保存到F:/picture/下,名字为lenaresult 

02 图像通道的基本操作

在图像处理过程中,有时会根据需要对通道进行拆分与合并。在OpenCV中提供了split()和merge()函数对图像进行拆分与合并。下面对这两个函数进行介绍。

1. split()拆分函数

函数split()可以拆分图像的通道,例如BGR图像的三个通道。其一般格式如下: 

  1. b,g,r = cv2.split(img) 

其中:

  •  b、g、r分别是B通道、G通道、R通道的图像信息。
  •  img是要拆分的图像。
  •  例3-4 编写程序,使用split()函数对图像进行拆分

代码如下: 

  1. import cv2 as cv  
  2. image = cv.imread("F:/picture/lena.png")  
  3. b,g,r = cv.split(image)          # 拆分图像通道分为b,g,r三个通道  
  4. cv.imshow("b",b)             # 显示b通道的图像信息  
  5. cv.imshow("g",g)    # 显示g通道的图像信息  
  6. cv.imshow("r",r)    # 显示r通道的图像信息  
  7. cv.imshow("image", image)  
  8. cv.waitKey()  
  9. 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()函数来实现图像通道的合并,其基本格式为: 

  1. imagebgr = cv2.merge([b,g,r]) 

其中:

  •  imagebgr是合并后的图像。
  •  b、g、r分别是B通道、G通道、R通道的图像信息。
  •  例3-5 编写程序,演示合并图像的过程

代码如下: 

  1. import cv2 as cv  
  2. image = cv.imread("F:/picture/lena.png")  
  3. b,g,r = cv.split(image)          # 拆分图像通道分为b,g,r三个通道  
  4. imagebgr = cv.merge([b,g,r])    # 将b,g,r三个通道的图像合并  
  5. cv.imshow("image", image)  
  6. cv.imshow("imagegbgr", imagebgr)  
  7. cv.waitKey() 
  8. cv.destroyAllWindows() 

程序运行结果如图3-6所示。

▲图3-6 例3-5的运行结果:a)原始图像 b)拆分并合并后的图像

其中,图3-6a是原始图像,图3-6b是经过拆分后又合并的图像。

03 图像属性的获取

在进行图像处理时经常需要获取图像的大小、类型等属性信息。下面介绍几个常用属性。

  •  shape:表示图像的大小。如果是彩色图像,则返回包含行数、列数和通道数的数组;如果是二值图像或灰度图像,则返回包含行数和列数的数组。
  •  size:表示返回的图像的像素数目。
  •  dtype:表示返回的图像的数据类型。
  •  例3-6 编写程序,观察图像的属性值

代码如下: 

  1. import cv2 as cv  
  2. image = cv.imread("F:/picture/lena.png")  
  3. print("image.shape",image.shape)        # 输出图像的大小属性  
  4. print("image.size",image.size)          # 输出图像的像素数目属性  
  5. print("image.dtype",image.dtype)        # 输出图像的类型属性 

程序运行结果为: 

  1. image.shape (512, 512, 3)  
  2. image.size 786432  
  3. image.dtype uint8 

关于作者:高敬鹏,博士学历,硕士生导师,2002年至今,任职于哈尔滨工程大学信息与通信工程学院。研究方向主要包括人工智能、机器学习、图像处理、信号检测、目标识别、现代通信技术与电子系统等。

江志烨,博士学历,研究员,任职于北京航天长征飞行器研究所。

赵娜,博士学历,讲师,任职于重庆电子工程职业学院。

本文摘编自《机器学习:基于OpenCV和Python的智能图像处理》,经出版方授权发布。 

 

责任编辑:庞桂玉 来源: 大数据DT
相关推荐

2021-02-06 14:55:05

大数据pandas数据分析

2021-08-09 13:31:25

PythonExcel代码

2021-05-17 21:30:06

Python求均值中值

2021-02-10 09:34:40

Python文件的压缩PyCharm

2022-10-19 14:30:59

2020-11-08 14:13:31

Python帕累托分析开发

2020-05-26 10:20:56

Python开发工具

2021-02-02 13:31:35

Pycharm系统技巧Python

2021-12-11 20:20:19

Python算法线性

2022-08-04 10:39:23

Jenkins集成CD

2021-01-27 21:55:13

代码参数值ECharts

2021-05-10 06:48:11

Python腾讯招聘

2009-04-22 09:17:19

LINQSQL基础

2020-12-17 09:40:01

Matplotlib数据可视化命令

2012-01-11 13:40:35

移动应用云服务

2020-03-08 22:06:16

Python数据IP

2021-08-02 23:15:20

Pandas数据采集

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2020-05-09 09:59:52

Python数据土星
点赞
收藏

51CTO技术栈公众号