按颜色分组照片

8
我有一大堆照片和一个RGB颜色地图(假设有大约100种颜色)。我该如何按颜色分组图片并获得像这样的结果:http://labs.ideeinc.com/multicolr
我的当前想法是:使用ImageMagick,对每张照片执行以下操作:
  1. 将其调整为较小的大小,以便更快地处理。
  2. Quantize它,使用我选择的颜色地图而不进行抖动。
  3. 获取照片的histogram,以获得每种颜色出现的次数。
  4. 将颜色存储在数据库中,但我还没有找出最好的方法来实现快速检索。
你知道有更好、更有效的方法吗?我的首选语言是PHP,因为所有的重型处理都将由ImageMagick完成,并且数据库是PostgreSQL。谢谢!
3个回答

1

我注意到你已经找到了如何从图像中获取最相关颜色的方法。不要将图像缩放太多,因为直方图可能会有所不同。

数据库可能看起来像这样:

图像表:

image_id | image_file

颜色表:

color_id | color_rgb

image_color表:

image_id | color_id | color_percent

color_percent列将用于分组/where子句

获取图像:

select
    image_id
    sum(color_percent)/count(color_percent) as relevance
from
    image_color
where
    color_id IN (175, 243) # the colors you want to involve in this search
    and color_percent > 10 # this will drop results with lower significance
group by
    image_id
order by
    relevance

我认为color_id有点多余。如果它只是引用color_rgb,我认为你不需要一个单独的键。 - rfusca
或者它可能引用颜色名称。 - Narcis Radu
我将把这个标记为被接受的答案,因为这就是我最终采取的方法。它并不完美,但我喜欢它,而且做起来很有趣。 :) 点击这里查看: http://www.picof.net/colors/。问题:我不知道如何选择具有多种颜色并按某些重要性排序的照片。我尝试按(color_A_percent + color_B_percent + ...)对它们进行排序,但然后我得到了99%颜色A和1%颜色B的照片。 - liviucmg
1
我刚刚进行了一次编辑。如果我的查询有用,请告诉我。谢谢! - Narcis Radu
再次感谢您。您的查询起作用了,但我已经找到了一个更好的解决方案,使用三维索引(PostgreSQL的“Cube”contrib模块)。这样做更精确,并且可以查询任何RGB颜色,而不仅仅是调色板中的颜色。它在线上,如果您想要查看的话。 - liviucmg

1

颜色本质上是三维向量(不管它们是用HSV、RGB还是CMY[K]表示)。不幸的是,关系型数据库大多数情况下不太擅长在超过1个维度上工作。

如果你将图像缩小到单个“平均”颜色,则解决方案会变得简单一些: 一个琐碎的分析会暗示你需要将新图像与每个现有图像进行比较,以确定相似程度。然而,更好的方法是将向量数字化,然后在数据库中查找相似值。

例如对于24位颜色124,39,201 作为1位颜色:0,0,1 作为2位颜色:1,0,2 ....

如果你想查看图像中的更多颜色,则建议将其缩减到最接近的固定颜色映射值(无误差传播),并识别出使用最频繁的前N种颜色。之后你需要进行一些试验和努力——上面基于临时图像中频率加权的方法可能是必要的,或者你只需查看顶部N-M种颜色与计算出的值的N-X个匹配的图像(需要微调M和X值)。

C.


我发现了一个名为“cube”的PostgreSQL模块,可以处理多维索引:http://www.postgresql.org/docs/8.4/static/cube.html。我想我会尝试一下,因为它应该可以根据任何RGB颜色选择照片,而不仅仅是从有限调色板中选择特定的颜色。 - liviucmg

0
我注意到你需要做什么。解决这个问题的最佳方法是将图像从RGB转换为CIE-LAB颜色配置文件。
然后,您可以计算3D空间中两种颜色之间的距离。

M.M.


这是否相比 OP 采用的 PostgreSQL Cube 解决方案有优势? - FoolishSeth

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