使用PIL实现图像2级量化结果不符,求问题排查
图像2级量化结果不符合预期的问题排查
图像对比
- 原始灰度图像:

- 期望的2级量化结果(纯黑白二值图):

- 实际输出结果(带灰色调):

问题描述
我想用PIL和Numpy对图像执行2级量化处理,但实际输出的结果和预期不符,请问我的代码哪里出错了?
我的代码:
from PIL import Image import PIL # 创建图像对象(主图像) im1 = Image.open(r'File Address').convert('L') # 量化图像 im1 = im1.quantize(2) # 显示处理后的图像 im1.show()
问题原因与解决方法
问题根源
你使用的Image.quantize(2)默认采用自适应调色板生成策略,它会根据图像的灰度分布统计,选择两个能最小化量化误差的灰度值(而非强制使用纯黑0和纯白255),所以最终输出了带灰色调的结果,而非你期望的纯黑白二值图。
解决方法
以下两种方式可以得到你想要的纯黑白2级量化效果:
方法1:手动指定黑白调色板
通过自定义调色板,强制量化仅使用纯黑和纯白:
from PIL import Image # 打开图像并转为灰度图 im1 = Image.open(r'File Address').convert('L') # 创建仅包含黑、白的调色板(长度需补至768,对应256色的RGB通道) palette = [0, 0, 0, 255, 255, 255] + [0] * (254 * 3) # 创建调色板模板并应用量化 palette_img = Image.new('P', (1, 1)) palette_img.putpalette(palette) im1_quantized = im1.quantize(colors=2, palette=palette_img) im1_quantized.show()
方法2:用Numpy做阈值分割(更直观)
直接通过阈值把灰度像素划分为黑、白两类,是最直接的二值化方式:
from PIL import Image import numpy as np # 打开图像转灰度,转为Numpy数组 im1 = Image.open(r'File Address').convert('L') img_array = np.array(im1) # 设置阈值(这里用127作为分界,可根据需求调整) threshold = 127 # 执行二值化:大于等于阈值设为255(白),否则设为0(黑) img_quantized = np.where(img_array >= threshold, 255, 0).astype(np.uint8) # 转回PIL图像并显示 Image.fromarray(img_quantized).show()
内容的提问来源于stack exchange,提问作者Shadow23548
相关产品推荐
相关产品推荐

