如何将颜色减少到指定的调色板
Posted
技术标签:
【中文标题】如何将颜色减少到指定的调色板【英文标题】:How to reduce colors to a specified palette 【发布时间】:2013-01-15 02:17:13 【问题描述】:我需要解决以下问题:
输入:图像 IM,Palette PA
输出:IM 仅带有 PA 的颜色
输入图像是 RGB,但我可以将其转换为 HSV。我指定的颜色目标调色板目前包含:黑色、白色、浅灰色、灰色、深灰色、蓝色、粉色、红色、紫色、绿色、黄色、棕色、橙色。
我为此搜索了很多,但我只能找到将图像缩小为最常见的颜色或将其缩小为固定调色板,如 16 色 EGA 图形。
我找到了最好的答案: How do I convert any image to a 4-color paletted image using the Python Imaging Library?
它有一个输入调色板并将图像缩小到该调色板。在 OpenCV 中是否有与 C++ 相同的方法?
【问题讨论】:
很难说出你想要做什么。你想写一个颜色量化器吗?或者你只是想强制一个 rgb 图像到一个固定的调色板?如果是后者,那么您所要做的就是将每个像素设置为调色板中最接近的颜色(通过 L2)。如果是前者,那么您可以使用聚类算法(例如 k 均值)。 @thang 评论的内容很好,但请注意您正在执行此操作的色彩空间。请参阅 ***.com/a/14237976/1832154 作为不同颜色空间之间差异的示例,以便用最接近的颜色替换颜色。 感谢您的快速回复。事实上,我“想将 rgb 图像强制为固定调色板”。是的,我的主要问题之一是找到两种颜色之间的良好距离测量。 ***.com/questions/14236721/… 很有趣。但是我认为这将是一个现成的实现,就像我上面引用的 python 库一样。 您尝试过什么? 将图像映射到给定 固定调色板并不难,除非您想进行抖动处理。参见例如en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering了解详情。 “将图像映射到给定的固定调色板”正是我想要做的。告诉我,这并不难,也不是很有建设性。 【参考方案1】:假设 rgb 颜色空间是 3D 立方体
而Palette PA
是这个立方体中的几个点。所以我们的问题被简化为在 3D 空间中为任何给定的rgb
点找到最近的Palette PA
点。
我认为更好的解决方案是k-d tree
在wiki page的末尾可以找到几个c++实现的链接
【讨论】:
【参考方案2】:由于您的调色板是固定的,您需要使用抖动方法(例如Floyd Steinberg dithering)以及适当的颜色相似度度量,例如Lab color space。
【讨论】:
以上是关于如何将颜色减少到指定的调色板的主要内容,如果未能解决你的问题,请参考以下文章
使用特定调色板在 C# 中实现 Floyd-Steinberg 抖动
怎样用Java编辑调色板(利用红蓝绿三种颜色调出所用颜色)!
如何将调色板 (n=5) 与第二个调色板 (n=4) 加上矩阵中的亮度变量 (n=4) 最佳混合(总共 5*4*4=80 种颜色)