python - 图像的准确颜色量化以最小化调色板
问题描述
我正在尝试量化图像,使所有原色保持原位并删除所有次要颜色,例如“抗锯齿”边框。例如,下面的图像最终应量化为 3 种颜色,而原始图像中的实际颜色数量超过 30 种。所有“抗锯齿”边框颜色都应视为次要颜色,并在量化以及“jpeg 伪影”时消除,由于过度优化,它为图像添加了更多颜色。注意:源图像可以是 png 或 jpeg。
对于量化本身,我使用PIL.quantize(...)
K 作为要离开的颜色数。它工作得相当好,并使调色板与原始调色板完美匹配。
def color_quantize(path, K):
image = cv2.imread(path, cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
im_pil = Image.fromarray(np.uint8(img))
im_pil = im_pil.quantize(K, None, 0, None)
return cv2.cvtColor(np.array(im_pil.convert("RGB")), cv2.COLOR_RGB2BGR)
因此,如果我事先知道“K”(原色的数量),那么我会将它用于im_pil.quantize(...)
. 基本上,我需要一种方法来获得那个“K”数字。有什么方法可以确定原色的数量吗?
顺便说一句,关于“jpeg artifacts”的删除,我img = cv2.bilateralFilter(img, 9, 75, 75)
目前正在使用,效果很好。
解决方案
您可能想尝试分析 RGB 通道的直方图以找出它们有多少个峰值,希望您会有一些大峰值和一些非常小的峰值,那么大峰值的数量应该是您的 K。
推荐阅读
- sql - 从oracle中的字符串中获取数字
- julia - 如何在 Julia 中舍入向量的数字
- java - 获取 org.apache.commons.math3.exception.DimensionMismatchException: 0 != 2
- python - Word2Vec 和类似的:当您的数据分布不是对数对数线性时,是否可以使用 zipf 概率进行负采样?
- activereports - 关于活动报告尚未安装则无法导出pdf
- html - P 标签的 CSS 样式看起来像标题标签
- arrays - 从数组中获取单个哈希
- arrays - 如何使用按钮将项目添加到动态列表到具有列表的另一个屏幕?
- javascript - 标签动态设置 onclick 属性触发功能,即使我没有点击
- regex - BigQuery 正则表达式后向/前瞻解决方法?