skimage.io.imread与matplotlib.pyplot.imread的区别有哪些?
skimage.io.imread 与 matplotlib.pyplot.imread 的区别
先给出两个函数的基础调用示例:
- skimage 读取图像:
from skimage.io import imread img1 = imread('path')
- matplotlib 读取图像:
import matplotlib.pyplot as plt img2 = plt.imread('path')
二者的核心区别可以分为功能、使用两个维度:
功能层面差异
- 支持的图像格式不同:skimage的imread底层默认调用imageio或Pillow库,除常见的JPG、PNG外,还支持TIFF、DICOM等科研、医疗场景的专用图像格式;matplotlib的imread仅支持PNG、JPG、BMP等民用常用格式,对特殊格式适配很差。
- 输出数组属性不同:skimage读取8位图像时,默认返回取值范围在
0-255的uint8类型数组,带透明通道的RGBA图像也遵循该范围;matplotlib读取PNG格式时会自动将数值归一化到0-1的float32范围,仅读取JPG等其他格式时才会返回0-255的uint8数组,这是日常使用最容易踩的坑。 - 通道处理逻辑不同:二者默认都返回RGB顺序的三通道数组(和OpenCV的BGR顺序不同),但skimage内置了通道转换逻辑,可以直接读取返回灰度单通道数组,matplotlib没有内置该能力。
使用层面差异
- 可调参数不同:skimage的imread支持直接传入
as_gray=True参数直接返回灰度数组,也支持传入plugin参数指定底层解析库读取特殊格式;matplotlib的imread没有内置灰度读取参数,需要读取后手动做通道转换,也不支持自定义解析插件。 - 错误提示不同:skimage读取失败时会抛出明确的IO错误、格式不支持报错,排查问题更方便;matplotlib部分版本读取不支持的格式时,仅会返回空数组或者模糊警告,问题定位难度更高。
- 生态适配性不同:如果后续要做图像分割、特征提取等算法处理,skimage读取的数组可以直接适配scikit-image、OpenCV的相关接口,不需要额外做数值范围转换;如果后续仅需要做图像可视化,matplotlib读取的数组可以直接传给
plt.imshow接口,适配性更好。
内容的提问来源于stack exchange,提问作者Sagar Tanwar
相关产品推荐
相关产品推荐

