Relleno de agujeros dentro de un objeto binario.
Tengo un problema con el llenado de agujeros blancos dentro de una moneda negra, por lo que puedo tener solo 0-255 imágenes binarias con monedas negras rellenas ... He utilizado el filtro de Mediana para lograrlo, pero en ese caso, la conexión entre monedas crece y se vuelve imposible para reconocerlos después de varias veces de erosión ... Así que necesito un método simple de inundación.
Aquí está mi imagen con agujeros:
EDITAR: La función de relleno de inundación debe rellenar agujeros en componentes grandes sin solicitar coordenadas X, Y como semilla ...
EDITAR: Intenté usar la función cvDrawContours pero no relleno los contornos dentro de los más grandes.
Aquí está mi código:
<code> 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); </code>
Resultado: (puedes ver agujeros negros dentro de cada moneda)