image-processing - 填充二进制对象内的孔

标签 image-processing opencv javacv

我在填充黑色硬币内的白洞时遇到问题,因此我只能有 0-255 个填充黑色硬币的二进制图像。我使用中值过滤器来完成它,但在这种情况下,硬币之间的连接桥会增长,并且在经过几次侵 eclipse 后无法识别它们......所以我需要一个简单的 floodFill 类似 opencv 的方法

这是我的有洞的图片:

enter image description here

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

结果:(你可以看到每个硬币内部都有黑洞)

enter image description here

最佳答案

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

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)

结果图像:

enter image description here

2) 图片打开:

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

生成的图片如下:

enter image description here

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

NB: gray - 灰度图像,所有代码均在OpenCV-Python


引用。 OpenCV Morphological Transformations

关于image-processing - 填充二进制对象内的孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316057/

相关文章:

java - 如何确定和自动旋转图像?

image-processing - 指纹图像比较

image-processing - 相机位置和角度与3d数据的两个图像?

OpenCV 2.4.3 - JavaCV 0.3 - FaceRecognizer 类 - LBPH - 更新功能仍然无效

opencv - 使用JavaCV显示摄像机的实时图像

algorithm - 如何检测照片的对比度?

matlab - 如何在 MATLAB 中将图像分成 block ?

opencv - 在Opencv中提取图像中颜色(红色,蓝色,绿色,黄色,橙色)的百分比?

c++ - Halide 与 GPU 调度产生黑色图像

java - javacv 中的 NullPointerException