Kann K-means verwendet werden, um bei der pixelwertbasierten Trennung eines Bildes zu helfen?

8

Ich versuche ein Graustufenbild basierend auf dem Pixelwert zu trennen: Angenommen Pixel von 0 bis 60 in einem Fach, 60-120 in einem anderen, 120-180 ... und so weiter bis 255. Die Bereiche sind grob äquidistant in diesem Fall.  Mit dem K-Means-Clustering wird es jedoch möglich sein, realistische Werte für die Pixelbereiche zu erhalten. Der Versuch, ähnliche Pixel zusammen zu erhalten und keine Abfallbehälter zu verschwenden, in denen die Konzentration der vorhandenen Pixel geringer ist.

EDITS (um erhaltene Ergebnisse zu enthalten):

k-bedeutet mit keiner von cluster = 5

    
AruniRC 24.03.2011, 01:43
quelle

2 Antworten

10

Selbstverständlich können K-Means zur Farbquantisierung verwendet werden. Es ist sehr praktisch dafür.

Sehen wir uns ein Beispiel in Mathematica an:

Wir beginnen mit einem Graustufenbild (150x150):

Sehen wir uns an, wie viele Graustufen vorhanden sind, wenn das Bild in 8 Bits dargestellt wird:

%Vor%

Ok. Lassen Sie uns diese 234 Ebenen reduzieren. Unser erster Versuch wird sein, den Algorithmus allein zu lassen, um zu bestimmen, wie viele Cluster mit der Standardkonfiguration vorhanden sind:

%Vor%

Er wählt 3 Cluster aus, und das entsprechende Bild ist:

Wenn das jetzt in Ordnung ist oder Sie mehr Cluster benötigen, liegt es an Ihnen.

Nehmen wir an, Sie entscheiden, dass eine feinkörnigere Farbseparation benötigt wird. Lass uns nach 6 Clustern anstatt 3 fragen:

%Vor%

Ergebnis:

und hier sind die Pixelbereiche, die in jeder Bin verwendet werden:

%Vor%

und die Anzahl der Pixel in jedem Fach:

%Vor%

Also, die Antwort ist JA, und es ist einfach.

Bearbeiten

Vielleicht hilft Ihnen das, zu verstehen, was Sie in Ihrem neuen Beispiel falsch machen.

Wenn ich ein Farbbild clustere und die Cluster-Nummer zur Darstellung der Helligkeit verwende, bekomme ich:

Das liegt daran, dass die Cluster nicht in aufsteigender Helligkeitsreihenfolge nummeriert werden.

Aber wenn ich den mittleren Helligkeitswert für jeden Cluster berechne und ihn zur Darstellung des Clusterwerts verwende, bekomme ich:

In meinem vorherigen Beispiel wurde das nicht benötigt, aber das war nur Glück: D (d. h. Cluster wurden in aufsteigender Helligkeitsreihenfolge gefunden)

    
Dr. belisarius 24.03.2011, 03:36
quelle
2

k-means könnte auf Ihr Problem angewendet werden. Wenn ich es wäre, würde ich zuerst einen grundlegenden Ansatz versuchen, der von Entscheidungsbäumen übernommen wurde (obwohl "einfacher" von Ihrem genauen Clustering-Algorithmus abhängt!)

Nehmen Sie an, ein Bin existiert, fangen Sie an, die Pixelintensitäten in den Behälter zu stopfen. Wenn der Behälter "voll genug" ist, berechnen Sie den Mittelwert und die Standardabweichung des Behälters (oder Knotens). Wenn die Standardabweichung größer als ein Schwellenwert ist, teilen Sie den Knoten in zwei Hälften. Setzen Sie diesen Prozess fort, bis alle Intensitäten abgeschlossen sind, und Sie werden ein effizienteres Histogramm haben.

Diese Methode kann natürlich mit zusätzlichen Details verbessert werden:

  1. Sie könnten Kurtosis als Splitting-Kriterium in Betracht ziehen.
  2. Skewness kann verwendet werden, um zu bestimmen, wo die Teilung auftritt
  3. Sie könnten den ganzen Weg in das Entscheidungsbaumland gehen und den Jini-Index ausleihen, um die Aufteilung zu leiten (einige Split-Techniken beruhen auf "exotischeren" Statistiken, wie der t-Test).
  4. Zuletzt können Sie einen abschließenden Konsolidierungslauf durchführen, um alle dünn besiedelten Knoten zu reduzieren.

Natürlich, wenn Sie alle oben genannten "Verbesserungen" angewendet haben, dann haben Sie grundsätzlich eine Variante eines k-means Clustering-Algorithmus implementiert ;-)

Hinweis: Ich stimme nicht mit dem obigen Kommentar überein - das Problem, das Sie beschreiben, erscheint nicht eng verwandten Histogrammausgleich.

    
Throwback1986 24.03.2011 03:18
quelle