PHP中颜色之间的"距离"

Phi*_*hil 13 php colors

我正在寻找一种能够准确地将两种颜色之间的距离表示为数字或类似物的功能.

例如,我希望有一个HEX值或RGB数组的数组,我想在给定颜色的数组中找到最相似的颜色

例如.我传递一个RGB值的函数,并返回数组中"最接近"的颜色

Byr*_*ock 19

每种颜色在HEX代码中表示为元组.要确定紧密匹配,您需要分别减去每个RGB组件.

例:

Color 1: #112233 
Color 2: #122334
Color 3: #000000

Difference between color1 and color2: R=1,  G=1   B=1  = 0x3 
Difference between color3 and color1: R=11, G=22, B=33 = 0x66

So color 1 and color 2 are closer than
1 and 3.
Run Code Online (Sandbox Code Playgroud)

编辑

所以你想要最接近的命名颜色?使用每种颜色的十六进制值创建一个数组,迭代它并返回名称.像这样的东西;

function getColor($rgb)
{
    // these are not the actual rgb values
    $colors = array(BLUE =>0xFFEEBB, RED => 0x103ABD, GREEN => 0x123456);

    $largestDiff = 0;
    $closestColor = "";
    foreach ($colors as $name => $rgbColor)
    {
        if (colorDiff($rgbColor,$rgb) > $largestDiff)
        {
            $largestDiff = colorDiff($rgbColor,$rgb);
            $closestColor = $name;
        }

    }
    return $closestColor;

}

function colorDiff($rgb1,$rgb2)
{
    // do the math on each tuple
    // could use bitwise operates more efficiently but just do strings for now.
    $red1   = hexdec(substr($rgb1,0,2));
    $green1 = hexdec(substr($rgb1,2,2));
    $blue1  = hexdec(substr($rgb1,4,2));

    $red2   = hexdec(substr($rgb2,0,2));
    $green2 = hexdec(substr($rgb2,2,2));
    $blue2  = hexdec(substr($rgb2,4,2));

    return abs($red1 - $red2) + abs($green1 - $green2) + abs($blue1 - $blue2) ;

}
Run Code Online (Sandbox Code Playgroud)

  • colofDiff函数很好,但必须修复一个bug,"返回abs($ red1 - $ red2)+ abs($ green1 - $ green2)+ abs($ blue1 - $ blue2);" (3认同)

Gru*_*rig 13

这是一篇关于这个主题的论文,应该给出一个很好的答案.

我认为首先转换为HSL/HSV也是一个好主意,但后来我意识到,在S&L/V的极端值下,H无关紧要,而在中间,它最重要.

我想如果你想要一个简单的解决方案,那么留在RGB空间会更明智.我会用笛卡尔距离.如果你正在考虑颜色R G BRi Gi Bi了几个i,你希望i最小化

(R - Ri)^2 + (G - Gi)^2 + (B - Bi)^2
Run Code Online (Sandbox Code Playgroud)


Dav*_*ble 8

首先,您必须选择您想要进行颜色比较的适当颜色空间(RGB,HSV,HSL,CMYK等).

假设您想知道三维RGB空间中两个点之间的距离是多少,您可以计算它们之间的毕达哥拉斯距离,即:

d2 = (r1 - r2)**2 + (g1 - g2)**2 + (b1 - b2)**2;
Run Code Online (Sandbox Code Playgroud)

这实际上为您提供了距离的平方.(如果仅比较平方值,则不需要取平方根.)

这假定您要同等地处理R,G和B值.如果您更喜欢对各个颜色分量进行加权,例如将RGB转换为灰度时会发生什么,则必须为每个距离项添加一个系数,即

d2 = 30*(r1-r2)**2 + 59*(g1-g2)**2 + 11*(b1-b2)**2;
Run Code Online (Sandbox Code Playgroud)

这假设流行从RGB转换为灰度为30%红色+ 59%绿色+ 11%蓝色.

更新

最后的等式应该是

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;
Run Code Online (Sandbox Code Playgroud)