2013-06-02 7 views
6

Il mio obiettivo è trovare la corrispondenza più vicina di RGB rispetto allo RGB dall'array. Ho già creato una funzione che scorre attraverso ogni pixel di un'immagine. L'unica cosa di cui ho bisogno ora è di trovare il colore più vicino di ogni pixel dell'immagine al colore dell'array.PHP - Trova il RGB più vicino a RGB predefinito dalla lista

$colors = array(
    array(221,221,221), 
    array(219,125,62), 
    array(179,80,188), 
    array(107,138,201), 
    array(177,166,39), 
    array(65,174,56), 
    array(208,132,153), 
    array(64,64,64), 
    array(154,161,161), 
    array(46,110,137), 
    array(126,61,181), 
    array(46,56,141), 
    array(79,50,31), 
    array(53,70,27), 
    array(150,52,48), 
    array(25,22,22) 
); 

ho provato a convertire foto per 8bits per ridurre il numero di colori e di confrontarli più tardi nel database, ma che proprio non sembra essere una buona idea.

+0

sommare gli array e confrontare la differenza assoluta più piccola? – bwoebi

+2

Cosa vorresti usare [_distance metric_] (http://stackoverflow.com/a/1767967/1553481)? Differenza assoluta, differenza assoluta al quadrato o forse una metrica percettiva? – likeitlikeit

+0

metrica percettiva. –

risposta

6

Prova in questo modo:

$inputColor = array(20,40,80); 

function compareColors($colorA, $colorB) { 
    return abs($colorA[0] - $colorB[0]) + abs($colorA[1] - $colorB[1]) + abs($colorA[2] - $colorB[2]); 
} 

$selectedColor = $colors[0]; 
$deviation = PHP_INT_MAX; 

foreach ($colors as $color) { 
    $curDev = compareColors($inputColor, $color); 
    if ($curDev < $deviation) { 
     $deviation = $curDev; 
     $selectedColor = $color; 
    } 
} 

var_dump($selectedColor); 

Il vantaggio di questa soluzione è che è possibile sostituire facilmente la funzione di confronto. Potrebbe anche essere possibile utilizzare

Declinazione di responsabilità: Potrebbero esserci modi di implementazione più eleganti, forse con lo sfruttamento di map.

+0

La tua funzione non sembra funzionare correttamente. Non sono sicuro che forse ho bisogno di ordinare i miei colori in qualche modo? –

+0

L'ordinamento non è certamente necessario. Qual è il problema? – likeitlikeit

+0

Ho impostato inputColor su array (20,22,22) e il risultato dato è 221,221,221, sebbene debba essere 25,22,22. Che è molto più vicino –