如何在Python中使用OpenCV检测图像中的轮廓()

【如何在Python中使用OpenCV检测图像中的轮廓()】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检测图像中的轮廓 - 我们将在本教程中使用此图像:
如何在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检测图像中的轮廓()

文章图片

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()

输出图像:
如何在Python中使用OpenCV检测图像中的轮廓()

文章图片
要在不同的真实世界图像上获得良好的结果,你需要调整阈值或执行边缘检测。例如,对于煎饼图像,我将阈值降低到127,结果如下:
如何在Python中使用OpenCV检测图像中的轮廓()

文章图片
好的,这是本教程的内容,如果你想在实时摄像机上进行测试,请转到此链接。

    推荐阅读