Opencv漏洞检测
Opencv Hole detection
我有一张图像,我想检测物体内部的孔洞(用它来计算每个孔洞的面积)。这是我使用 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);
接下来我该做什么?
您可以进行模板匹配——互相关在图像处理中的应用——非常简单。
如果您恰好有上图的模板(即没有孔洞或任何间隙的预期图像)。您可以执行 Xcorrelation 即模板匹配以确定是否有任何漏洞。如果没有洞,你应该得到一个完美的匹配,否则没有匹配。正如@Hans 在下面评论的那样,背景仍然是白色的——这让它有点棘手。
看看这个 - http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
我能想到的解决方案之一是:
1) 从相同大小的全黑背景图像中减去您的图像,即白色图像的所有像素值应对应于所有白色。
2) 查看指数。这些是您在实际图像中的漏洞。
第一步是二值化和反转。通过这些步骤,您将获得具有黑色背景、白色物体和黑洞的二值图像。
接下来,我建议您使用 findContour 方法,参数为 CV_RETR_CCOMP(或 CV_RETR_TREE):
此方法带有 CV_RETR_CCOMP 参数,可找到所有白色物体的外部轮廓,并确定每个孔的内部轮廓。 "It retrieves all of the contours and organizes them into a two-level hierarchy. At the top level, there are external boundaries of the components. At the second level, there are boundaries of the holes. If there is another contour inside a hole of a connected component, it is still put at the top level."
如果您在层次结构中有孔的轮廓,您可以继续进行图像处理,包括力矩计算、边界矩形计算等。(Contour Features)。
findContour方法的用法写在这个问题:
Using hierarchy in findContours () in OpenCV?
我有一张图像,我想检测物体内部的孔洞(用它来计算每个孔洞的面积)。这是我使用 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);
接下来我该做什么?
您可以进行模板匹配——互相关在图像处理中的应用——非常简单。
如果您恰好有上图的模板(即没有孔洞或任何间隙的预期图像)。您可以执行 Xcorrelation 即模板匹配以确定是否有任何漏洞。如果没有洞,你应该得到一个完美的匹配,否则没有匹配。正如@Hans 在下面评论的那样,背景仍然是白色的——这让它有点棘手。
看看这个 - http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
我能想到的解决方案之一是:
1) 从相同大小的全黑背景图像中减去您的图像,即白色图像的所有像素值应对应于所有白色。
2) 查看指数。这些是您在实际图像中的漏洞。
第一步是二值化和反转。通过这些步骤,您将获得具有黑色背景、白色物体和黑洞的二值图像。
接下来,我建议您使用 findContour 方法,参数为 CV_RETR_CCOMP(或 CV_RETR_TREE):
此方法带有 CV_RETR_CCOMP 参数,可找到所有白色物体的外部轮廓,并确定每个孔的内部轮廓。 "It retrieves all of the contours and organizes them into a two-level hierarchy. At the top level, there are external boundaries of the components. At the second level, there are boundaries of the holes. If there is another contour inside a hole of a connected component, it is still put at the top level."
如果您在层次结构中有孔的轮廓,您可以继续进行图像处理,包括力矩计算、边界矩形计算等。(Contour Features)。
findContour方法的用法写在这个问题:
Using hierarchy in findContours () in OpenCV?