Domanda

Sto cercando di automatizzare la valorizzazione di alcune immagini che devono essere trasferito in una cornice digitale. Ho codice in luogo che ridimensiona, aggiunge una data / ora per i meno significativi (minimi dettagli) angolo dell'immagine e paste insieme coppie di immagini ritratto di evitare la visualizzazione di un singolo ritratto a schermo a bassa risoluzione del telaio 41:20.

Ho implementato un filtro luminosità che si estende per quelle immagini dove l'illuminazione non era così buono, utilizzando il colorsys.rgb_to_hsv funzione per calcolare H, S, bande V, operante sul V uno e poi riconversione RGB prima di salvare un JPEG nella cornice digitale. Ovviamente, la conversione prende un sacco di tempo, anche utilizzando itertools trucchi; Sono riuscito a migliorare le cose utilizzando psyco .

Tuttavia, ho notato un esempio per il PIL Image.convert dove RGB possono essere convertiti in XYZ spazio colore utilizzando una matrice 4 × 4 come secondo argomento al metodo convert , e ho avuto modo di chiedersi:

Come posso convertire RGB per HSV (e poi di nuovo a HSV RGB) utilizzando una matrice personalizzata nella chiamata di metodo convert? (Minor errori di arrotondamento non sono importanti, in questo caso, quindi non mi dispiace che ogni band sarà espressa come una serie di 0 ... 255 numeri interi)

Grazie in anticipo.

È stato utile?

Soluzione

Anche se ho visto i riferimenti [1] che la richiesta HSV spazio colore è la trasformazione lineare da RGB, che sembrerebbe implicare che potrebbe essere fatto con una matrice, sono stato in grado di trovare o stabilire per me solo quello tale matrice una sarebbe simile. In un certo senso questo in realtà non mi sorprende sulla base di tutte le non-matrice implementazioni procedurali [simile] Ho visto anche - il modo in cui vanno circa non lo fa aspetto linear

In ogni caso, mentre guardando in questo, mi sono imbattuto in un [un po 'datato] articolo ex ricercatore SGI Paul Haeberli 's linea notebook computer grafica dal titolo Matrix operazioni per Image Processing che descrive come fare una serie di diverse trasformazioni di colore utilizzando 4x4 matrici che potrebbero aiutarvi. Tutti gli esempi riportati operare direttamente sulle immagini a colori RGB e, come trasformazioni geometriche matrice, qualsiasi sequenza di essi possono essere combinati in un'unica matrice utilizzando concatenazione.

Spero che questo aiuti.


[1]: Color Space conversioni << a href = "http://www.poynton.com/PDFs/coloureq.pdf" rel = "nofollow"> http: //www.poynton. com / PDF / coloureq.pdf >

2.7.3 HSL (Tonalità Saturazione e Luminosità)

Questo rappresenta un patrimonio di simile spazi colore, nomi alternativi includere HSI (intensità), HSV (valore), HCI (crominanza / policromia), HVC, TSD (saturazione tonalità e oscurità) etc. La maggior parte di questi spazi di colore sono trasformazioni lineari da RGB e sono pertanto dispositivo dipendente e non lineare. Le loro bugie vantaggio in la maniera estremamente intuitiva specificare il colore. E 'molto facile da selezionare la tonalità desiderata e poi modificare leggermente regolando la saturazione e intensità.

Altri suggerimenti

La formula per trasformare un valore RGB per un valore di HSV può essere trovato qui: http://www.rapidtables.com/convert/color/rgb-to-hsv.htm . Una volta ho avuto bisogno il contrario, e feci la seguente funzione per esso.

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top