Domanda

che sto facendo un po 'di elaborazione delle immagini e ho bisogno di un algoritmo di bilanciamento automatico del bianco che non è troppo intenso in termini di tempo di calcolo della CPU. Tutti i consigli?

EDIT: e se è rilevante per l'efficienza, sarò implementazione in Java con le immagini a colori come un array di interi

.
È stato utile?

Soluzione

Un algoritmo relativamente semplice è quello di mediare le tonalità (in HSV o HSL) dei pixel più luminosi e scure dello schermo. In un pizzico, andare con solo il pixel più luminoso. Se le tonalità tra chiari e più scuri sono troppo diversi, andare con il pixel luminoso. Se il buio è quasi nero andare con il pixel luminoso.

Perché anche guardare il pixel scuro? A volte il buio non è vicino nero e accenni alla luce ambiente o nebbia o foschia.

Questo renderà senso per te, se sei un utente pesante di Photoshop. Evidenza in una foto sono correlati (o debolmente correlato) per il colore sottostante dell'oggetto. Essi sono la migliore rappresentazione del cast colore della luce, a meno che l'immagine è così sovraesposta che tutto ciò che ha travolto i CCD.

Quindi regolare le tonalità di tutti i pixel.

È necessario RGB veloce da HSV e HSV alle funzioni RGB. (Ma forse si può lavorare in RGB per le correzioni pixel con una LUT o interpolazione lineare).

Non si vuole andare in base al colore dei pixel nella media o colore più popolare. In questo modo si trova la follia.

Per trovare rapidamente il colore più brillante (e il più scuro), è possibile lavorare in RGB, ma si dovrebbe avere moltiplicatori per il verde, rosso e blu. Su un monitor RGB, 255 verde è più luminoso 255 rosso che è più luminoso 255 blu. Ho usato per avere buoni moltiplicatori nella mia testa, ma ahimè, sono fuggiti la mia memoria. Probabilmente si può google per loro.

Questo fallirà in un'immagine che non ha punti salienti. Un opaco muro dipinto, per esempio. Ma io non so che cosa si può fare al riguardo.


Ci sono molti miglioramenti per rendere a questo semplice algoritmo. Puoi media più pixel luminosi, griglia l'immagine e afferrare pixel chiari e scuri da ciascuna cella, ecc Troverete alcune modifiche evidenti dopo l'implementazione dell'algoritmo.

Altri suggerimenti

GIMP usa apparentemente un algoritmo molto semplice per il bilanciamento automatico del bianco. http://docs.gimp.org/en/gimp-layer-white -balance.html

  

Il comando bilanciamento del bianco regola automaticamente i colori del livello attivo stirando il rosso, verde e blu canali separatamente. Per fare questo, scarta i colori dei pixel ad ogni estremità del rosso, verde e blu istogrammi che vengono utilizzati solo del 0,05% dei pixel nell'immagine e si estende l'autonomia residua, per quanto possibile. Il risultato è che i colori dei pixel che si verificano molto raramente ai bordi esterni delle istogrammi (forse bit di polvere, etc.) non influenzano negativamente i valori minimo e utilizzati per l'allungamento gli istogrammi, in confronto con ampliamento contrasto. Come “ampliamento contrasto”, tuttavia, ci possono essere variazioni di tonalità nell'immagine finale.

C'è un po 'più di tweaking di quanto descritto qui dal mio primo tentativo di attuare questo funziona sembra funzionare per la maggior parte delle foto ma altre foto sembrano avere artefatti o contengono troppo di uno rosso verde o blu: /

@Charles Ma ha suggerito di utilizzare l'algoritmo di bilanciamento del bianco Gimp. In python e numpy questa potrebbe essere la seguente:

# 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)] )

è veloce, semplice e fornisce risultati abbastanza decente

algoritmi di bilanciamento del bianco sono difficili. Anche le fotocamere digitali ottengono il torto di tanto in tanto, anche se sanno un sacco di informazioni in più circa l'immagine -. Come ad esempio se è stato utilizzato il flash, e il livello di luce

Per cominciare, vorrei solo media rosso, verde e blu, e l'uso che come punto di bilanciamento del bianco. Impostare i limiti su di esso - rimanere entro i limiti di tungsteno, fluorescente, e la luce del giorno. Non sarà perfetto, ma quando il suo male, sarà relativamente facile da spiegare perché.

Un algoritmo pubblicato di recente è l'algoritmo di distribuzione del colore e può essere trovato qui: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf Nel documento c'è anche il riferimento al codice sorgente Matlab ( http://www.comp.nus.edu.sg/~whitebal/illuminant/files/ illuminantEstimator.m ). Si tratta di un semplice algoritmo che può essere facilmente programmato ei risultati mostrano che sia molto veloce.

Se avete bisogno di ulteriori veloce e allo stesso tempo accurata bianco bilanciamento algoritmi (colore costanza), si dovrebbe verificare nel sito: http://www.fer.unizg.hr/ipg/resources/color_constancy/

Ci sono diversi algoritmi con la loro rispettiva sorgente in codice che potrebbe essere solo quelli che cercate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top