什么是轮廓
当我们连接一个对象边界上的所有点时,我们得到一个轮廓。通常,特定轮廓是指具有相同颜色和强度的边界像素。OpenCV 使得在图像中查找和绘制轮廓变得非常容易。它提供了两个简单的功能:
findContours()
drawContours()
此外,它有两种不同的轮廓检测算法:
CHAIN_APPROX_SIMPLE
CHAIN_APPROX_NONE
我们将在下面的示例中详细介绍这些内容。下图显示了这些算法如何检测简单物体的
在 OpenCV 中检测和绘制轮廓的步骤
OpenCV 使这成为一项相当简单的任务。只需按照以下步骤操作:
- 读取图像并将其转换为灰度格式
读取图像并将图像转换为灰度格式。将图像转换为灰度非常重要,因为它为下一步准备图像。将图像转换为单通道灰度图像对于阈值处理很重要,这反过来又是轮廓检测算法正常工作所必需的。
- 应用二进制阈值
在查找轮廓时,首先始终对灰度图像应用二进制阈值处理或 Canny 边缘检测。在这里,我们将应用二进制阈值。
这会将图像转换为黑白图像,突出显示感兴趣的对象,以便于轮廓检测算法。阈值处理将图像中对象的边界完全变白,所有像素都具有相同的强度。该算法现在可以从这些白色像素中检测到对象的边界。
注意:值为 0 的黑色像素被视为背景像素并被忽略。
此时,可能会出现一个问题。如果我们使用 R(红色)、G(绿色)或 B(蓝色)等单通道而不是灰度(阈值)图像会怎样?在这种情况下,轮廓检测算法将无法正常工作。正如我们之前所讨论的,该算法会寻找边界和相似强度的像素来检测轮廓。二值图像提供的信息比单个 (RGB) 颜色通道图像好得多。在博客的后面部分,我们将在仅使用单个 R、G 或 B 通道而不是灰度和阈值图像时得到结果图像。
- 找到轮廓
使用该findContours()
函数检测图像中的轮廓。
- 在原始 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();
标签:阈值,Python,image,cv2,C++,OpenCV,灰度,图像,轮廓
From: https://blog.51cto.com/u_15959862/6358439