2012-11-23 19 views
5

Eventuali duplicati:
“Distance” between colours in PHPrilevare se il colore è nella gamma

voglio rilevare se un valore RGB è una certa tonalità di rosa. Non sono sicuro di come procedere poiché non sembra esserci un intervallo di valori RGB o esadecimali che seguono un ordine lineare per il rosa (una tonalità di rosa è 255, 182, 193; #FFB6C1, mentre un'altra è 238, 162, 173; #EEA2AD). Hai idea di cosa fare, supponendo che conosca l'inizio e la fine dei valori RGB/hex del mio range?

+0

Prova a convertire in HSV e fai il tuo confronto lì. –

+2

leggere attentamente prima di contrassegnare questo un tipo dupe ... – goat

risposta

10

Mi sembra abbastanza lineare. Tuttavia, è necessario comprendere un po 'di teoria dei colori.

Spero che non ti dispiaccia che includo un semplice aggiornamento della teoria dei colori qui prima di rispondere alla tua domanda. Ma aiuta a capire o formulare qualsiasi soluzione.

In primo luogo, sono sicuro che la maggior parte si ricorderà la ruota dei colori che hanno imparato a scuola:

          Red 
     Red      Orange | Purple 
     |        \_|_/ 
     _o_  ---------->    _o_ 
    / \       /| \ 
    Yellow Blue     Yellow | Blue 
             Green 

Beh, abbiamo bisogno di modificarlo un po '. Perché si scopre che il Rosso e il Blu non sono i colori primari in quanto puoi ottenere il rosso mescolando Magenta con Giallo e puoi ottenere Blu mescolando il Ciano con un po 'di Rosso. Così La ruota dei colori modificato utilizza stampa colori: CMY:

 Magenta 
    Red | Blue 
     \_|_/ 
      _o_ 
     /| \ 
    Yellow | Cyan 
     Green 

Questo è fondamentalmente lo spazio colore HSV (con S solito tracciata che va dal centro verso il bordo della ruota e V non tracciati a tutti, ma di solito può essere cambiato da un cursore). Deriva dalla stampa di colori CMY. Quindi, come può aiutarci con i colori dello schermo RGB?

Bene, se lo guardi attentamente noterai che si tratta in realtà di una combinazione di spazio stampa e schermo. In realtà raffigura il rapporto tra CMY e RGB:

 Magenta     Magenta 
    Red | Blue    |   Red  Blue 
     \_|_/      |    \_ _/ 
      _o_   ==  _o_  +  o 
     /| \     / \    | 
    Yellow | Cyan   Yellow Cyan   | 
     Green         Green 

Quindi, qualsiasi colore RGB può essere compreso da comprendere questo ruota dei colori. Ad esempio, non c'è il giallo in RGB. Ma notate che Yellow è l'opposto di Blue. Quindi, per ottenere gialla si sottrarre blu da un colore:

rgb(100,80,10) is a "yellowish" version of rgb(100,80,120) 
      ^          ^

Una volta capito questo ruota dei colori a lavorare con i valori RGB ha più senso. Con una pratica sufficiente puoi comporre e modificare i colori direttamente nella sintassi #rrggbb senza consultare una tabella di colori.

Quindi, per rispondere alla tua domanda. Dite la vostra tonalità obiettivo di rosa è:

rgb(255,182,193) 

Sappiamo due cose circa il colore "rosa":

  1. Noi percepiamo come una sorta di rosso. Quindi ha senso che il colore target abbia un alto valore Rosso (in effetti è massimo).

  2. Lo percepiamo come un rosso molto leggero. Quindi ha senso che anche i componenti non-rossi siano piuttosto alti (entrambi sopra i 150).

Quindi, per ottenere sfumature vicino al vostro colore di destinazione abbiamo bisogno:

  1. valore di R significativamente più alto rispetto G o B.
  2. Tutti i valori ad essere molto elevato (superiore a 150 o giù di lì) .

Con questa definizione possiamo identificare rosa come:

// Pseudo code: 

is_pink (R,G,B) { 
    return R > 200 && // make sure R is high 
      G > 150 && // make sure G & B are relatively high 
      B > 150 && 
      R > G && // make sure G & B are not higher than R 
      R > B; 
} 

Possiamo aggiungere un'altra condizione di rifiutare "rosa" che è leggermente bluastra o verdastra facendo in modo che G & B sono abbastanza simili:

// Pseudo code: 

is_pink (R,G,B) { 
    return R > 200 && 
      G > 150 && 
      B > 150 && 
      R > G && 
      R > B && 
      abs(G-B) < 20; // make sure it's neither bluish or greenish 
} 

È possibile modificare i valori di 200, 150 e 20 secondo i propri gusti di pinkishness ma vedrete che se applichiamo la funzione di cui sopra a entrambi i colori di prova (255,182,193) e 012.384.425,449 milasaranno entrambi identificati come "rosa".

+0

Questa è una delle migliori risposte che ho letto su Stackoverflow. Grazie mille. – JSHelp

Problemi correlati