图像处理的基本操作

发布时间 2023-12-15 21:31:17作者: freedragon

图像处理最基本的操作,包括读取图像、显示图像、保存图像、获取图像属性等。下面将依次讲解这4个内容。

1  读取图像

OpenCV提供了用于读取图像的imread()方法,其语法格式如下:

image = cv2.imread(filename, flags)

  

参数说明:

image:是imread()方法的返回值,返回的是读取到的图像。

filename:要读取的图像的完整文件名。例如,要读取当前项目目录下的1.1.jpg,filename的值为"1.1.jpg"(双引号是英文格式的)。

flags:读取图像颜色类型的标记。当flags的默认值为1时,表示读取的是彩色图像,此时的flags值可以省略;当flags的值为0时,表示读取的是灰度图像(如果读取的是彩色图像,也将转换为与彩色图像对应的灰度图像)

实例1  读取当前项目目录下的图像

PyCharm中的PythonDevelop项目下,有一幅名为1.1.jpg的图像,如图22所示。在ImageTest.py文件中,先使用imread()方法读取1.1.jpg,再使用print()方法打印1.1.jpg。代码如下:

import cv2

 

# 读取1.1.jpg,等价于image = cv2.imread("1.1.jpg",1)

image = cv2.imread("1.1.jpg")

print(image) # 打印1.1.jpg

  

上述代码打印的部分结果如图22所示。

       

22  PythonDevelop项目下的1.1.jpg

 

 图23  打印1.1.jpg

说明:图23输出的数字是1.1.jpg的部分像素值。有关像素和像素值的内容,将在本书的第2章进行讲解。

如果1.1.jpg在D盘的根目录下,应该如何使用imread()方法进行读取呢?只需将实例1第4行代码:

image = cv2.imread("1.1.jpg")

  

修改为如下代码:

image = cv2.imread("D:/1.1.jpg") # 路径中不能出现中文

  

注意:"D:/1.1.jpg"等价于"D:\\1.1.jpg"。

2  显示图像

相比图23中密密麻麻的数字,将图像显示出来,效果会更加直观。为此,OpenCV提供了imshow()方法、waitKey()方法和destroyAllWindows()方法。

1)imshow()方法用于显示图像,其语法格式如下:

cv2.imshow(winname, mat)

  

参数说明:

winname:显示图像的窗口名称。

mat:要显示的图像。

2)waitKey()方法用于等待用户按下键盘上按键的时间。当用户按下键盘上的任意按键时,将执行waitKey()方法,并且获取waitKey()方法的返回值。其语法格式如下:

retval = cv2.waitKey(delay)

  

参数说明:

retval:与被按下的按键相对应的ASCII码。例如,Esc键的ASCII码是27,当用户按下【Esc】键时,waitKey()方法的返回值是27。如果没有按键被按下,waitKey()方法的返回值是-1。

delay:等待用户按下键盘上按键的时间,单位为毫秒(ms)。当delay的值为负数、0或者为空时,表示无限等待用户按下键盘上按键的时间。

3)destroyAllWindows()方法用于销毁所有正在显示图像的窗口,其语法格式如下:

cv2.destroyAllWindows()

  

实例2  显示图像

编写一个程序,使用imread()方法、imshow()方法、waitKey()方法和destroyAllWindows()方法,读取并显示PythonDevelop项目下的1.1.jpg。代码如下:

import cv2

 

image = cv2.imread("1.1.jpg") # 读取1.1.jpg

cv2.imshow("flower", image) # 在名为flower的窗口中显示1.1.jpg

cv2.waitKey() # 按下任何键盘按键后

cv2.destroyAllWindows() # 销毁所有窗口

  

上述代码的运行结果如图24所示。

24  显示1.1.jpg

注意:(1)显示图像的窗口名称不能是中文(例如,把实例2第5行代码中的"flower"修改为"鲜花"),否则会出现如图25所示的乱码。

