scipy.misc.imresize已弃用,替换为skimage.transform.resize却结果不一致
解决scipy.misc.imresize与skimage.transform.resize的输出差异问题
我懂你碰到的这个坑——scipy.misc.imresize被官方标了弃用,转用skimage.transform.resize后却发现输出结果对不上,其实核心是两者在数据类型、数值范围和默认插值逻辑上有本质区别,下面给你拆解清楚并给出对齐结果的方案:
为什么结果不一样?
数值范围与类型差异:
scipy.misc.imresize处理后直接输出np.uint8类型的数组,像素值范围是[0, 255],和原始图像的格式一致skimage.transform.resize默认会把像素值归一化到[0, 1],输出np.float64类型的浮点数组,这是最直观的差异来源
默认插值方式不同:
scipy.misc.imresize默认用**双线性(bilinear)**插值skimage.transform.resize默认用**双二次(biquadratic)**插值,这会导致像素细节上的细微差异
让skimage输出和scipy一致的代码
要完全对齐两者的结果,只需要做两个关键调整:
- 把skimage输出的归一化浮点值转回
[0,255]的uint8类型 - 指定和scipy默认一致的插值方式
直接看完整示例代码:
import numpy as np from skimage.transform import resize from imageio import imread img = imread('1.jpg') target_size = (1280, 1280) # 生成和scipy.misc.imresize完全对齐的结果 img_aligned = (resize(img, target_size, order=1) * 255).astype(np.uint8)
代码说明:
order=1:skimage里order=1对应双线性插值,和scipy.misc.imresize的默认interp='bilinear'完全匹配- 乘以255再转
uint8:将skimage的归一化浮点值映射回scipy使用的0-255整数范围
不管你的图像是RGB彩色图、灰度图还是带alpha通道的图,这个逻辑都能直接套用,skimage会自动处理多通道的情况。
内容的提问来源于stack exchange,提问作者Panfeng Li
相关产品推荐
相关产品推荐

