You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PIL实现图像2级量化结果不符,求问题排查

图像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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:55:11