Ermitteln Sie mithilfe von Python die am häufigsten verwendete Farbe in einem Bild

8

Ich möchte die am häufigsten verwendete Farbe in einem Bild mit Python finden. zum Beispiel die Farbe des Objekts in dem folgenden Bild erkennen

Ссылка .

Wie erkennt man die Grundfarbe aus den RGB-Codes (Beispiel - rot im obigen Bild).

    
Sreejith Sasidharan 11.03.2010, 09:20
quelle

6 Antworten

5

Da Sie höchstwahrscheinlich kein Histogramm aller Millionen Farben wünschen, die mit einem 24-Bit-Farbraum möglich sind, empfehle ich stattdessen, das Bild in den HSV-Raum zu transformieren. Dann können Sie den Farbton-Teil dieses Raums in eine Anzahl von Bins aufteilen, die die Farbtöne beschreiben, die Sie finden möchten ("dunkelrot", "orange-rot" oder was auch immer). Dann machen Sie ein Histogramm dieser Fächer und finden Sie heraus, welcher der vorherrschende Farbton ist, welches die "Farbe" ist.

Der Wikipedia-Artikel Ссылка sollte Ihnen den Einstieg erleichtern. Wenn Sie eine Bildverarbeitungsbibliothek verwenden, besteht die Chance, dass eine rgb-to-hsv / hsl-Funktion existiert.

Wenn die Bilder groß sind und die Geschwindigkeit ein Problem darstellt, sollten Sie das Bild vor der Histogrammerstellung auf eine kleinere Größe verkleinern.

    
Hannes Ovrén 11.03.2010, 09:40
quelle
3

Der Brute-Force-Ansatz besteht darin, alle Pixel im Bild zu durchlaufen und die R-, G- und B-Werte zu zählen. Ein raffinierterer Ansatz besteht darin, die Histogrammfunktion Python-Bildbibliothek zu verwenden und den Durchschnitt aller zu berechnen Farben.

    
Martin Wickman 11.03.2010 09:26
quelle
2

Ich würde die Python-Bildbibliothek verwenden. Dies ist ein Stück Code, der die Anzahl der weißen Pixel / nicht-weißen Pixel in einem Bild berechnet.

%Vor%

In Ihrem Fall würde ich ein Wörterbuch machen, um jedes rgb Triple gegen einen Zähler zu halten, also würde ich das Programm so überarbeiten (nicht getestet)

%Vor%

Sie können jetzt den mit der höchsten Anzahl an Punkten überprüfen und das am häufigsten verwendete rgb triple erhalten. Natürlich, wenn Sie auch vicinal Farben überprüfen möchten, müssen Sie in HSV konvertieren und überprüfen Sie die Abstände zwischen verschiedenen HSV-Punkten, dann entscheiden, welche Entfernung zu viel ist. Punkte, die im HSV-Raum (und insbesondere die Farbtonkomponente) ausreichend nahe sind, haben höchstwahrscheinlich die gleiche Farbe und können folglich summiert werden.

    
Stefano Borini 03.04.2010 14:49
quelle
1

Wenn Sie wirklich sicher sind, dass Sie immer nur eine dominante Farbe haben werden (keine Taschen in zwei Farben, zB), dann ein grobes Histogramm über die H & amp; S Dimensionen von HSV sollte ausreichen.

Andernfalls können Sie mittlere Verschiebung verwenden (und sollten dies tun). Es ist ziemlich einfach, tut genau das, was Sie wollen, und es gibt Bibliotheken, die Sie verwenden können, obwohl ich in Python nichts finden konnte. Sie können es entweder implementieren oder C ++ - Code aufrufen.

Die Grundidee des Algorithmus ist folgende: Jedes Pixel betrachtet benachbarte Pixel ähnlicher Farbe und ändert seine Farbe in das gewichtete Mittel aller ihrer Farben; spülen und wiederholen. Sehr bald haben Sie alle Farben im Bild sehr eng um einige vorherrschende Farben gruppiert.

    
AVB 11.03.2010 14:13
quelle
0

Sortieren Sie die Pixel an Ort und Stelle, durchlaufen Sie dann das Bild und finden Sie den längsten Lauf.

    
user97370 11.03.2010 19:05
quelle
0

Wie vorgeschlagen, ist es praktischer, Ihr Bild von RGB in HSV zu konvertieren. Das Standardbibliotheksmodul colorsys enthält die Funktion rgb_to_hsv für diesen Effekt. Dann können Sie Farben auf einem Bild abbilden, sagen wir mit H als x und S als y. Wähle Punkte in diesem Raum und gib ihnen Namen. Je mehr Punkte, desto besser. Suchen Sie dann für jedes Pixel in Ihrem Bild den nächsten der von Ihnen ausgewählten Punkte und verwenden Sie seinen Namen als Pixelwert. Zählen Sie, welcher Name am häufigsten vorkommt.

Soll ich Code liefern?

    
tzot 03.04.2010 13:03
quelle

Tags und Links