2013-06-02 18 views
6

Hedefim, RGB dizisine en yakın eşleşmeyi bulmak için RGB dizisinden. Zaten bir resimdeki her bir pikselden geçen bir işlevi oluşturdum. İhtiyacım olan tek şey, resimdeki her pikselin en yakın rengini dizisinden renkle bulmaktır.PHP - Listeden en yakın RGB'yi bulmak için en yakın RGB'yi bulun

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

Ben renk sayısını azaltmak ve veritabanında daha sonra karşılaştırmak için 8bits için resmi dönüştürme çalıştı ama bu sadece iyi bir fikir gibi görünmüyor.

+0

dizileri toplayın ve en küçük mutlak farkı karşılaştırın? – bwoebi

+2

Ne [_distance metric_] (http://stackoverflow.com/a/1767967/1553481) kullanmak istersiniz? Mutlak fark, kare mutlak fark veya belki de algısal bir metrik? – likeitlikeit

+0

algısal metrik. –

cevap

6

böyle Deneyin: Bu çözümün

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

avantajı kolayca karşılaştırma işlevi yerine olmasıdır.

Kullanılabilmesi de olasıdır. Yasal Uyarı:map'dan yararlanmanın daha zarif yolları olabilir.

+0

İşleviniz düzgün çalışmıyor gibi görünüyor. Renkleri bir şekilde sıralamak zorunda olduğumdan emin değilim. –

+0

Sıralama kesinlikle gerekli değildir. Sorun ne? – likeitlikeit

+0

GirişColor'unu diziye (20,22,22) ayarlıyorum ve verilen sonuç 22,221,221'dir, ancak 25,22,22 olması gerekir. Hangisi daha yakın. –

İlgili konular