首页 > 解决方案 > 图像的准确颜色量化以最小化调色板

问题描述

我正在尝试量化图像,使所有原色保持原位并删除所有次要颜色,例如“抗锯齿”边框。例如,下面的图像最终应量化为 3 种颜色,而原始图像中的实际颜色数量超过 30 种。所有“抗锯齿”边框颜色都应视为次要颜色,并在量化以及“jpeg 伪影”时消除,由于过度优化,它为图像添加了更多颜色。注意:源图像可以是 png 或 jpeg。

3色示例

对于量化本身,我使用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)目前正在使用,效果很好。

标签: pythonimageimage-processingcolorsquantization

解决方案


您可能想尝试分析 RGB 通道的直方图以找出它们有多少个峰值,希望您会有一些大峰值和一些非常小的峰值,那么大峰值的数量应该是您的 K。


推荐阅读