2)为了能够正常显示图像,要在cv2.imshow()之后紧跟着cv2.waitKey()。

25  窗口名称是中文时出现乱码

依据imread()方法的语法,如果把实例2第4行代码:

image = cv2.imread("1.1.jpg")

  

修改为如下代码:

image = cv2.imread("1.1.jpg", 0)

  

即可得到由1.1.jpg转换得到的灰度图像,如图26所示。

26  由1.1.jpg转换得到的灰度图像

如果想设置窗口显示图像的时间为5s,又该如何编写代码呢?只需将实例2第6行代码:

cv2.waitKey()

  

修改为如下代码:

cv2.waitKey(5000) # 1000ms为1s,5000ms为5s

 

3  保存图像

OpenCV提供了用于按照指定路径保存图像的imwrite()方法,其语法格式如下:

cv2.imwrite(filename, img)

参数说明:

filename:保存图像时所用的完整路径。

img:要保存的图像

实例3  保存图像

编写一个程序,把PythonDevelop项目下的1.1.jpg保存为E盘根目录下的、Pictures文件夹中的1.jpg。代码如下:

import cv2

image = cv2.imread("1.1.jpg") # 读取1.1.jpg

# 把1.1.jpg保存为E盘根目录下的、Pictures文件夹中的1.jpg

cv2.imwrite("E:/Pictures/1.jpg", image)

  

运行上述代码前,要确认E盘根目录下是否有Pictures文件夹。如果没有,要在E盘根目录下新建一个空的Pictures文件夹。运行上述代码后,打开E盘根目录下的Pictures文件夹,即可看到1.jpg,如图27所示。

27  E盘根目录下的、Pictures文件夹中的1.jpg

4  获取图像属性

处理图像的过程中,经常需要获取图像的大小、类型等图像属性。为此,OpenCV提供了shape、size和dtype这3个常用属性。这3个常用属性的具体含义分别如下:

shape:如果是彩色图像,那么获取的是一个包含图像的水平像素、垂直像素、通道数的数组,即(垂直像素、水平像素、通道数);如果是灰度图像,那么获取的是一个包含图像的水平像素、垂直像素的数组,即(垂直像素,水平像素)。

说明:垂直像素指的是垂直方向上的像素,水平像素指的是水平方向上的像素。有关像素、灰度图像和通道的内容,将在本书的第2章进行讲解。

size:获取的是图像包含的像素个数,其值为“水平像素 × 垂直像素 × 通道数”。(灰度图像的通道数为1)

dtype:获取的是图像的数据类型。

实例4  分别获取彩色图像和灰度图像的属性

编写一个程序,先获取PythonDevelop项目下的1.1.jpg的属性,再获取由1.1.jpg转换得到的灰度图像的属性。代码如下:

 import cv2

 

image_Color = cv2.imread("1.1.jpg") # 读取1.1.jpg

print("获取彩色图像的属性:")

print("shape =", image_Color.shape) # 打印彩色图像的(垂直像素,水平像素,通道数)

print("size =", image_Color.size) # 打印彩色图像包含的像素个数

print("dtype =", image_Color.dtype) # 打印彩色图像的数据类型

image_Gray = cv2.imread("1.1.jpg", 0) # 读取与1.1.jpg(彩色图像)对应的灰度图像

print("获取灰度图像的属性:")

print("shape =", image_Gray.shape) # 打印灰度图像的(垂直像素,水平像素)

print("size =", image_Gray.size) # 打印灰度图像包含的像素个数

print("dtype =", image_Gray.dtype) # 打印灰度图像的数据类型

  

 

上述代码的运行结果如图28所示。

28  获取并打印彩色图像的属性

 

说明:图28代码中“(292, 219, 3)”的含义是1.1.jpg的垂直像素是292,水平像素是219,通道数是3;“(292, 219)”的含义是由1.1.jpg转换得到的灰度图像的垂直像素是292,水平像素是219,通道数是1。