我在填充黑色硬币内的白洞时遇到问题,因此我只能有 0-255 个填充黑色硬币的二进制图像。我使用中值过滤器来完成它,但在这种情况下,硬币之间的连接桥会增长,并且在经过几次侵 eclipse 后无法识别它们......所以我需要一个简单的 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);
结果:(你可以看到每个硬币内部都有黑洞)
最佳答案
有两种方法可以做到这一点:
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)
生成的图片如下:
可以看到,这两种情况并没有太大区别。
NB: gray - 灰度图像,所有代码均在OpenCV-Python
关于image-processing - 填充二进制对象内的孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316057/