【发布时间】:2021-11-11 18:37:08
【问题描述】:
我正在尝试量化图像,以保留所有原色并删除所有次要颜色,例如“抗锯齿”边框。 例如。下面的图像最终应该被量化为 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),效果很好。
【问题讨论】:
-
量化基本上是一种聚类技术。有些聚类方法不需要参数k,它们会找到一组“自然”的聚类。例如 DBSCAN:en.wikipedia.org/wiki/DBSCAN
标签: python image image-processing colors quantization