Python使用PIL库读取图像HSV值及结果不符问题求解
问题原因说明
- PIL的
HSV色彩模式采用8位单通道存储,三个通道的取值范围均为0~255,和常规认知里色相H为0~360°、饱和度S/明度V为0~1的标准HSV定义不同:- 色相通道会将
0~360°的取值线性映射到0~255区间存储,所以你不会得到超过255的数值 - 饱和度、明度通道则将
0~1的比例映射到0~255区间存储
- 色相通道会将
- 你现有代码的循环逻辑有问题:
range(width-1)和range(height-1)会丢失图像最后一列、最后一行的所有像素
修复方案
如果需要得到常规标准的HSV数值,按以下规则转换即可:
标准色相H(°)= 读取到的H值 * 360 / 255
标准饱和度S = 读取到的S值 / 255
标准明度V = 读取到的V值 / 255
以你的场景为例,纯洋红色在PIL中读取到的H值约为212,代入计算后212 * 360 / 255 ≈ 300°,和你预期的数值一致。
修改后参考代码
from PIL import Image infile = 'magenta.jpg' img = Image.open(infile) width, height = img.size img_hsv = img.convert('HSV') for x in range(width): for y in range(height): h, s, v = img_hsv.getpixel((x,y)) # 转换为标准HSV值 standard_h = h * 360 / 255 standard_s = s / 255 standard_v = v / 255 print(f"标准HSV值:H={standard_h:.1f}°, S={standard_s:.2f}, V={standard_v:.2f}")
内容的提问来源于stack exchange,提问作者Keerthan S
相关产品推荐
相关产品推荐

