一、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这个强大的计算机视觉库。