Python skimage:灰度图像数组转浮点型后显示彩色而非灰度的原因求解
灰度图像转浮点型后显示为彩色渐变的原因及解决方法
问题现象
使用skimage.io读取灰度图像时显示正常,但对存储图像的numpy数组执行除法操作(如/1)转为浮点型后,图像显示变为彩色渐变;而执行乘法操作(如*1)时,仍能正常显示灰度图像。因业务需求需将数组元素除以255(该操作会自动转为浮点型),故需明确该现象的根本原因。
正常显示代码
from skimage import io import numpy as np a = io.imread("audrey_lnoise.png", as_gray=True) io.imshow(a)
显示效果:符合预期的灰度图像
异常显示代码
from skimage import io import numpy as np a = io.imread("audrey_lnoise.png", as_gray=True)/1 # 除以1触发类型转换为浮点数组 io.imshow(a)
显示效果:彩色渐变的非预期图像
根本原因
skimage对不同数据类型的图像数组有明确的渲染规则:
io.imread(..., as_gray=True)返回的是uint8类型的二维数组,skimage默认将这种类型的二维数组识别为灰度图像,使用灰度色阶渲染。- 执行除法操作时,numpy会自动将uint8类型提升为float64类型。对于二维浮点数组,skimage默认将其视为强度值矩阵而非灰度像素数据,因此会启用伪彩色色阶(如viridis)进行渲染,最终呈现彩色渐变效果。
- 乘法操作
*1属于整数运算,不会改变原数组的uint8类型,因此依然被识别为灰度图像,显示正常。
解决方法
若要将数组转为浮点型后仍正常显示灰度图像,可采用以下两种方式:
- 显式指定灰度色阶:
io.imshow(a, cmap='gray') - 使用skimage专用的类型转换函数
img_as_float,该函数在转换为浮点型的同时会保留图像的灰度语义:from skimage import img_as_float a = img_as_float(io.imread("audrey_lnoise.png", as_gray=True)) io.imshow(a)
内容的提问来源于stack exchange,提问作者Max Goodman
相关产品推荐
相关产品推荐

