在二进制对象内填充孔

Zau*_*yev 28 opencv image-processing javacv

我有一个问题,在黑色硬币内填充白洞,以便我只能有0-255二进制图像与填充黑色硬币..我使用中位数过滤器来完成它但在那种情况下硬币之间的连接桥增长,这是不可能的经过几次侵蚀后识别它们......所以我需要在opencv中使用简单的floodFill方法

这是我带孔的图片:

在此输入图像描述

编辑:类似函数的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);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

Abi*_*n K 44

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

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)
Run Code Online (Sandbox Code Playgroud)

结果图片:

在此输入图像描述

2)图像打开:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
res = cv2.morphologyEx(gray,cv2.MORPH_OPEN,kernel)
Run Code Online (Sandbox Code Playgroud)

得到的图像如下:

在此输入图像描述

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

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


Eli*_*nko 5

我想,一个简单的扩张和侵蚀会很好地弥合缝隙.我想也许这就是你要找的东西.

一个更强大的解决方案是对整个图像进行边缘检测,然后对圆进行霍夫变换.一个快速的谷歌显示有各种语言的代码示例使用霍夫变换的大小不变检测圆,所以希望这将给你一些东西继续.

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


thi*_*ton 5

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

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

  • 但是对于opencv不是对于matlab (2认同)