根据这里的建议@ SO,我对一组股票图像的平均颜色进行了分类。
r,g,b = image.convert("RGB").resize((1,1), Image.ANTIALIAS).getpixel((0,0))现在,我想向用户展示一个颜色轮,并对我的目录进行搜索,以找到与所选颜色最接近的图像。
我已经阅读了几个问题张贴在这里,建议“找到两种颜色之间的距离”,并参考Flickr黑客书籍。
Flickr Hack距离算法似乎基本上是:
diffr = checkImage.r - search_r
diffg = checkImage.g - search_g
diffb = checkImage.b - search_b
距离=(扩散*扩散+扩散*扩散+扩散*扩散)
如果距离<阈值,则匹配。
这种方法需要我计算搜索颜色与每个图像的颜色指纹之间的距离。我想知道是否有一种方法可以根据选定的颜色(中心点)和预先确定的阈值(或搜索半径)指定“搜索区域”。然后构造一个类似SQL的查询,以返回属于该区域的所有图像。
这个是可能的吗??
顺便说一句,我正在使用PIL和相关库在Python中实现这一点。
非常感谢你的帮助!
高级
发布于 2009-06-01 18:49:42
您可以通过对每个组件进行比较来显着地节省计算量,而不是通过平方来查找距离。
if abs(check.r - search.r) < threshold and
abs(check.g - search.g) < threshold and
abs(check.b - search.b) < threshold 将其与缓存表相结合可能足以满足您所做的任何工作。
发布于 2013-10-21 13:01:37
色差(Delta ) --两种颜色之间的差异或距离是色彩科学中感兴趣的指标。
您可以找到Python代码这里
注意,在计算RGB之前,需要将Delta E转换为Lab。
更多信息:
布鲁斯·贾斯汀·林德布鲁姆网站
颜色转换数学与公式
颜色增量/比较数学
发布于 2009-06-01 18:31:12
如果是我,我会少花点心思,把搜索缓存在第二个表中,比如:
CREATE TABLE `image_search` (
`id` int not null auto_increment,
`image_id` int not null,
`r` tinyint not null,
`g` tinyint not null,
`b` tinyint not null,
`distance` tinyint not null,
`hit` bool not null,
PRIMARY KEY (`id`),
UNIQUE KEY `image_id_by_rgb_by_distance` (`image_id`,`r`,`g`,`b`,`distance`),
KEY `image_id_by_rgb_by_distance_by_hit` (`image_id`,`r`,`g`,`b`,`distance`,`hit`),
);从那里拔出来找你的火柴,就像
SELECT `image_id`
FROM `image_search`
WHERE `r` = $r
AND `g` = $g
AND `b` = $b
AND `distance` = $distance
AND `hit` = 1如果你没有得到结果,那就去做
SELECT `image_id`
FROM `image_search`
WHERE `r` = $r
AND `g` = $g
AND `b` = $b
AND `distance` = $distance如果没有结果,那么运行您的图像目录做比较,并存储每个结果,积极或消极,在表中。
只有在没有缓存结果的情况下,它才会很慢。如果您的UI鼓励用户选择某些有用的预设颜色,您可以预先计算这些颜色,并提供更多帮助。
此外,当您将图像添加到目录中时,预计算所有先前执行的搜索也会得到额外的积分。
https://stackoverflow.com/questions/935992
复制相似问题