Frage

Ich versuche, die Verbesserung einiger Bilder zu automatisieren, die in einen digitalen Rahmen übertragen werden sollen. Ich habe einen Code, der die Größenordnung verändert, und fügt ein Datum/eine Uhrzeit der am wenigsten signifikanten (kleinsten Details) Ecke des Bild- und Pasten zusammen, um Paare von Porträtbildern zusammenzuarbeiten, um zu vermeiden, dass ein einzelnes Porträt auf dem 41:20-Bildschirm des Rahmens angezeigt wird.

Ich habe einen Helligkeits-Stretching-Filter für die Bilder implementiert, bei denen die Beleuchtung nicht so gut war, und mit dem colorsys.rgb_to_hsv Funktion zum Berechnen von H, S, V -Bändern, der operativen VERTWAHREN und dann auf RGB zurückkehren, bevor Sie einen JPEG im digitalen Rahmen speichern. Offensichtlich braucht die Konvertierung viel Zeit, selbst wenn die Konvertierung verwendet wird itertools Tricks; Ich habe es geschafft, die Dinge mithilfe der Verwendung zu verbessern psyco.

Ich bemerkte jedoch ein Beispiel für den PIL Image.convert wo RGB auf konvertiert werden kann Xyz Farbraum Verwenden einer 4 × 4 -Matrix als zweites Argument an die convert Methode, und ich musste mich fragen:

Wie kann ich RGB in HSV (und dann HSV zurück in RGB) mit einer benutzerdefinierten Matrix in der convert Methodenaufruf? (Kleinere Rundungsfehler sind in diesem Fall nicht wichtig. Daher macht es mir nichts aus, dass jede Band als Serie von 0… 255 Ganzzahlen ausgedrückt wird)

Danke im Voraus.

War es hilfreich?

Lösung

Obwohl ich Referenzen [1] gesehen habe, die behaupten, HSV-Farbraum sei eine lineare Transformation von RGB, was zu implizieren scheint, dass er mit einer Matrix geschehen könnte, konnte ich nicht selbst finden oder bestimmen, was eine solche Matrix ist würde aussehen wie. In gewisser Weise überrascht mich dies nicht wirklich, basierend auf all den [ähnlichen] nicht-matrix-prozeduralen Implementierungen, die ich auch gesehen habe-die Art und Weise, wie sie vorgehen sehen linear.

Wie auch immer, während ich mich damit befasste, bin ich auf einen [etwas veralteten] Artikel im ehemaligen SGI -Forscher gestoßen Paul Haeberli's Online -Computergrafik -Notizbuch mit dem Titel " Matrixoperationen für die Bildverarbeitung Dies beschreibt, wie eine Reihe verschiedener Farbtransformationen mit 4x4 -Matrizen durchgeführt werden können, was Ihnen helfen könnte. Alle angegebenen Beispiele arbeiten direkt auf RGB -Farbbildern und wie geometrische Matrixtransformationen können jede Sequenz mithilfe von Verkettung zu einer einzelnen Matrix kombiniert werden.

Hoffe das hilft.


[1]: Umbau von Farbraum <http://www.poynton.com/pdfs/coloureq.pdf>:

2.7.3 HSL (Farbtonsättigung und Leichtigkeit)

Dies stellt eine Fülle von ähnlichen Farbräumen dar, alternative Namen gehören HSI (Intensität), HSV (Wert), HCI (Chroma / Färbung), HVC, TSD (Farbtonsättigung und Dunkelheit) usw. Die meisten dieser Farbräume sind Lineare Transformationen von RGB und sind daher geräteabhängig und nichtlinear. Ihr Vorteil liegt in extrem intuitiver Art, Farbe anzugeben. Es ist sehr einfach, einen gewünschten Farbton auszuwählen und ihn dann leicht zu modifizieren, indem er seine Sättigung und Intensität eingestellt wird.

Andere Tipps

Die Formel zur Umwandlung eines RGB -Werts in einen HSV -Wert finden Sie hier: http://www.rapidtables.com/convert/color/rgb-to-hsv.htm. Ich brauchte es einmal umgekehrt und hat die folgende Funktion dafür gemacht.

def hsb2rgb(hsb):
    '''
    Transforms a hsb array to the corresponding rgb tuple
    In: hsb = array of three ints (h between 0 and 360, s and v between 0 and 100)
    Out: rgb = array of three ints (between 0 and 255)
    '''
    H = float(hsb[0] / 360.0)
    S = float(hsb[1] / 100.0)
    B = float(hsb[2] / 100.0)

    if (S == 0):
        R = int(round(B * 255))
        G = int(round(B * 255))
        B = int(round(B * 255))
    else:
        var_h = H * 6
        if (var_h == 6):
            var_h = 0  # H must be < 1
        var_i = int(var_h)
        var_1 = B * (1 - S)
        var_2 = B * (1 - S * (var_h - var_i))
        var_3 = B * (1 - S * (1 - (var_h - var_i)))

        if      (var_i == 0):
            var_r = B     ; var_g = var_3 ; var_b = var_1
        elif (var_i == 1):
            var_r = var_2 ; var_g = B     ; var_b = var_1
        elif (var_i == 2):
            var_r = var_1 ; var_g = B     ; var_b = var_3
        elif (var_i == 3):
            var_r = var_1 ; var_g = var_2 ; var_b = B
        elif (var_i == 4):
            var_r = var_3 ; var_g = var_1 ; var_b = B
        else:
            var_r = B     ; var_g = var_1 ; var_b = var_2

        R = int(round(var_r * 255))
        G = int(round(var_g * 255))
        B = int(round(var_b * 255))

    return [R, G, B]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top