填充二进制对象内部的孔
image-processing
opencv
6
0

我在黑色硬币内部填充白洞时遇到问题,因此我只能用0-255的二进制图像填充黑色硬币。在经过几次腐蚀之后才能识别它们...所以我需要一个简单的FloodFill像opencv中的方法

这是我带孔的图像:

在此处输入图片说明

编辑:像函数一样的Floodfill必须在不提示X,Y坐标作为种子的情况下填充大型组件中的孔...

编辑:我试图使用cvDrawContours函数,但我不填充较大的内部轮廓。

这是我的代码:

        CvMemStorage mem = cvCreateMemStorage(0);
        CvSeq contours = new CvSeq();
        CvSeq ptr = new CvSeq();
        int sizeofCvContour = Loader.sizeof(CvContour.class);

        cvThreshold(gray, gray, 150, 255, CV_THRESH_BINARY_INV);

        int numOfContours = cvFindContours(gray, mem, contours, sizeofCvContour, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
        System.out.println("The num of contours: "+numOfContours); //prints 87, ok

        Random rand = new Random();
        for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
            Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
            CvScalar color = CV_RGB( randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue());
            cvDrawContours(gray, ptr, color, color, -1, CV_FILLED, 8);
        }
        CanvasFrame canvas6  = new CanvasFrame("drawContours");
        canvas6.showImage(gray);

结果:(您可以在每个硬币内看到黑洞)

在此处输入图片说明

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我想,简单的扩张和腐蚀会很好地缩小差距。我想也许这就是您要寻找的。

一种更可靠的解决方案是对整个图像进行边缘检测,然后对圆进行霍夫变换。一个快速的Google展示了使用霍夫变换可以使用各种语言提供的代码示例,这些代码示例用于使用hough变换对圆进行尺寸不变检测,因此希望可以为您提供一些帮助。

使用霍夫变换的好处是该算法实际上将为您提供每个圆的大小和位置的估计,因此您可以基于该模型重建理想的图像。重叠也应该非常健壮,尤其是考虑到此处输入图像的质量(即,较少担心误报,因此可以降低结果阈值)。

收藏
评论

有两种方法可以做到这一点:

1)轮廓填充:

首先反转图像,在图像中找到轮廓,用黑色填充然后反转。

des = cv2.bitwise_not(gray)
contour,hier = cv2.findContours(des,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contour:
    cv2.drawContours(des,[cnt],0,255,-1)

gray = cv2.bitwise_not(des)

结果图像:

在此处输入图片说明

2)图片打开:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
res = cv2.morphologyEx(gray,cv2.MORPH_OPEN,kernel)

生成的图像如下:

在此处输入图片说明

您可以看到,两种情况都没有太大区别。

注意 :灰度-灰度图像,所有代码均在OpenCV-Python中

收藏
评论

您可能正在寻找Fillhole变换 ,这是形态图像重建的应用程序。

这种转换将填充硬币中的孔,即使以同时填充相邻硬币组之间的所有孔为代价。其他张贴者建议的基于Hough空间或基于开口的解决方案可能会为您提供更好的高级识别结果。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号