Frage

Ich mache einige Bildverarbeitung und ich brauche einen automatischen Weißabgleich-Algorithmus, der in Bezug auf die CPU Rechenzeit nicht zu intensiv ist. Alle Empfehlungen?

EDIT: und wenn es um Effizienz relevant ist, werde ich es mit Farbbildern als ein Array von ganzen Zahlen in Java Implementierung sein

.
War es hilfreich?

Lösung

Ein relativ einfacher Algorithmus ist es, die Farbtöne zu-Durchschnitt (in HSV oder HSL) der hellsten und dunkelsten Bildpunkte auf dem Bildschirm. In einer Prise gehen, nur mit dem hellsten Pixel. Wenn die Farbtöne zwischen hellsten und dunkelsten zu unterschiedlich sind, mit dem hellen Pixel gehen. Wenn die Dunkelheit in der Nähe von Schwarz ist mit dem hellen Pixel gehen.

Warum auf dem dunkelen Pixel aussieht selbst? Manchmal ist die Dunkelheit ist nicht in der Nähe von schwarz, und Hinweise auf das Umgebungslicht oder Nebel oder Dunst.

Dies werden Sie sinnvoll, wenn Sie ein schwerer Photoshop-Nutzer sind. Highlights in einem Foto sind unabhängig (oder schwach bezogen) auf die darunter liegende Farbe des Objekts. Sie sind die beste Darstellung der Farbstich des Lichts, es sei denn, das Bild so überbelichtet ist, dass alles, was die CCDs überwältigt hat.

stellen Sie dann die Farben aller Pixel.

Sie müssen schnell RGB zu HSV und HSV in RGB-Funktionen. (Aber vielleicht können Sie in RGB für die Pixelkorrekturen arbeiten mit einem LUT oder linearer Interpolation).

Sie wollen nicht durch die durchschnittliche Pixelfarbe oder beliebteste Farbe gehen. Auf diese Weise liegt Wahnsinn.

Um schnell finden die hellsten Farbe (und die dunkelste), können Sie in RGB arbeiten, aber Sie sollten für grüne haben Multiplikatoren, rot und blau. Auf einem RGB-Monitor, 255 grün heller als 255 rot, die heller als 255 blau. Früher habe ich gute Multiplikatoren in meinem Kopf haben, aber leider haben sie mein Gedächtnis geflohen. Sie können sich wahrscheinlich für sie googeln.

Dies wird in einem Bild nicht, die keine Höhepunkte haben. Eine matte Wand gemalt, zum Beispiel. Aber ich weiß nicht, was Sie können über das tun.


Es gibt viele Verbesserungen an diesen einfachen Algorithmus zu machen. Sie können mehrere helle Pixel, Raster, um das Bild im Durchschnitt und hellen und dunklen Pixeln aus jeder Zelle packen, usw. Sie werden einige offensichtliche Verbesserungen nach der Implementierung des Algorithmus finden.

Andere Tipps

GIMP verwendet anscheinend einen sehr einfachen Algorithmus zur automatischen Weißabgleich. http://docs.gimp.org/en/gimp-layer-white -balance.html

  

Der Weißabgleich Befehl stellt automatisch die Farben der aktiven Schicht durch die Roten Strecken, Grün und Blau-Kanäle getrennt. Um dies zu tun, verwirft es Pixelfarben an jedem Ende des Rot-, Grün- und Blau-Histogramme, die von nur 0,05% der Pixel im Bild verwendet werden, und erstreckt sich über die verbleibende Reichweite so weit wie möglich. Das Ergebnis ist, dass Pixelfarben, die an den Außenkanten der Histogramme sehr selten auftreten (möglicherweise Staubteilchen, etc.) nicht negativ auf die Minimal- und Maximalwerte für das Ausdehnen der Histogramme verwendet beeinflussen, im Vergleich mit Stretch Contrast. Wie „Stretch Contrast“, jedoch kann es in dem resultierenden Bild Farbtonverschiebungen sein.

Es ist ein bisschen Zwicken als hier seit meinem ersten Versuch beschrieben wird bei der Durchführung dieser Arbeiten scheint für die meisten Fotos zu arbeiten, aber andere Fotos scheinen Artefakte zu haben oder enthalten zu viel von entweder rot, grün oder blau: /

@Charles Ma hat vorgeschlagen, den Gimp Weißabgleich-Algorithmus zu verwenden. In python und numpy dies könnte wie folgt aussehen:

# white balance for every channel independently
def wb(channel, perc = 0.05):
    mi, ma = (np.percentile(channel, perc), np.percentile(channel,100.0-perc))
    channel = np.uint8(np.clip((channel-mi)*255.0/(ma-mi), 0, 255))
    return channel

image = cv2.imread("foo.jpg", 1) # load color
imWB  = np.dstack([wb(channel, 0.05) for channel in cv2.split(img)] )

Es ist schnell, einfach und bietet ziemlich anständige Ergebnisse

Weißabgleich-Algorithmen sind hart. Auch Digitalkameras bekommen die falsche einmal in einer Weile, obwohl sie eine Menge zusätzlicher Informationen über das Bild wissen -. Beispielsweise, ob der Blitz verwendet wurde, und der Lichtpegel

Für den Anfang würde ich nur durchschnittlich rot, grün und blau, und verwenden, die als Weißabgleich Punkt. Festlegen von Limits auf sie - bleiben in den Bereichen für Wolfram, fluoreszierend und Tageslicht. Es wird nicht perfekt sein, aber wenn sein falsch, wird es relativ einfach sein, zu erklären, warum.

Eine kürzlich veröffentlichte Algorithmus ist die Farbverteilung Algorithmus und es finden sich hier: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf In dem Papier gibt es auch die Bezugnahme auf den Matlab-Quellcode ( http://www.comp.nus.edu.sg/~whitebal/illuminant/files/ illuminantEstimator.m ). Es ist ein einfacher Algorithmus, der leicht programmiert werden kann, und die Ergebnisse zeigen, ist es sehr schnell sein.

Wenn Sie schnelle und zugleich präzisen Weißabgleich (Farbkonstanz) Algorithmen zusätzlich benötigen, sollten Sie diese Website überprüfen: http://www.fer.unizg.hr/ipg/resources/color_constancy/

Es gibt mehrere Algorithmen mit ihren jeweiligen Quelle codiert, dass nur diejenigen, die Sie suchen sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top