Ich schreibe Software, die einen Umriss von Bildern erkennt, verdünnt sie auf ein "einzelnes Pixel" dick, führt dann Operationen auf dem resultierenden Umriss durch. Meine Hoffnung ist, endlich folgendes zu bekommen:
Ich habe eine Software geschrieben, die die RGBA-Farben erkennt, sie in HSB umwandelt, nach einem Grenzwert fragt, der festlegt, ob ein Pixel ein Umriss ist oder nicht (normalerweise einen Wert um 0,25 und den B-Wert), und Dann speichert wahr oder falsch in einem 2-dimensionalen Array von Booleans (True ist eine Gliederung, falsch ist nicht). Das bringt mich auf Stufe 2 in Ordnung. Ich bin derzeit auf Stufe 3 fest und versuche derzeit, Folgendes zu erreichen:
Hier ist mein aktueller Code, wobei die outline[][]
Variable das ursprüngliche 2d Array von Wahr / Falsch ist (Stufe 2) und thinned[][]
der Umriss in Stufe 3 ist.
Ich habe eine ziemlich einfache Lösung gefunden, die gut genug für meine Zwecke funktioniert. Ich habe 3 Arrays, outline[][]
, thinned[][]
und thinIteration[][]
. outline[][]
und thinned[][]
werden beide gesetzt, wenn ein Bild geladen wird, wie in meiner Frage erklärt (Stufen 1 und 2). thinIteration[][]
wird dann mit Gruppen von Pixeln geladen, die ausgedünnt werden müssen und als "Rahmen" -Pixel betrachtet werden. Die Funktion löscht dann diese Pixel, und wenn sie irgendwelche Pixel löscht, startet sie die Methode neu. Es fährt fort, diesen Zyklus zu machen, bis es keine Pixel mehr zu dünn findet.
Das Programm weiß, ob ein Pixel verdünnt werden soll oder nicht, wenn es selbst ein Outline-Pixel ist, mindestens 2 angrenzende Pixel links / rechts / oben / unten und mindestens 2 angrenzende Pixel diagonal, aber nicht mehr als 3 links / rechts / hoch / runter und diagonal (was bedeuten würde, dass es ein enthaltenes Pixel ist)
%Vor%Tags und Links java