按颜色分组照片

时间:2010-07-19 08:35:02

标签: php postgresql colors imagemagick photos

我有相当多的照片和RGB色彩图(让我们说大概有100种颜色)。如何按颜色对图片进行分组并获得如下内容:http://labs.ideeinc.com/multicolr

我目前的想法是:使用ImageMagick,为每张照片执行此操作:

  1. 将其调整为较小的尺寸,以便更快地处理。
  2. Quantize它没有使用我选择的颜色贴图抖动。
  3. 获取照片histogram以获取每种颜色出现的次数。
  4. 将颜色存储在数据库中,但我还没有弄清楚快速检索的最佳方法是什么。
  5. 你知道更好更有效的方法吗?我选择的语言是PHP,因为所有繁重的处理都将由ImageMagick完成,而数据库是PostgreSQL。 提前谢谢!

3 个答案:

答案 0 :(得分:1)

我注意到你已经想出如何从图像中获取最相关的颜色。不要调整图像大小,因为直方图可能看起来不同。

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

图片表:

image_id | image_file

颜色表:

color_id | color_rgb

image_color table:

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

答案 1 :(得分:1)

颜色本质上是三维向量(无论它们是否表示为HSV,RGB,CMY [K])。不幸的是,关系数据库大多不是很擅长在一维以上的工作。

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

e.g。对于24位颜色124,39,201 作为1位颜色:0,0,1 作为2位颜色:1,0,2 ....

如果你想在图像中查看更多颜色,那么我建议减少到最接近固定颜色图的值而不进行错误传播,并确定最常用的顶部'N'颜色。之后您需要进行一些试验和努力 - 上面的方法可能需要对临时图像中的频率进行加权,或者您可能只是查看顶部NM颜色与计算值的NX匹配的图像(对于某些图像)调整M和X值。)

下进行。

答案 2 :(得分:0)

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

M.M。