Python OpenCV检测图像中的轮廓:轮廓是连接所有具有某种颜色或强度的连续点的闭合曲线,它们代表图像中发现的对象的形状。轮廓检测是一种用于形状分析和物体检测和识别的有用技术。
在之前的教程中,我们讨论了使用 Canny 算法进行边缘检测,并且我们已经看到了如何在OpenCV 中实现它,你可能会问,边缘检测和轮廓检测之间有什么区别?
OpenCV如何检测图像轮廓?当我们执行边缘检测时,我们会找到颜色强度显着变化的点,然后我们只需打开这些像素。然而,轮廓是与图像中对象的形状相对应的点和线段的抽象集合。因此,我们可以在我们的程序中操作轮廓,例如计算轮廓的数量,使用它们对对象的形状进行分类,从图像中裁剪对象(图像分割)等等。
轮廓检测并不是图像分割的唯一算法,还有很多其他算法,例如当前最先进的语义分割、霍夫变换和K-Means 分割。
为了获得更好的准确性,以下是我们成功检测图像中的轮廓所要遵循的整个流程:
- 将图像转换为二值图像,通常的做法是将输入图像变为二值图像(应该是阈值图像或边缘检测的结果)。
- 使用findContours() OpenCV函数查找轮廓。
- 绘制这些轮廓并显示图像。
相关: 如何在 Python 中应用 HOG 特征提取。
OpenCV检测图像轮廓示例 - 好的,让我们开始吧。首先,让我们安装本教程的依赖项:
pip3 install matplotlib opencv-python
导入必要的模块:
import cv2
import matplotlib.pyplot as plt
Python OpenCV检测图像中的轮廓 - 我们将在本教程中使用此图像:
让我们加载它:
# read the image
image = cv2.imread("thumbs_up_down.jpg")
将其转换为RGB,然后灰度:
# convert to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
OpenCV如何检测图像轮廓?正如本教程前面提到的,我们需要创建一个二值图像,这意味着图像的每个像素都是黑色或白色。这在OpenCV 中是必要的,找轮廓就像从黑色背景中找白色物体,要找的物体应该是白色的,背景应该是黑色的。
# create a binary thresholded image
_, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
# show it
plt.imshow(binary, cmap="gray")
plt.show()
上面的代码建立通过禁用(设置为二进制图像0),其具有小于一值的像素225和接通(设定为255),其具有大于一个值的像素225,这里是输出图像:
Python OpenCV检测图像中的轮廓 - 现在这对于OpenCV来说很容易检测轮廓:
# find the contours from the thresholded image
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw all contours
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
OpenCV检测图像轮廓示例:上面的代码在二值图像中找到轮廓,并用粗绿线将它们绘制到图像上,让我们展示一下:
# show the image with the drawn contours
plt.imshow(image)
plt.show()
输出图像:
好的,这是本教程的内容,如果你想在实时摄像机上进行测试,请转到此链接。