如何仅使用Python PIL判断JPEG图像是彩色还是灰度并解决split报错
问题原因
你调用img.load()后得到的是PixelAccess类型的对象,该对象仅用于直接读写单个像素,没有split()方法。split()是PIL的Image类自带的方法,你把Image.open()返回的原始Image对象用PixelAccess覆盖了,才会触发这个属性错误,且你后续做数组运算也不需要调用load()方法。
修正步骤
- 删除
img=img.load()这行冗余代码 - 拆分通道后,需要将PIL的通道对象转为numpy数组才能进行数值运算
- Image.size返回的是(宽,高)的二元组,计算总像素量需要把两个值相乘
- (可选优化)如果需要兼容灰度格式的输入图片,可以在读取图片后加一行
img = img.convert('RGB'),避免通道数不足导致的解包错误
修正后完整代码
from PIL import Image import numpy as np ### 读取测试图片 img = Image.open('替换为你的图片路径') # 可选:兼容非RGB格式图片 # img = img.convert('RGB') ### 拆分R,G,B通道 r,g,b = img.split() ### 通道转为numpy数组 r_arr = np.array(r) g_arr = np.array(g) b_arr = np.array(b) ### 计算通道两两差值的非零像素数 r_g = np.count_nonzero(abs(r_arr - g_arr)) r_b = np.count_nonzero(abs(r_arr - b_arr)) g_b = np.count_nonzero(abs(g_arr - b_arr)) ### 计算差值总和 diff_sum = float(r_g + r_b + g_b) ### 计算差值总和占图片总像素的比例 total_pixels = img.size[0] * img.size[1] ratio = diff_sum / total_pixels if ratio > 0.005: print("image is color") else: print("image is greyscale")
内容的提问来源于stack exchange,提问作者SooIn
相关产品推荐
相关产品推荐

