什么是轮廓
当我们连接一个对象边界上的所有点时,我们得到一个轮廓。通常,特定轮廓是指具有相同颜色和强度的边界像素。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
#include
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();
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
我们正在努力让我们每次发布的库更加负责! 我们很荣幸宣布我们发布了 道德守则,并将作为一部分其放入 Diffusers 库的说明文档。 由于扩散模型在现实世界上的实际应用例子会对社会造成潜在的负面影响,该守则旨在引导对于社区做出贡献的 Diffusers 库…