PHP - 从列表中找到最接近预定义RGB的RGB

8

我的目标是找到与数组中的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位以减少颜色数量,并在数据库中进行比较,但这似乎不是一个好主意。


对数组求和并比较最小绝对差? - bwoebi
2
你想使用什么距离度量方法?绝对差异、平方绝对差异,还是感知度量?distance metric - likeitlikeit
你已经确定了一个合适的感知度量标准吗? - likeitlikeit
我在mySQL中定义了800多个不同的RGB值。 - Bartek Szablowski
如果你有那么多颜色,使用不同的度量标准可能只会有微小的差异。你尝试过下面的代码了吗? - likeitlikeit
是的,我已经尝试过了,但似乎它不能正常工作。 - Bartek Szablowski
1个回答

7

可以尝试这样做:

$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

你的函数似乎不能正常工作。我不确定,也许我需要以某种方式对颜色进行排序? - Bartek Szablowski
排序绝对不是必要的。问题出在哪里? - likeitlikeit
我将inputColor设置为array(20,22,22),但是给出的结果是221,221,221,尽管它应该是25,22,22。这个结果更接近正确答案。 - Bartek Szablowski
谢谢,不客气。请注意,如果对结果不满意,您可以随时调整 compareColors 函数。 - likeitlikeit
1
真是个传奇!救星啊! - Rossco
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接