2013-06-02 1 views
6

내 목표는 RGB과 배열에서 RGB과 가장 가까운 것을 찾으십시오. 나는 이미 그림에서 모든 픽셀을 반복하는 함수를 만들었습니다. 필자가 지금 필요로하는 것은 에있는 그림의 각 픽셀에 가장 가까운 색을 배열의 색으로 찾는 것입니다.PHP - 목록에서 미리 정의 된 RGB와 가장 가까운 RGB 찾기

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

나는 색상의 수를 줄이고 데이터베이스에 나중에 비교하기 위해 8 비트에 사진을 변환 시도했지만 그건 그냥 좋은 생각이 될 것 같지 않습니다.

+0

은 어레이를 합계하고 가장 작은 절대 차를 비교합니다. – bwoebi

+2

[_distance metric_] (http://stackoverflow.com/a/1767967/1553481) 무엇을 사용 하시겠습니까? 절대적인 차이, 제곱 된 절대 차이, 또는 아마도 지각적인 측정 기준? – likeitlikeit

+0

지각 메트릭. –

답변

6

은 다음과 같이 그것을 시도 :이 솔루션의

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

장점은 쉽게 비교 기능을 대체 할 수 있다는 것입니다. 또한 사용 가능할 수도 있습니다

면책 조항 : 구현 방법이 더 복잡 할 수도 있습니다. 아마도 map을 활용할 수 있습니다.

+0

기능이 제대로 작동하지 않는 것 같습니다. 어떻게 든 내 색상을 정렬해야할지 모르겠다. –

+0

정렬은 반드시 필요한 것은 아닙니다. 뭐가 문제 야? – likeitlikeit

+0

inputColor를 array (20,22,22)로 설정하고 25,22,22 여야하지만 주어진 결과는 221,221,221입니다. 어느 쪽이 더 가깝습니다. –

관련 문제