c++ - 将 Median Cut 减色算法的输出调色板应用于源图像

标签 c++ image qt color-palette quantization

所以我开始研究“简单”的颜色减少以应用于图像。我花了最后一天时间研究它是如何工作的,并设法找到了一个看起来不错的算法来在这里进行试验:Median cut algorithm

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

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

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

注意 - 我已经研究过各种库 (ImageMagick),但这些库似乎有点矫枉过正;我在图像处理方面所做的最多的工作就是减少调色板——没有比这更复杂的了。这就是为什么我认为实现此算法将是满足我需求的最简单方法。

最佳答案

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

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

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

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

关于c++ - 将 Median Cut 减色算法的输出调色板应用于源图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10373917/

相关文章:

c++ - 有没有更好的方法来为 C++ 编写这个?

c++ - 用 C 或 C++ 扩展 Python 有什么好处?

c++ - ostream 会刷新其他流吗?

ios - 圆形 View 和颜色以及带有动画的 cifilter

c++ - 使用WIC将QImage编码为png?

c++ - 游戏循环帧率控制问题

image - 如何使图像的不连续轮廓保持一致?

javascript - 如何使用jCarousel放大 slider ?

c++ - QT 应该在 int 增量上阻塞吗?

c++ - 从 Visual Studio 2012 中浏览 Qt 5.1.1 基本源 - 将 .pro 转换为 .sln 文件