SegNet语义分割修改RGB调色板后输出颜色异常,求原因分析
问题原因分析与解决方案
这问题的核心是你在保存图像时多做了一步不必要的数值缩放,导致颜色值溢出了uint8的范围,从而出现异常。
具体原因:
你的调色板pascal_palette已经定义为dtype=np.uint8,里面的每个RGB值都是0-255的合法范围(比如草绿色(124,252,0)本身就是标准的RGB颜色值)。但在保存图像时,你执行了:
Image.fromarray(np.multiply(color_image,255)).save(out_file)
这会把每个颜色值乘以255,而uint8类型的数值最大值是255,超过的部分会被自动截断(取模256),导致颜色完全错乱:
- 之前的
(0,128,0)乘以255后,128*255=32640,32640 % 256 = 128,刚好和原值一致,所以看起来正常; - 但修改后的
(124,252,0)乘以255后,得到的是(132,4,0)(因为124*255%256=132,252*255%256=4),这是偏红的暗色调,所以你看到图像变成红色。
解决方案:
直接去掉np.multiply(color_image,255)的操作,因为color_image已经是符合要求的uint8格式RGB图像了。修改保存代码为:
Image.fromarray(color_image).save(out_file)
另外可以额外检查两点确保万无一失:
- 确认
prediction的类别索引范围(0-12)和调色板的长度(13个元素)完全匹配; - 打印
color_image的数值范围,确认是0-255之间的uint8值。
内容的提问来源于stack exchange,提问作者blackbug
相关产品推荐
相关产品推荐

