Erkennen, wenn das Bild in Farbe, Graustufen oder schwarz und weiß mit Python/PIL
Ich Seiten extrahieren Bilder aus einer PDF-Datei in jpeg-format und ich brauche, um zu bestimmen, ob jedes Bild ist viel mehr Graustufen, Farbe ou schwarz und weiß (mit einer Toleranz-Faktor).
Ich fand einige Möglichkeiten, um die Arbeit mit der Farberkennung mit PIL ( hier und hier ), aber ich kann nicht herausfinden, wie die Antwort auf diese einfache (visuelle) Frage : ist es viel mehr schwarz und weiß, Farbe oder Graustufen-Bild ?
Ich arbeite lieber mit Python und PIL für dieses Teil, aber ich konnte zu verwenden OpenCV, wenn jemand eine Ahnung hat (oder-Lösung).
InformationsquelleAutor Gepeto | 2013-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchte ich Gepeto die Lösung und es hat eine Menge von false positives, da die Farbe grand Abweichungen können ähnlich sein, nur durch Zufall. Der richtige Weg, dies zu tun ist die Berechnung der Varianz pro pixel. Verkleinern Sie zuerst das Bild, so dass Sie nicht haben, Sie zu verarbeiten Millionen von Pixeln.
Standardmäßig ist diese Funktion verwendet auch eine mittlere Farbe bias-Einstellung, die ich finde, verbessert sich die Vorhersage. Ein Nebeneffekt dabei ist, dass es auch erkennen, einfarbig, aber nicht-Graustufen-Bilder (in der Regel sepia-getönten Zeug, das Modell scheint zu brechen ein wenig in die Erkennung von größeren Abweichungen von Graustufen). Trennen Sie diese von Graustufen durch thresholding auf die Farbe-band bedeutet.
Ich diese lief auf einem test-set von 13.000 fotografische Bilder und bekam Klassifizierung mit 99.1% Präzision und 92.5% erinnern. Genauigkeit könnte wahrscheinlich noch weiter verbessert werden, indem eine nichtlineare bias-Einstellung (Farbwerte müssen zwischen 0 und 255, zum Beispiel). Vielleicht auf der Suche im median squared error, statt des MSE wäre besser ermöglichen, z.B. Graustufenbilder mit kleinen Farb-Stempel.
SSE/MSE sind die Summe der Quadrierten Fehler/Mean Squared Error. Im Rückblick auf diese, es könnte konzeptionell einfacher, wenn Sie umgewandelt, um den HSV oder einen ähnlichen Farbraum. Der SSW würde dann berechnet werden, nur in der Farbton/Sättigung-Kanäle als Differenz von null oder von der Neigung, wenn Sie eine haben.
InformationsquelleAutor Noah Whitman
Verwenden wir diese einfache Funktion zu bestimmen, die Farbe-Faktor eines Bildes.
Als graue Werte r-g = 0 und r-b = 0 und g-b = 0
diff wird in der Nähe von 0 für Graustufen-Bilder und > 0 für farbige Bilder.
InformationsquelleAutor TomB
Habe ich einen Weg gefunden, vermute mal, dass das mit der PIL ImageStat Modul. Vielen Dank an dieser Beitrag für die monochromatische Bestimmung eines Bildes.
FARBE und MAYBE_COLOR konstant sind schnelle Schalter zu finden, die Unterschiede zwischen Farb-und Graustufen-Bilder, aber es ist nicht sicher. Als Beispiel, ich habe mehrere JPEG Bilder anzeigen als Farbe aber in real sind die Graustufen mit einigen Farb-Artefakte, die aufgrund einer scan-Prozess. Das ist, warum ich eine Stufe auf und beachten Sie wirklich shure Farbe Bild von den anderen.
Wenn jemand einen besseren Ansatz weiter, lass es mich wissen.
InformationsquelleAutor Gepeto
Ich persönlich bevorzuge die Antwort von Grab. Dies ist nicht eine neue Antwort, ich will nur den post mit der Java-version:
Das Ergebnis ist der Unterschied, wie eine matrix, auf diese Weise konnte Sie eine Schwelle und sogar erkennen, Formen. Wenn Sie möchten, dass das Ergebnis als eine einzelne Zahl, Sie müssen nur um den Durchschnittswert zu berechnen. Dies kann mit
Core.mean()
InformationsquelleAutor Tim
Können Sie die cv::Mat::Kanäle() operator und, der Ihnen sagen kann, ob es eine "Graustufen" (d.h., 2-Kanal) oder "Farbe" (d.h., 3-Kanal -) Bild. Für schwarz und weiß, müssen Sie festlegen, tiefere tests basiert auf Graustufen, da die definition variiert.
Ich würde eine Lösung vorschlagen, aber ich vermute, Sie haben bereits gefunden, eine PIL-Methode, die dazu dienen würde. Cheers.
InformationsquelleAutor scap3y