Python OpenCV教程详解

发布时间:2023-05-20

一、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()函数读取图像文件,函数参数为文件名和读取标志。

import cv2
# 读取图像
img = cv2.imread('lena.jpg', cv2.IMREAD_COLOR)
# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 销毁所有窗口

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

四、OpenCV图像处理

1. 图像平滑处理

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

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

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

2. 图像阈值处理

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

import cv2
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 图像阈值处理
ret, img_threshold = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
# 显示图像
cv2.imshow('image', img)
cv2.imshow('image_threshold', img_threshold)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 销毁所有窗口

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

3. 图像边缘检测

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

import cv2
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 图像边缘检测
img_canny = cv2.Canny(img, 100, 200)
# 显示图像
cv2.imshow('image', img)
cv2.imshow('image_canny', img_canny)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 销毁所有窗口

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

五、OpenCV图像处理实例

下面我们来看一个实例,通过OpenCV对图像进行颜色识别并在图像上标出颜色区域。 首先,我们需要加载一张彩色图像,并将图像进行平滑处理:

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

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

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

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

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

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

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

完整的代码如下:

import cv2
import numpy as np
# 读取图像
img = cv2.imread('fruits.jpg')
# 图像平滑处理,卷积核大小为5x5
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
img_blur = cv2.blur(img, (5, 5))
# 将图像转换到HSV颜色空间
img_hsv = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)
# 设定颜色区间
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
# 过滤出红色区域
mask = cv2.inRange(img_hsv, lower_red, upper_red)
# 形态学处理
mask = cv2.erode(mask, kernel, iterations=2)
mask = cv2.dilate(mask, kernel, iterations=2)
# 查找轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 标出颜色区域
for contour in contours:
    cv2.drawContours(img, [contour], 0, (0, 255, 0), 3)
# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 销毁所有窗口

六、总结

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