如何将颜色降至指定调色板?

7
我需要解决以下问题:
输入:图像IM,调色板PA
输出:仅包含PA颜色的IM
输入图像为RGB格式,但我可以将其转换为HSV格式。我指定的颜色目标调色板当前包含:黑色、白色、浅灰色、灰色、深灰色、蓝色、粉红色、红色、紫色、绿色、黄色、棕色、橙色。
我搜索了很多资料,但只能找到将图像减少到最常见的颜色或将其减少到固定的调色板,例如16种颜色EGA图形。
我发现了这个问题的最佳答案: 如何使用Python Imaging Library将任何图像转换为4色调色板图像? 它有一个输入调色板并将图像减少到该调色板的功能。在OpenCV中是否有相同的用法,使用C++实现?

1
很难理解你的意图。你是想编写一个颜色量化器吗?还是只想将 RGB 图像强制转换为固定调色板?如果是后者,那么你只需将每个像素设置为距离调色板中最近的颜色(通过 L2 距离)。如果是前者,则可以使用聚类算法(例如 k 均值)。 - thang
1
@thang的评论完全有效,但要注意你正在进行的颜色空间。请参见https://dev59.com/u2zXa4cB1Zd3GeqPZ_4X#14237976,以了解在用最接近的颜色替换颜色时不同颜色空间之间的差异示例。 - mmgp
谢谢您的快速回复。事实上,我“想将RGB图像强制转换为固定调色板”。是的,我的主要问题之一是找到两种颜色之间的良好距离度量方法。https://dev59.com/u2zXa4cB1Zd3GeqPZ_4X#14237976很有趣。然而,我认为会有一个现成的实现,就像我引用的Python库一样。 - Kenyakorn Ketsombut
@KenyakornKetsombut请重新添加标签cluster-analysis,这对问题来说是完全有意义的。 - mmgp
@Anony-Mousse 我认为我们只是以不同的方式看待这个问题。我理解你正在考虑聚类步骤来构建特定的调色板,但由于他已经有了一个调色板,所以没有必要进行这样的步骤。另一方面,有方法可以使用聚类将当前图像中的颜色映射到已固定的调色板上。例如,我们可以将图像分成 p 个簇,然后每个簇的平均颜色可以用来确定整个簇映射到调色板中的哪种颜色。 - mmgp
显示剩余12条评论
2个回答

2
假设 RGB 颜色空间是一个三维立方体。

rgb color space

“Palette PA” 是在这个立方体中的几个点。因此我们的问题可以简化为找到 3D 空间中任何给定的 “rgb” 点最近的 “Palette PA” 点。
我认为更好的解决方案是 k-d 树

enter image description here

维基页面的末尾,您可以找到几个C++实现的链接。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接