我有一个问题,需要填充黑色硬币内部的白色空洞,以便我可以得到只有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);
结果:(您可以看到每个硬币内部都有黑洞)
cv2.RETR_ExTERNAL
而不是cv2.RETR_CCOMP
可能会有一点改善。我不确定,你需要检查一下。但是,它仍然没有太大用处。相反,您可以检查代码中还需要更多时间的部分,并尝试进行优化。顺便说一句,这只需要3.5毫秒。为什么您需要提高其速度呢? - Abid Rahman K