我有一个图像,我想检测对象内部的孔(用它来计算每个孔的面积)。这是我使用 opencv 操作后的图像。

问题是背景和孔具有相同的颜色。

所以我不知道该怎么做才能将它们分开,也不知道应该使用什么算法来检测漏洞。

cv::threshold(channel[1], channel[1], 190, 255, CV_THRESH_BINARY);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::morphologyEx(channel[1], channel[1], cv::MORPH_OPEN, element);
cv::dilate(channel[1], channel[1], element);
cv::bitwise_not(channel[1], channel[1]);
cv::imwrite("green_after.bmp", channel[1]);

cv::Mat dist;
cv::distanceTransform(channel[1], dist, CV_DIST_L2, 3);
cv::imwrite("dist.bmp", dist);
cv::normalize(dist, dist, 0, 1., cv::NORM_MINMAX);
cv::imwrite("dist2.bmp", dist);
cv::threshold(dist, dist, .1, 1., cv::THRESH_BINARY);
cv::imwrite("dist3.bmp", dist);
cv::normalize(dist, dist, 0.0, 255.0, cv::NORM_MINMAX);
cv::imwrite("dist4.bmp", dist);

cv::Mat invSrc = cv::Scalar::all(255) - dist;
cv::imwrite("dist5.bmp", invSrc);

我接下来该怎么做?

最佳答案

第一步是二值化和反转。通过这些步骤,您将获得具有黑色背景、白色物体和黑洞的二值图像。

接下来我建议您使用带有参数 CV_RETR_CCOMP(或 CV_RETR_TREE)的 findContour 方法:

findContour method in OpenCV

这种带有 CV_RETR_CCOMP 参数的方法会找到所有白色物体的外部轮廓,并确定每个孔的内部轮廓。 “它检索所有轮廓并将它们组织成两级层次结构。在顶层,有组件的外部边界。在第二级,有孔的边界。如果孔内有另一个轮廓一个连接组件,它仍然放在顶层。”

如果您在分层结构中有孔的轮廓,您可以通过矩计算、边界矩形计算等( Contour Features )继续图像处理。

findContour 方法的用法写在这个问题上:

Using hierarchy in findContours () in OpenCV?

10-08 05:09