Opencv孔检测

时间:2015-02-05 15:29:14

标签: c++ image opencv

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

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

outputImage

所以我不知道如何分开它们,我不知道应该用什么算法来检测这些洞。

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);

接下来我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

findContour method in OpenCV

此方法使用CV_RETR_CCOMP参数查找所有白色物体的外部轮廓,并确定每个孔的内部轮廓。 "它检索所有轮廓并将它们组织成两级层次结构。在顶层,组件有外部边界。在第二层,有孔的边界。如果连接组件的孔内有另一个轮廓,它仍然位于顶层。"

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

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

Using hierarchy in findContours () in OpenCV?

答案 1 :(得分:-1)

您可以进行模板匹配 - 图像处理中的互相关应用 - 非常简单。

如果您碰巧有上面图像的模板(即没有孔或任何间隙的预期图像)。您可以执行X相关,即模板匹配,以确定是否存在任何孔。如果没有洞,你应该得到一个完美的匹配,否则没有匹配。正如@Hans在下面评论的那样,背景仍然是白色的 - 这使得它有点棘手。

看看这个 - http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

我能想到的解决方案之一是:

1)从相同大小的全黑背景图像中减去图像,即白色图像的所有像素值应与所有白色相对应。

2)看看指数。这些是实际图像中的漏洞。