2013-06-02 11 views
6

Mein Ziel ist es, die beste Übereinstimmung von RGB im Vergleich zu RGB aus dem Array zu finden. Ich habe bereits eine Funktion erstellt, die jedes Pixel in einem Bild durchläuft. Das einzige, was ich jetzt brauche, ist Finde die nächste Farbe jedes Pixels im Bild mit der Farbe aus dem Array.PHP - Finden Sie den nächsten RGB zu vordefinierten RGB aus der Liste

$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) 
); 

Ich versuchte Bild zu 8bits Umwandlung Anzahl der Farben zu reduzieren und sie später in der Datenbank vergleichen, aber das scheint nicht nur eine gute Idee zu sein.

+0

Summe der Arrays und Vergleich der kleinsten absoluten Differenz? – bwoebi

+2

Was [_distance metric_] (http://stackoverflow.com/a/1767967/1553481) möchten Sie verwenden? Absoluter Unterschied, quadratischer absoluter Unterschied oder vielleicht eine Wahrnehmungsmetrik? – likeitlikeit

+0

Perzeptionsmetrik. –

Antwort

6

Probieren Sie es wie folgt aus:

$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); 

Der Vorteil dieser Lösung ist, dass man leicht die Vergleichsfunktion ersetzen können. Es könnte auch möglich sein,

zu verwenden. Haftungsausschluss: Es könnte elegantere Arten der Implementierung geben, vielleicht unter Verwendung map.

+0

Ihre Funktion scheint nicht richtig zu funktionieren. Ich bin mir nicht sicher, vielleicht muss ich meine Farben irgendwie sortieren? –

+0

Sortierung ist sicherlich nicht notwendig. Was ist das Problem? – likeitlikeit

+0

Ich setze die inputColor auf Array (20,22,22) und das angegebene Ergebnis ist 221,221,221, obwohl es 25,22,22 sein sollte. Was viel näher ist. –