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

2021年11月11日02:43:33 发表评论 851 次浏览

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检测图像中的轮廓?好的,这是本教程的内容,如果你想在实时摄像机上进行测试,请转到此链接。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: