将中值剪切颜色缩减算法输出调色板应用于源图像

时间:2012-04-29 16:44:51

标签: c++ image qt color-palette quantization

所以我开始研究应用于图像的“简单”色彩还原。我花了最后一天研究它是如何工作的,并设法找到一个似乎是一个不错的算法来试验这里:Median cut algorithm

这里的输出是n种颜色的调色板。我还没有确保这个算法真正起作用,但我假设它确实有效。我想做的是获取输出并将其应用于生成调色板的图像。

我不能说我精通色彩压缩格式以及所有关于图像的深层知识,但我想知道如何应用调色板而不必开始使用附带的图像格式索引调色板(即GIF)。

我在想,对于每个像素,我计算当前像素的颜色与调色板中每种颜色之间的差异,并用最小差异的调色板颜色替换该像素。这是一种可行的方法吗?

注意 - 我已经查看了各种库(ImageMagick),但这些看起来有点过分;我将用图像处理做的最多就是减少调色板 - 没有比这更复杂的了。这就是为什么我认为实现这个算法对我来说是最简单的方法。

2 个答案:

答案 0 :(得分:3)

最快的方法是使用oct树进行颜色查找。

我们的想法是将所有调色板颜色索引添加到oct树中,然后向根节点询问最近的颜色。当询问最近的颜色时,每个节点(可以访问调色板)返回其自己的颜色索引(如果它处于最深层次)或询问相应的子节点(对于所请求的颜色)的最近颜色索引。如果没有相应的子节点,它会向所有子节点询问最近的颜色索引,并返回颜色距离最小的子节点。

基本上,oct树将极大地减少需要进行的距离比较的次数。通过预先计算所有距离来加快速度。

这是我的实施...... http://www.codeproject.com/Tips/1046574/OctTree-Based-Nearest-Color-Search

答案 1 :(得分:1)

我认为这是一种可行的方式。您计算的差异应该是欧几里德差异显示here 但是你可以做一点优化。您不需要每次都计算新的差异。例如,如果已经计算了

,则可以填充查找表以直接使用正确的颜色