使用 OpenCV 进行轮廓检测 (Python/C++)第一部分
  Jk5625xsZPHl 2023年11月02日 47 0

什么是轮廓

当我们连接一个对象边界上的所有点时,我们得到一个轮廓。通常,特定轮廓是指具有相同颜色和强度的边界像素。OpenCV 使得在图像中查找和绘制轮廓变得非常容易。它提供了两个简单的功能:

  1. findContours()
  2. drawContours()

此外,它有两种不同的轮廓检测算法:

  1. CHAIN_APPROX_SIMPLE
  2. CHAIN_APPROX_NONE

我们将在下面的示例中详细介绍这些内容。下图显示了这些算法如何检测简单物体的

在 OpenCV 中检测和绘制轮廓的步骤

OpenCV 使这成为一项相当简单的任务。只需按照以下步骤操作:

  1. 读取图像并将其转换为灰度格式

读取图像并将图像转换为灰度格式。将图像转换为灰度非常重要,因为它为下一步准备图像。将图像转换为单通道灰度图像对于阈值处理很重要,这反过来又是轮廓检测算法正常工作所必需的。

  1. 应用二进制阈值

在查找轮廓时,首先始终对灰度图像应用二进制阈值处理或 Canny 边缘检测。在这里,我们将应用二进制阈值。

这会将图像转换为黑白图像,突出显示感兴趣的对象,以便于轮廓检测算法。阈值处理将图像中对象的边界完全变白,所有像素都具有相同的强度。该算法现在可以从这些白色像素中检测到对象的边界。

注意:值为 0 的黑色像素被视为背景像素并被忽略。

此时,可能会出现一个问题。如果我们使用 R(红色)、G(绿色)或 B(蓝色)等单通道而不是灰度(阈值)图像会怎样?在这种情况下,轮廓检测算法将无法正常工作。正如我们之前所讨论的,该算法会寻找边界和相似强度的像素来检测轮廓。二值图像提供的信息比单个 (RGB) 颜色通道图像好得多。在博客的后面部分,我们将在仅使用单个 R、G 或 B 通道而不是灰度和阈值图像时得到结果图像。

  1. 找到轮廓

使用该findContours()函数检测图像中的轮廓。

  1. 在原始 RGB 图像上绘制轮廓。

识别出轮廓后,使用该drawContours()函数将轮廓叠加在原始 RGB 图像上。

当我们开始编码时,上面的步骤会更有意义,并且会变得更加清晰。

使用 OpenCV 查找和绘制轮廓

首先导入 OpenCV,然后读取输入图像。

Python:

import cv2
 
# read the image
image = cv2.imread('input/image_1.jpg')

C++:

#include<opencv2/opencv.hpp>
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main() {
   // read the image
   Mat image = imread("input/image_1.jpg");

接下来,使用cvtColor()函数将原始 RGB 图像转换为灰度图像。 

Python:

# convert the image to grayscale format
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

C++:

// convert the image to grayscale format
Mat img_gray;
cvtColor(image, img_gray, COLOR_BGR2GRAY);

现在,使用该threshold()函数对图像应用二进制阈值。任何值大于 150 的像素都将设置为值 255(白色)。结果图像中的所有剩余像素都将设置为 0(黑色)。阈值 150 是一个可调参数,因此您可以对其进行试验。 

imshow()阈值处理后,使用如下所示的函数 可视化二值图像。

Python:

# apply binary thresholding
ret, thresh = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
# visualize the binary image
cv2.imshow('Binary image', thresh)
cv2.waitKey(0)
cv2.imwrite('image_thres1.jpg', thresh)
cv2.destroyAllWindows()

C++:

// apply binary thresholding
Mat thresh;
threshold(img_gray, thresh, 150, 255, THRESH_BINARY);
imshow("Binary mage", thresh);
waitKey(0);
imwrite("image_thres1.jpg", thresh);
destroyAllWindows();

使用 OpenCV 进行轮廓检测 (Python/C++)第一部分_灰度

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
Jk5625xsZPHl