Miglior algoritmo per la corrispondenza dei colori.

Ho un array di circa 200 colori in formato RGB. Voglio scrivere un programma che prende qualsiasi colore RGB e tenta di associare un colore matrice, che è più “simile”.

Ho bisogno di una buona definizione di “simile”, che è il più vicino possibile alla percezione umana.

Voglio anche mostrare alcune informazioni circa la corrispondenza di precisione. Per esempio, il nero-bianco: 100% e per un colore simile con un po ‘ di tonalità diverse: -4%.

Ho bisogno di utilizzare le reti neurali? C’è un’alternativa più facile?

  • È la domanda circa un suggerimento per ciò che può essere una buona somiglianza funzione, o si tratta di un algoritmo per trovare rapidamente il colore più simile(s) nella matrice, relativa ad un dare colore ?
  • Entrambi. Se prima ho bisogno di una definizione di somiglianza prima che io possa provare casse algoritmo. Penso che “percettivamente simili” è quello che stavo cercando.

 

5 Replies
  1. 36

    Convertire tutti i colori per il Spazio colore CIE-Lab e calcola la distanza in che spazio

    deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2)
    

    Colori con il più basso deltaE più percettivamente simili tra loro.

    • Grazie, è esattamente quello di cui ho bisogno.
    • Tenete a mente che non è necessario fare il sqrt – sqrt è una funzione crescente, quindi questo passaggio è superfluo.
    • Hai ragione, se si sta facendo niente di più che l’ordinamento, il quadrato della distanza è buono come la distanza stessa. Se si desidera confrontare il “modo diverso”, quindi lasciare in.
    • CIE Lab è usato esattamente questo modo di fare più vicina-colore calcoli in tutti i principali sistemi di gestione del colore, come quelli di Apple, Microsoft e Adobe. E ‘ un argomento molto interessante.
    • Che cosa è un buon valore basso per il deltaE dalla vostra esperienza? cioè quando deltaE < 14, i colori sono percettivamente simili.
    • Come di consueto con la scala di valori di Laboratorio, una differenza di circa deltaE=1 è la più piccola differenza che la gente può vedere, e la differenza più grande rappresentabile su un monitor è forse 150-200. Sta a voi decidere dove “simile” finisce e non “simile” inizia 🙂

  2. 4

    No, non hai bisogno di reti neurali qui! Basta considerare un valore di colore HSL un vettore e la definizione di un ponderato modulo funzione per il vettore come questo:

    modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1);
    
    where a,b,c are weights you should decide based on your visual definition of what
    creates a bigger difference in perceived color - a 1% change in Hue or a 1%
    change in Saturation
    

    Vorrei suggerire di utilizzare a = b = 0.5 e c = 1

    Infine, scoprire la gamma del tuo modulo vorresti prendere e definire colori simili a quelli che sono i loro moduli molto vicini tra loro (per esempio il 5%)

    • Quella è una buona alternativa semplice. La conversione da RGB a HSL è molto più semplice di quanto la conversione da RGB a Lab. 🙂
    • Ok, vado a provare per primo.
    • Crimson, si può verificare la matematica con il modulo qui? Non credo sia giusto. Volete qualcosa di più simile a a * (H1 - H2)**2 + …, sì?
    • sarebbe meglio, per calcolare entrambi i moduli e poi confrontarli, piuttosto che solo di calcolare il modulo del vettore differenza
    • Ma non volete moltiplicare i colori, etc. di due colori diversi, e tu?
    • Ciao, mi chiedevo che cosa si intende per “scoprire la gamma del tuo modulo dovrebbe prendere”? Non ci basta confrontare i due moduli di colori con abs(mod1 – mod2) o qualcosa o fa “scoprire la gamma” significa qualcosa di diverso?

  3. 1

    Vorrei anche sottolineare il minimi quadrati metodo, come qualcosa di leggermente più semplice. Che è, si prende la differenza di un numero, quadrato, quindi la somma di tutte queste differenze al quadrato.

  4. 0

    Stavo cercando la cosa, ma non avendo trovato un sacco di risposte in giro ho deciso di creare questa piccola libreria.

    https://github.com/sebastienjouhans/c-sharp-colour-utilities

    • Si prega di essere molto attenti quando si postano le risposte che promuovere il proprio lavoro. Fare in modo che effettivamente rispondere alla domanda qui e utilizzare solo il vostro blog/come fonte di backup e di riferimento. Al momento questo è probabilmente essere contrassegnati come spam.
  5. 0

    Il modo più veloce che ho raggiunto questo è quello di aggiungere i colori di un octree e poi, proprio come con la quantizzazione, è possibile utilizzare ogni bit di guida è la più profonda nodo figlio. Una volta che si può andare più in profondità, o sei al livello più profondo (il bit più basso), nel qual caso hai colpito il colore esatto, o il prossimo nodo figlio non esiste, a questo punto ti serve solo un bambino con un po ‘ più vicino alla bit che si sta cercando e che è il colore più vicino. E ‘ un diavolo di un molto più veloce di conversione di tutto per HSL e indietro, o il calcolo di ogni singola distanza Euclidea.

    Ecco il mio codice su CodeProject: https://www.codeproject.com/tips/1046574/octtree-based-nearest-color-search

Lascia un commento