【问题标题】:Find images of similar color查找相似颜色的图像
【发布时间】:2009-06-01 18:08:06
【问题描述】:

根据@SO 这里的建议,我已经对一组库存图片的平均颜色进行了分类。
r,g,b = image.convert("RGB").resize((1,1), Image.ANTIALIAS).getpixel((0,0))

现在,我想向用户展示一个色轮,然后对我的目录进行搜索,以找到与所选颜色最匹配的图像。

我已阅读此处发布的几个问题,建议“找出两种颜色之间的距离”,并参考 Flickr Hacks 书。

Flickr Hack 距离算法貌似基本是:


diffr = checkImage.r - search_r
diffg = checkImage.g - search_g
diffb = checkImage.b - search_b
距离 = (diffr * diffr + diffg * diffg + diffb * diffb)
如果距离


这种方法需要我计算我的搜索颜色和每个图像的颜色指纹之间的距离。我想知道是否有一种方法可以根据所选颜色(中心点)和预定阈值(或搜索半径)以某种方式指定“搜索区域”。然后构造一个类似 SQL 的查询来返回该区域内的所有图像。

这可能吗??

顺便说一句,我正在使用 PIL 和相关库在 Python 中实现这一点。

感谢您的帮助!

SR

【问题讨论】:

  • 你找到你要找的东西了吗?

标签: algorithm image-processing colors python-imaging-library


【解决方案1】:

Color difference (Delta E) - 两种颜色之间的差异或距离是色彩科学中的一个重要指标。

你可以找到Python代码here

请注意,在计算Delta E 之前,您需要将RGB 转换为Lab

RGB -> XYZ -> Lab

附加信息:

Bruce Justin Lindbloom site

Color conversion math and formulas

Color delta/comparison math

【讨论】:

    【解决方案2】:

    您可以通过对每个组件进行比较而不是平方来查找距离来显着节省计算量。

    if abs(check.r - search.r) < threshold and
       abs(check.g - search.g) < threshold and
       abs(check.b - search.b) < threshold 
    

    将它与缓存表结合起来可能就足以满足您的需求了。

    【讨论】:

    • 这是一个框搜索,OP中的平方和是一个球形测试。我怀疑这两种方法在速度方面有什么区别(三个 8 位乘法与三个加法和绝对值),你最大的开销,就像现在大多数事情一样,是内存带宽。
    • 最简单的方法,我非常希望它能产生有用的结果。谢谢!我会尽快尝试并发布我的结果。我曾经在一个 TED 视频上听说,爱好者以大约 2% 的成本实现了商业产品 80% 的功能。我喜欢这种心态,这也是我在项目中的目标:是的,视觉颜色搜索不会是完美的,但如果大部分时间都在努力几个小时,那已经很酷了! SR
    【解决方案3】:

    如果是我,我会不那么花哨,将搜索缓存在辅助表中,例如:

    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 鼓励用户选择某些有用的预设颜色,您可以预先计算这些颜色并提供更多帮助。

    当您将图像添加到目录时,预计算所有先前执行的搜索也可以获得奖励积分。

    【讨论】:

    • 混乱,如果我理解正确,您是在建议我预先进行比较分析并将关系存储在数据库中。所以对于每种颜色,我已经有了一个相似的图像列表,并且操作将是一个简单的搜索。这很简单,实际上非常聪明,我要试一试。但是,这只有在搜索起点是我的目录中已经存在的图像时才可用。我会计算它的平均颜色,然后尝试我的搜索。我想展示一个色轮并展示与所选颜色的最佳匹配。有什么想法吗?
    • 这就是为什么我说它主要是作为一种缓存机制。如果颜色/距离组合不在表中,则计算并存储它。预计算仅用于使用您知道用户可能选择的值来为缓存播种。
    【解决方案4】:

    我们可以将颜色视为三维空间中的一个点。现在每个图像将位于由其平均颜色定义的空间点。用户在 3-d 空间中选择一个点,而您想要找到最接近该点的图像。

    这并不简单,但是比你或我更聪明的人已经做了很多工作(Don Knuth 称之为“邮局问题”)。像往常一样,一个好的起点是at Wikipedia

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 2020-08-01
      • 1970-01-01
      • 2011-12-12
      • 2010-10-10
      • 2010-12-16
      • 2011-12-16
      • 2012-08-25
      • 2010-12-14
      相关资源
      最近更新 更多