一尘不染

RGB最接近预定义的颜色

php

编辑:

给出答案后,我执行了此功能

function grabclosestcolor($r, $g, $b){
    $colors = array(array(124,12,12),array(7,7,11),array(110,224,219),array(123,123,123),array(124,177,74),array(130,86,53),array(77,77,77),array(164,124,68),array(204,196,132),array(164,148,147),array(163,123,67),array(26,122,26), array(195,195,50),array(193,193,193),array(255,248,73),array(243,243,243));
    $differencearray = array();
    foreach ($colors as $value) {
        $difference = sqrt(pow($r-$value[0],2)+pow($g-$value[1],2)+pow($b-$value[2],2));
        array_push($differencearray, $difference);
        $smallest = min($differencearray);
        $key = array_search($smallest, $differencearray);
        return $colors[$key];
        }
    }

我的目标是这个。我抓取图片并遍历每个像素,然后抓取其x,y和rgb。

我拥有一个预定义的数组,而不是仅仅抓住rgb,我正在寻找从我抓取的颜色到预定义数组的最接近的匹配项。这里的目标是仅使用预定义数组中的颜色。这是我的颜色数组。

$colors = array(array(124,12,12),array(7,7,11),array(110,224,219),array(123,123,123),array(124,177,74),array(130,86,53),array(77,77,77),array(164,124,68),array(204,196,132),array(164,148,147),array(163,123,67),array(26,122,26), array(195,195,50),array(193,193,193),array(255,248,73),array(243,243,243));

这是我现有的遍历所有内容的代码。

$int = imagesx($im) - 1;
$int2 = imagesy($im) - 1;
$start2 = 0;
do{
    $start = 0;
    do{
        $rgb = imagecolorat($im, $start, $start2);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;
        $value = rgb2hex($r,$g,$b).":$start:$start2";
        array_push($colorsofimage, $value);
    } while($int > $start++);
} while($int2 > $start2++);

rgb2hex是用户定义的函数,但是我要完成的功能是使用该函数更改该函数以获取最接近的颜色。

$ colorsofimage包含一个十六进制的每个像素信息的数组:x:y我希望它是rgb2hex(NEWFUNCTION($ r,$ g,$ b));
这样新的十六进制就是预定义数组中的1。

希望您能理解,因为我不知道如何做,因为我不知道颜色的算法。


阅读 343

收藏
2020-05-29

共1个答案

一尘不染

您必须计算每种颜色的距离,然后选择最小的颜色。

有几种方法可以做到这一点。一种简单的方法是计算距离为:

sqrt((r-r1)^2+(g-g1)^2+(b-b1)^2)

更好的方法可能是合并加权值以计算距离,例如转换RGB-> YUV时使用的值:

Y = 0.299 * R + 0.587 * G + 0.114 * B

在这种情况下,您将使用

sqrt(((r - r1) * .299)^2 + ((g - g1) * .587)^2 + ((b - b1) * .114)^2)

当然,由于您不需要确切的距离,只需进行比较即可,您可能并且应该跳过平方根,进行最后的计算:

((r - r1) * .299)^2 + ((g - g1) * .587)^2 + ((b - b1) * .114)^2
2020-05-29