您的位置:

Python OpenCV教程详解

一、OpenCV介绍

OpenCV,全称为Open Source Computer Vision Library,是一个开源的计算机视觉库。对于包括视频处理、计算机视觉、机器学习在内的许多领域都有非常广泛的应用。OpenCV最初由英特尔公司发起,现在由Willow Garage、Itseez等公司及个人维护。OpenCV提供了丰富的图像处理和计算机视觉算法,涉及图像处理、特征提取、目标跟踪、人脸识别、机器学习等方面。其模块化的设计、开源的代码、跨平台的支持,赢得了广大计算机视觉从业者和工程师的青睐。

二、OpenCV安装

OpenCV可以在Python中使用,首先需要安装OpenCV库。OpenCV可以通过pip安装,只需要使用以下命令即可:

pip install opencv-python
pip install opencv-contrib-python

安装完成后,我们就可以在Python中使用OpenCV库了。

三、OpenCV图像读取和显示

在OpenCV中,使用cv2.imread()函数读取图像文件,函数参数为文件名和读取标志。

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg',cv2.IMREAD_COLOR)
5 
6 #显示图像
7 cv2.imshow('image',img)
8 cv2.waitKey(0) #等待按键
9 cv2.destroyAllWindows() #销毁所有窗口

第4行代码中,cv2.IMREAD_COLOR表示按彩色图像的方式读取图像文件。读取完成后,使用cv2.imshow()函数显示图像。第7行代码中,第一个参数为窗口名称,第二个参数为要显示的图像的变量名。cv2.waitKey()函数用于等待按键,当按下任意键时程序退出。最后一行代码销毁所有的窗口。

四、OpenCV图像处理

1. 图像平滑处理

在OpenCV中,使用cv2.blur()函数进行图像平滑处理。函数的参数包括输入图像、卷积核大小等。例如:

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg')
5 
6 #图像平滑处理,卷积核大小为5x5
7 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
8 img_blur = cv2.blur(img, (5,5))
9 
10 #显示图像
11 cv2.imshow('image',img)
12 cv2.imshow('image_blur',img_blur)
13 cv2.waitKey(0) #等待按键
14 cv2.destroyAllWindows() #销毁所有窗口

上面的代码中,cv2.getStructuringElement()函数用于获取MORPH_RECT类型的卷积核。然后使用cv2.blur()平滑处理图像,最后用cv2.imshow()函数显示原图和平滑后的图像。运行代码后,我们可以看到平滑后的图像较原图模糊,可以起到一定的降噪作用。

2. 图像阈值处理

在OpenCV中,使用cv2.threshold()函数进行图像阈值处理。函数的参数包括输入图像、阈值、最大像素值等。例如:

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg',0)
5 
6 #图像阈值处理
7 ret,img_threshold = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
8 
9 #显示图像
10 cv2.imshow('image',img)
11 cv2.imshow('image_threshold',img_threshold)
12 cv2.waitKey(0) #等待按键
13 cv2.destroyAllWindows() #销毁所有窗口

上面的代码中,cv2.imread()函数读入的图像文件是灰度图像,因此第二个参数为0。然后使用cv2.threshold()函数进行阈值处理,threshold函数返回值有两个,第一个为阈值化的阈值值(在本例中为100),第二个为阈值化后的图像。最后使用cv2.imshow()函数显示原图和阈值化后的图像。

3. 图像边缘检测

在OpenCV中,使用cv2.Canny()函数进行图像边缘检测。函数的参数包括输入图像、阈值等。例如:

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg',0)
5 
6 #图像边缘检测
7 img_canny = cv2.Canny(img, 100, 200)
8 
9 #显示图像
10 cv2.imshow('image',img)
11 cv2.imshow('image_canny',img_canny)
12 cv2.waitKey(0) #等待按键
13 cv2.destroyAllWindows() #销毁所有窗口

上面的代码中,cv2.imread()函数读入的图像文件是灰度图像,因此第二个参数为0。然后使用cv2.Canny()函数进行图像边缘检测,其中第二个和第三个参数分别为低阈值和高阈值,最后使用cv2.imshow()函数显示原图和边缘检测后的图像。

五、OpenCV图像处理实例

下面我们来看一个实例,通过OpenCV对图像进行颜色识别并在图像上标出颜色区域。

首先,我们需要加载一张彩色图像,并将图像进行平滑处理:

1 import cv2
2 import numpy as np
3 
4 #读取图像
5 img = cv2.imread('fruits.jpg')
6 
7 #图像平滑处理,卷积核大小为5x5
8 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
9 img_blur = cv2.blur(img, (5,5))

然后,我们将图像转换到HSV颜色空间,从而可以使用颜色阈值过滤器实现对图像上的特定颜色进行识别。

1 #将图像转换到HSV颜色空间
2 img_hsv = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)
3 
4 #设定颜色区间
5 lower_red = np.array([0, 50, 50])
6 upper_red = np.array([10, 255, 255])
7 
8 #过滤出红色区域
9 mask = cv2.inRange(img_hsv, lower_red, upper_red)

接下来,我们对过滤出的颜色区域进行形态学处理,去掉噪点和孤立的区域:

1 #形态学处理
2 mask = cv2.erode(mask, kernel, iterations=2)
3 mask = cv2.dilate(mask, kernel, iterations=2)

最后,我们根据颜色区域的轮廓,使用cv2.drawContours()函数将颜色区域标出:

1 #查找轮廓
2 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
3 
4 #标出颜色区域
5 for contour in contours:
6     cv2.drawContours(img, [contour], 0, (0,255,0), 3)
7 
8 #显示图像
9 cv2.imshow('image',img)
10 cv2.waitKey(0) #等待按键
11 cv2.destroyAllWindows() #销毁所有窗口

完整的代码如下:

1 import cv2
2 import numpy as np
3 
4 #读取图像
5 img = cv2.imread('fruits.jpg')
6 
7 #图像平滑处理,卷积核大小为5x5
8 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
9 img_blur = cv2.blur(img, (5,5))
10 
11 #将图像转换到HSV颜色空间
12 img_hsv = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)
13 
14 #设定颜色区间
15 lower_red = np.array([0, 50, 50])
16 upper_red = np.array([10, 255, 255])
17 
18 #过滤出红色区域
19 mask = cv2.inRange(img_hsv, lower_red, upper_red)
20 
21 #形态学处理
22 mask = cv2.erode(mask, kernel, iterations=2)
23 mask = cv2.dilate(mask, kernel, iterations=2)
24 
25 #查找轮廓
26 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
27 
28 #标出颜色区域
29 for contour in contours:
30     cv2.drawContours(img, [contour], 0, (0,255,0), 3)
31 
32 #显示图像
33 cv2.imshow('image',img)
34 cv2.waitKey(0) #等待按键
35 cv2.destroyAllWindows() #销毁所有窗口

六、总结

通过本文的介绍,我们了解了OpenCV的基本概念、安装方法,以及常见的图像处理方法。在实际应用中,OpenCV可以实现很多有趣的功能,如人脸识别、目标跟踪等。希望本文能为初学者提供一些帮助,让大家更好地掌握OpenCV这个强大的计算机视觉库。