Gibt es einen geeigneten Algorithmus zum Erkennen der Hintergrundfarbe einer Figur?

Für das College haben wir einen Auftrag erhalten, bei dem wir anhand eines Bildes die "Figuren", ihre Farbe und die Anzahl der "Pixelgruppen" in ihnen identifizieren müssen. Lassen Sie mich erklären:

Das Bild oben hat eineZahl (Auf dem Bild können mehrere Figuren zu sehen sein, aber lassen Sie uns dies vorerst vergessen).

Die Hintergrundfarbe der Leinwand ist das Pixel bei 0,0 (in diesem Fall gelb)Die Rahmenfarbe der Figur ist schwarz (es kann sich um eine andere Farbe als die Hintergrundfarbe der Leinwand handeln).Die Hintergrundfarbe der Figur ist weiß (sie kann auch der Hintergrundfarbe der Leinwand entsprechen).Eine Figur kann nur eine Hintergrundfarbe haben.In der Figur gibt es zwei Pixelgruppen. Einer ist ein Pool von blauen Pixeln, und der andere ist ein Pool von Rot mit etwas Grün im Inneren. Wie Sie sehen, spielt die Farbe der Pixel der Pixelgruppe keine Rolle (sie unterscheidet sich nur von der Hintergrundfarbe der Figur). Was zählt, ist die Tatsache, dass sie in Kontakt sind (auch diagonal). Trotz zweier unterschiedlicher Farben wird eine solche Gruppe ohnehin nur als eine betrachtet.Wie Sie sehen, kann der Rand so unregelmäßig sein, wie Sie möchten. Es hat jedoch nur eine Farbe.Es ist bekannt, dass eine Pixelgruppe den Rand nicht berührt.Mir wurde gesagt, dass die Farben einer Pixelgruppe jede andere als die Hintergrundfarbe der Figur sein können. Ich gehe davon aus, dass es dann genauso sein kann wie die Randfarbe der Figur (schwarz).

Wir haben eine Klasse erhalten, die Bilder aufnehmen und in eine Matrix konvertieren kann (jedes Element ist eine ganze Zahl, die die Farbe des Pixels darstellt).

Und das ist es. Ich mache es mit Java.

WAS HABE ICH BISHER GEMACHT?

Iteriere durch jedes Pixel in der MatrixWenn ich ein Pixel finde, das sich von der Hintergrundfarbe unterscheidet, gehe ich davon aus, dass es zum Rand der Figur gehört. Ich werde dieses Pixel nenneninitialPixel von jetzt an.Notiere dass derinitialPixel In dem Bild, das ich bereitgestellt habe, befindet sich dieses schwarze Pixel in der oberen linken Ecke der Figur. Ich habe dort gezielt einen scharfen Schnitt gemacht, um das zu veranschaulichen.Meine Aufgabe ist es nun, die Hintergrundfarbe der Figur zu finden (in diesem Fall weiß).

Aber ich habe ziemlich viel Mühe, eine solche Hintergrundfarbe (weiß) zu finden. Dies ist die naheliegendste Methode, die ich gemacht habe und die in einigen Fällen funktioniert hat - aber nicht mit diesem Bild:

Da ich die Farbe des Randes kenne, konnte ich die erste andere Farbe finden, die zu der gehörtSüden desinitialPixel. Hat sich nach einer guten Idee angehört - es hat manchmal funktioniert, aber es hat nicht mit dem bereitgestellten Bild funktioniert: In diesem Fall wird es gelb zurückgegeben, dainitialPixel ist ziemlich weit vom Inhalt der Figur entfernt.

Unter der Annahme, dass ich die Hintergrundfarbe der Figur (weiß) gefunden habe, besteht meine nächste Aufgabe darin, zu erkennen, dass in der Figur zwei Pixelgruppen vorhanden sind. Dieser scheint einfacher zu sein:

Da ich jetzt die Hintergrundfarbe der Figur (weiß) kenne, kann ich versuchen, durch jedes Pixel in der Figur zu iterieren. Wenn ich ein Pixel finde, das nicht zum Rand gehört und nicht zum Hintergrund der Figur gehört, kann ich bereits feststellen, dass dies der Fall ist eine Pixelgruppe. Ich kann eine rekursive Funktion starten, um alle Pixel zu finden, die sich auf eine solche Gruppe beziehen, und sie "kennzeichnen", so dass ich in zukünftigen Iterationen solche Pixel vollständig ignorieren kann.

WAS ICH BRAUCHE

Ja, mein Problem ist, wie man die Hintergrundfarbe der Figur findet (bedenke, dass sie der Hintergrundfarbe des gesamten Bildes entsprechen kann - im Moment ist sie gelb, aber sie kann auch weiß sein), basierend auf dem, was ich zuvor beschrieben habe.

Ich brauche keinen Code - ich habe nur Probleme, mir einen geeigneten Algorithmus für einen solchen zu überlegen. Die Tatsache, dass die Grenze so seltsame unregelmäßige Linien haben kann, bringt mich um.

Oder noch besser: habe ich es die ganze Zeit falsch gemacht? Vielleicht hätte ich mich nicht so sehr darauf konzentrieren solleninitialPixel überhaupt. Vielleicht hätte eine andere anfängliche Methode funktioniert? Gibt es Dokumente / Beispiele zu solchen Themen? Mir ist klar, dass es eine Menge Forschung zu "Computer Vision" und ähnlichem gibt, aber ich kann nicht viel über dieses spezielle Problem herausfinden.

EINIGER CODE

Meine Funktion zum Abrufen eines Vektors mit allen Figuren: * Hinweis:Figure ist nur eine Klasse, die einige Werte wie die Hintergrundfarbe und die Anzahl der Elemente enthält.

public Figure[] getFiguresFromImage(Image image) {
    Figure[] tempFigures = new Figure[100];
    int numberOfFigures = 0;
    matrixOfImage = image.getMatrix();
    int imageBackgroundColor = matrixOfImage[0][0];
    int pixel = 0;

    for (int y = 0; y < matrixOfImage.length; ++y) {
        for (int x = 0; x < matrixOfImage[0].length; ++x) {
            pixel = matrixOfImage[y][x];
            if (!exploredPixels[y][x]) {
                // This pixel has not been evaluated yet
                if (pixel != imageBackgroundColor ) {
                    // This pixel is different than the background color
                    // Since it is a new pixel, I assume it is the initial pixel of a new figure
                    // Get the figure based on the initial pixel found
                    tempFigures[numberOfFigures] = retrieveFigure(y,x);
                    ++numberOfFigures;
                }
            }
        }   
    }

    // ** Do some work here after getting my figures **

    return null;
}

Dann klar die FunktionretrieveFigure(y,x) ist das, wozu ich nicht in der Lage bin.

Anmerkungen:

Zu Lernzwecken sollte ich keine externen Bibliotheken verwenden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage