我正在尝试构建一个类似http://labs.ideeinc.com/multicolr的实用程序,但我不知道他们使用的是哪种算法,有人知道吗?
3 回答
他们所做的只是匹配直方图。
因此,为您的图像构建直方图。按图像大小对直方图进行归一化。直方图是具有与颜色一样多的元素的向量。您不需要 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^2
x 从 0..10,000 到哪里的查找表。然后你的计算会很快。当您从调色板中选择一种颜色时,只需使用该颜色 = 10,0000 制作一个直方图。选择 2 时,使用 color1=5000、color2=5000 等制作直方图。
最后,您将不得不添加软糖因素以使应用程序与现实世界相匹配,但您会在测试中找到这些因素。
我建议您对数据库中图像中存在的颜色进行某种聚类。我的意思是,对于数据库中的每个图像:
- 收集图像中每个像素的颜色
- 对收集到的颜色执行聚类(假设 k-mean 聚类有 5 个聚类)
- 将聚集的颜色存储为图像的代表描述符
当用户提供一组一个或多个查询颜色时,您会进行某种贪婪匹配,选择给定颜色和数据库中每个图像的颜色描述符(5 种代表颜色)之间的最佳匹配。
您的图像集合的大小是多少,因为根据大小,某些搜索索引可能是比算法本身更大的问题?
可能只是创建图像中使用的颜色的直方图,然后对用户选择的颜色进行最佳拟合。