10

我正在尝试构建一个类似http://labs.ideeinc.com/multicolr的实用程序,但我不知道他们使用的是哪种算法,有人知道吗?

4

3 回答 3

6

他们所做的只是匹配直方图。

因此,为您的图像构建直方图。按图像大小对直方图进行归一化。直方图是具有与颜色一样多的元素的向量。您不需要 32,24,甚至可能不需要 16 位的精度,这只会减慢您的速度。出于性能原因,我会将直方图映射到 4、8 和 10-12 位。

  • least distance compare在所有 4 位直方图和样本颜色之间 进行模糊处理。
  • 然后拿那个集合做 8 位直方图比较。
  • 然后可能会上升到 10 或 12 位直方图与剩余的集合进行比较。这将是性能最高的搜索,因为您将整个集合与非常少量的计算进行比较,以找到一个小的子集。
  • 然后你处理具有更多计算等的小子集。

真正的大技巧是找到匹配相似直方图的最佳算法。

  • 从距离计算开始。在 3 个维度上,我认为是:

    SQRT((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)

我是凭记忆做的,所以请查一下以确保。

  • 出于您的目的,您将拥有超过 3 个维度,因此您将拥有更多术语。4 位直方图有 16 个项,8 位直方图有 256 个项,依此类推。请记住,这种数学运算很慢,所以不要实际执行该SQRT部分。如果您将图像的尺寸标准化得足够小,例如降至 10,000 像素,那么您就知道您只需要x^2对 0..10,0000 的值进行处理。预先计算x^2x 从 0..10,000 到哪里的查找表。然后你的计算会很快。

  • 当您从调色板中选择一种颜色时,只需使用该颜色 = 10,0000 制作一个直方图。选择 2 时,使用 color1=5000、color2=5000 等制作直方图。

  • 最后,您将不得不添加软糖因素以使应用程序与现实世界相匹配,但您会在测试中找到这些因素。

于 2009-06-12T17:31:49.473 回答
3

我建议您对数据库中图像中存在的颜色进行某种聚类。我的意思是,对于数据库中的每个图像:

  • 收集图像中每个像素的颜色
  • 对收集到的颜色执行聚类(假设 k-mean 聚类有 5 个聚类)
  • 将聚集的颜色存储为图像的代表描述符

当用户提供一组一个或多个查询颜色时,您会进行某种贪婪匹配,选择给定颜色和数据库中每个图像的颜色描述符(5 种代表颜色)之间的最佳匹配。

您的图像集合的大小是多少,因为根据大小,某些搜索索引可能是比算法本身更大的问题?

于 2010-09-01T09:00:59.493 回答
0

可能只是创建图像中使用的颜色的直方图,然后对用户选择的颜色进行最佳拟合。

于 2009-06-12T17:08:38.797 回答