C++ 应用中值切割颜色减少算法&x27;将输出调色板添加到源图像

C++ 应用中值切割颜色减少算法&x27;将输出调色板添加到源图像,c++,image,qt,color-palette,quantization,C++,Image,Qt,Color Palette,Quantization,因此,我开始研究“简单”的色彩减少应用于图像。我花了最后一天的时间研究它是如何工作的,并设法找到了一个似乎不错的算法来进行实验: 这里的输出是n种颜色的调色板。我还没有确定这个算法是否真的有效,但我假设它确实有效。我想做的是获取输出并将其应用于调色板生成的图像 我不能说我很精通颜色压缩格式和所有涉及图像的深层知识,但我想知道如何应用调色板,而不必从带有索引调色板(即GIF)的图像格式开始 我认为对于每个像素,我计算当前像素的颜色与调色板中每个颜色之间的差异,并用差异最小的调色板颜色替换该像素。这

因此,我开始研究“简单”的色彩减少应用于图像。我花了最后一天的时间研究它是如何工作的,并设法找到了一个似乎不错的算法来进行实验:

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

我不能说我很精通颜色压缩格式和所有涉及图像的深层知识,但我想知道如何应用调色板,而不必从带有索引调色板(即GIF)的图像格式开始

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


注意-我已经查看了各种库(ImageMagick),但这些库似乎有点过分了;在图像处理方面,我要做的最多的事情就是减少调色板——没有比这更复杂的了。这就是为什么我认为实现这个算法是满足我需要的最简单的方法。

我认为这是一个可行的方法。您计算的差值应该是如图所示的欧几里德差值
不过,您可以进行一些优化。您不需要每次都计算新的差异。例如,如果已经计算了正确的颜色,则可以填充查找表以直接使用正确的颜色。最快的方法是使用oct树进行颜色查找

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

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


这是我的实现

仅供Qt用户参考-此算法完美集成到Qt中,效果非常好。如果你想玩中间切割,那么你可以调整现有的实现:(它有快速重新映射和PNG支持)真棒-我在维基阅读时注意到了这一点。谢谢你给我一个查找表的建议——我没想到。