首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >给定一个RGB值,在数据库中查找最接近的匹配项的最佳方法是什么?

给定一个RGB值,在数据库中查找最接近的匹配项的最佳方法是什么?
EN

Stack Overflow用户
提问于 2009-12-04 21:55:31
回答 6查看 19.7K关注 0票数 32

我有一个RGB值,如果它不存在于我的数据库的颜色表中,我需要找到最接近的颜色。我在考虑比较所有的值并找出差异(红色,绿色和蓝色),然后取平均值。最小的平均偏差应该是最接近的颜色。在我看来,应该有更好的方法。有什么想法吗?

EN

回答 6

Stack Overflow用户

发布于 2009-12-04 22:01:55

下面的代码完全符合您的描述:

select (abs(my_R - t.r) + abs(my_G - t.g) + abs(my_B - t.b)) / 3 as difference, t.*
from RGBtable t
order by difference desc;

然而,使用非线性的东西可能会得到更好的结果。在“取平均值”方法中,如果您的目标颜色是(25,25,25),则颜色(45,25,25)将比(35,35,35)更接近。然而,我打赌第二个实际上会看起来更近,因为它也是灰色的。

有几个想法浮现在脑海中:你可以试着在求平均值之前,先求出差异的平方。或者你可以做一些复杂的事情,找到不同值之间具有最接近比率的颜色。找到最接近的比例会让你最接近正确的色调,但不会考虑饱和度(如果我没记错的话…)

票数 4
EN

Stack Overflow用户

发布于 2009-12-04 22:17:27

颜色相似度( Euclidean distance difference = sqrt(sqr(red1 - red2) + sqr(green1 - green2) + sqr(blue1 - blue2)) )是确定两种颜色相似度的standard way

然而,如果你在一个简单的列表中有你的颜色,那么找到最接近的颜色需要计算列表中每种颜色到新颜色的距离。这是一个O(n)运算。

sqrt()是一个昂贵的操作,如果您只是比较两个距离,那么您可以简单地省略sqrt()

如果你有一个非常大的颜色调色板,它可能会更快地将颜色组织到一个kd tree (或一个alternatives)中,以减少需要计算的差异的数量。

票数 4
EN

Stack Overflow用户

发布于 2009-12-04 22:02:30

让数据库为您完成这项工作:

select top 1
  c.r,
  c.b,
  c.g
from
  color c
order by
  (square(c.r - @r) + square(c.g - @g) + square(c.b - @b))

其中@r@g@b是要搜索的颜色的r、g、b值(SQL Server参数语法,因为您没有指定数据库)。请注意,这仍然需要进行表扫描,因为order by中有一个函数调用。

注意,额外的平方根调用实际上并不是必需的,因为它是一个单调函数。这可能不是很重要,但仍然很重要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1847092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档