2015-08-12 40 views
15

Quello che sto cercando di fare è verificare se un pixel è blu o meno.Come definire la gamma chiara per il colore dei pixel

Ad esempio: il colore blu è in RGB definito come rgb (0,0,255). Le profondità colore tipiche sono 8 bit (256 colori), 16 bit (circa 65 mila), 24 bit (circa 16 milioni) e 32 bit (oltre 4 miliardi di colori diversi). Quindi c'è chiaramente più di 1 sfumatura di blu.

Come definire l'intervallo del colore blu e il test per ciascun pixel se è blu o no? E cosa devo tenere a mente riguardo alle diverse profondità?

Il mio codice finora è:

BufferedImage image = ImageIO.read(file); 

// Getting pixel color by position x and y 
for (int i = 0; i < image.getWidth(); i++) { 
    for (int j = 0; j < image.getHeight(); j++) { 
     int clr = image.getRGB(i, j); 

Nota 1:

http://www.workwithcolor.com/cyan-blue-color-hue-range-01.htm

Il problema qui è, ciò che è tra i passaggi di colore?

Un esempio sarebbe grandioso.

Nota 2:

Ho appena trovato una presentazione sul tema che mi interessa:

http://cstwiki.wtb.tue.nl/images/06-opencv.pdf

A pagina 13 si può vedere la definizione di rosso . Ma come puoi definire gli altri colori?

+1

All'inizio pensavo che potessi semplicemente impostare la gamma per i colori RGB, ma questo non funzionerebbe. come puoi vedere nella tabella dei colori: http://2.bp.blogspot.com/_DmvFk3aIxDI/S9Kbb5BOjEI/AAAAAAAAADk/MVrj60t6ec8/s1600/cc.png blu inizia da # 000066 e # 66FFFF è ancora blu. Ma non tutto nel mezzo è blu. –

+0

ho trovato questo: http://stackoverflow.com/questions/30361786/how-to-tell-visible-color-from-rgb-values ​​ dovrebbe aiutare. –

+0

No, non è così! Se selezioni il valore di blu in HUE, puoi comunque modificare i parametri di Saturazione e Valore/Luminosità in modo da non vedere più alcun blu. Prova qui: http://colorizer.org/ –

risposta

8

A mio parere, il modo più semplice è convertire il formato del colore in HSV/HSB e quindi selezionare l'intervallo blu per Tonalità. L'intervallo esatto potrebbe essere un problema, ma per lo più uso da 165 (sotto è verde) a 240 (sopra è viola/viola). Saturazione e Valore/Luminosità controllano solo le sfumature, ma si tenga presente che la saturazione prossima a 0 sarebbe piuttosto grigia con qualche sfumatura bluastra e Valore vicino a 0 sarebbe quasi nero. Per questo motivo puoi controllare anche Saturazione> 10 e Valore> 15, ma ovviamente puoi scegliere i tuoi valori in base alle tue esigenze.

codice di esempio (non testato):

boolean isBlue(int rgb){ 
    Color color = new Color(rgb); 
    float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null); 
    // now [0] is hue, [1] saturation and [2] value/brightness 
    // all values are between 0 and 1 so you must divide hue by 360 and others by 100 
    if(hsb[0] > 165/360 && hsb[0] < 240/360 && hsb[1] > 0.1 && hsb[2] > 0.15) 
     return true; 
    return false; 
} 

Wiki about HSV

RGBtoHSB javadoc

Color picker to check colors in different systems

+0

Sì, questa è probabilmente un'approssimazione ordinaria. Stavo ancora cercando un modo per aggirare il "scegliere i propri valori per soddisfare le proprie esigenze". –

+1

Bene, la domanda difficile qui è esattamente ciò di cui hai bisogno. Se vuoi obbedire ai toni scuri e "nuvolosi", imposta sia la saturazione sia il valore per essere più di 50 (o 0,5 nel codice). Nel commento precedente hai suggerito che stai cercando 'cielo sereno', probabilmente è ovunque, da blu navy a ciano saturo basso, quindi proverei con saturazione> 25 (di seguito è troppo 'nuvoloso') e valore> 50 (di seguito è piuttosto toni del cielo notturno). Nella risposta ho fornito una definizione blu piuttosto universale dai toni scuri ai toni chiari, e dal tuquoise fino all'indaco. – xnor

+1

@ JürgenK. Se hai la tua definizione di blu, per favore aggiungila alla tua domanda. Se chiedi alle persone di definire un colore per te, ottieni la loro definizione approssimativa. E in alcune situazioni, le persone vedono [un abito blu come bianco] (https://en.wikipedia.org/wiki/The_dress). –

0

Tecnicamente, al di sotto dovrebbe essere l'implementazione per sfumature blu.

boolean isBlueShade(int r, int g, int b) 
{ 
    return (r == g) && (r != b); 
} 

Possiamo sostenere che il CIANO è anche blu. Ma tecnicamente non è blu. Se l'applicazione richiede che alcuni colori correlati siano blu, l'implementazione del metodo sopra riportato per includere tale controllo dell'intervallo.

Sto semplicemente modificando il metodo precedente solo per comunicare ciò che ho pensato chiaramente, anche se non è la soluzione prevista.

+0

questa non è una risposta alla domanda. la domanda è come definire il controllo dell'intervallo per il colore blu –

+1

Basandosi su questa definizione, anche il bianco e il nero o addirittura la scala di grigi è blu. RGB non è il modello intuitivo, ciò che può essere facilmente utilizzato per distinguere i colori. – xnor

4

Nello spazio colore RGB questo non è facile da fare. Per uno, il modo in cui i colori vengono visualizzati dipende dal dispositivo, cioè, qualsiasi valore RGB che si sceglie di visualizzare potrebbe apparire molto diverso su schermi diversi. Ma anche quando questo può essere controllato, i colori a cui sono stati assegnati nomi specifici in inglese non occupano necessariamente lo stesso volume all'interno del cubo di colori RGB, né in termini di dimensioni o forma. Per questo motivo ci sono alcuni modelli di colori che cercano di approssimare la percezione umana di colori.

Un contendente per questo è lo spazio colore CIELab. Il "Lab" si riferisce a come i colori sono rappresentati in questo modello: tramite la luminosità L del colore, la posizione del colore sull'asse rosso/magenta e verde (a) e la sua posizione sull'asse giallo e blu (b). Sfortunatamente, non esistono semplici formule per la conversione tra valori RGB o CMYK e L a b *, perché i modelli di colori RGB e CMYK dipendono dal dispositivo. I valori RGB o CMYK devono prima essere trasformati in uno spazio colore assoluto specifico, ad esempio sRGB o Adobe RGB. Questa regolazione dipenderà dal dispositivo, ma i dati risultanti dalla trasformazione saranno indipendenti dal dispositivo.