Füllen von Löchern in einem binären Objekt

Ich habe ein Problem mit dem Füllen von weißen Löchern in einer schwarzen Münze, so dass ich nur ein binäres Bild von 0-255 mit gefüllten schwarzen Münzen haben kann. Ich habe den Medianfilter verwendet, um dies zu erreichen, aber in diesem Fall wächst die Verbindungsbrücke zwischen Münzen und es wird unmöglich um sie nach mehrmaliger erosion zu erkennen ... also brauche ich eine einfache floodfill-artige methode in opencv

Hier ist mein Bild mit Löchern:

BEARBEITEN: Floodfill-ähnliche Funktionen müssen Löcher in großen Bauteilen füllen, ohne die X-, Y-Koordinaten als Startwert anzugeben ...

BEARBEITEN: Ich habe versucht, die cvDrawContours-Funktion zu verwenden, aber ich fülle Konturen in größeren nicht aus.

Hier ist mein Code:

<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>

Ergebnis: (Sie können schwarze Löcher in jeder Münze sehen)

Antworten auf die Frage(7)

Ihre Antwort auf die Frage