如何在Python中精准复现MATLAB imresize3三维重采样结果
Python复现MATLAB imresize3函数结果适配问题
问题背景
当前正在开展MATLAB代码向Python的迁移工作,无法完美复现MATLAB imresize3 函数的计算结果。
本次测试基础信息:
- 测试输入为101×101×101规格的数组,双端输入数据完全一致:Python索引
[0,0:3,0](对应MATLAB索引规则下的(1,1:4,1)位置)的前四个值为0.3819、0.4033、0.4336、0.2767 - 输入数据特征:
sampleQDNorm在[0:100,0:100,0:100]索引范围内为0-1区间的随机小数,在[:,:,101]、[:,101,:]、[101,:,:]侧边做了零填充 - 除该测试数组外,另有两个存在同样适配问题的大规格数组:一个是873×873×873的数值数组,一个是同尺寸的布尔型数组
- MATLAB运行结果为基准正确结果,需要在Python中尽可能精准复现该结果
MATLAB端基准实现与输出
执行代码:
sampleQDNormSmall = imresize3(sampleQDNorm,0.5);
运行后得到51×51×51规格的输出数组,其(1,1:4,1)位置的前四个值为0.3443、0.2646、0.2700、0.2835。
已知该调用下MATLAB默认使用三次插值,默认开启抗锯齿。
Python端已尝试方案与存在的偏差
基于已知的MATLAB默认配置,在Python中使用scikit-image库对应设置order=3(三次插值)、anti_aliasing=True(开启抗锯齿),尝试了两种实现:
from skimage.transform import resize from skimage.transform import rescale # 方案1:调用resize接口 sampleQDNormSmall = resize(sampleQDNorm,(0.5*sampleQDNorm.shape[0],0.5*sampleQDNorm.shape[1],0.5*sampleQDNorm.shape[2]),order=3,anti_aliasing=True) # 方案2:调用rescale接口 sampleQDNormSmall1=rescale(sampleQDNorm,0.5,order=3,anti_aliasing=True)
两种方案的输出均不符合预期:
- 方案1输出为51×51×51数组,其
[0,0:3,0]位置的前四个值为0.3452、0.2669、0.2774、0.3099,数值与MATLAB结果接近但不完全一致 - 方案2输出为50×50×50数组,对应位置前四个值为0.3422、0.2623、0.2810、0.3006,不仅输出尺寸不符合预期,数值结果也与MATLAB输出、第一种Python方案的结果存在偏差
内容的提问来源于stack exchange,提问作者Grant
相关产品推荐
相关产品推荐

