Python SciPy图像大小调整移位-预期行为还是错误?

Python SciPy图像大小调整移位-预期行为还是错误?,python,image-processing,numpy,scipy,Python,Image Processing,Numpy,Scipy,我注意到scipy.misc.resize有点奇怪——似乎使用“最近”以外的任何插值方法都会导致结果图像中的(0,0)偏移大约1x1像素 下面是一个将3x3图像转换为6x6的完全合成示例: >>> src array([[ 0., 0., 0.], [ 0., 64., 0.], [ 0., 0., 0.]]) >>> imresize(src, (6, 6), interp='bicubic',mod

我注意到scipy.misc.resize有点奇怪——似乎使用“最近”以外的任何插值方法都会导致结果图像中的(0,0)偏移大约1x1像素

下面是一个将3x3图像转换为6x6的完全合成示例:

>>> src
array([[  0.,   0.,   0.],
       [  0.,  64.,   0.],
       [  0.,   0.,   0.]])

>>> imresize(src, (6, 6), interp='bicubic',mode='F')
array([[  1.,   0.,  -5.,  -8.,  -5.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.],
       [ -5.,   0.,  25.,  40.,  25.,   0.],
       [ -8.,   0.,  40.,  64.,  40.,   0.],
       [ -5.,   0.,  25.,  40.,  25.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.]], dtype=float32)
>>> imresize(src, (6, 6), interp='bilinear',mode='F')
array([[  0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,  16.,  32.,  16.,   0.],
       [  0.,   0.,  32.,  64.,  32.,   0.],
       [  0.,   0.,  16.,  32.,  16.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.]], dtype=float32)
>>> imresize(src, (6, 6), interp='nearest',mode='F')
array([[  0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,  64.,  64.,   0.,   0.],
       [  0.,   0.,  64.,  64.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.]], dtype=float32)
现在看来,对于双线性和双三次插值,质心会移动,但对于最近的插值,质心不会移动。对于奇数和偶数目标大小都会发生这种情况

我意识到,不同的坐标定义是像素中心或像素边缘,或将像素视为点采样或矩形,在重采样过程中会产生稍有不同的结果,但这似乎是一个主要问题(除非我遗漏了什么)

下面是另一个更清楚地说明这种转变的例子:

>>> imresize(src, (7, 3), interp='bilinear',mode='F')
array([[  0.       ,   0.       ,   0.       ],
       [  0.       ,   0.       ,   0.       ],
       [  0.       ,  11.4285717,  11.4285717],
       [  0.       ,  25.1428566,  25.1428566],
       [  0.       ,  25.1428566,  25.1428566],
       [  0.       ,  11.4285717,  11.4285717],
       [  0.       ,   0.       ,   0.       ]], dtype=float32) 
由于没有发生水平尺寸变化,我根本不希望重心的水平坐标移动,但它显然从1.0移动到1.5


那么,这是一个bug还是我遗漏了什么?

似乎这绝对是一个bug。我写了以下简短的片段:

from scipy.misc import *
from scipy.ndimage import measurements
import numpy as np

src = imread("src.png")
cbc = src
lnr = src
nrs = src

for idx in xrange(0, 128):
    cbc = imresize(cbc, tuple(2 * i for i in cbc.shape), interp='bicubic', mode='F')
    cbc = imresize(cbc, src.shape, interp='bicubic', mode='F')

    lnr = imresize(lnr, tuple(2 * i for i in lnr.shape), interp='bilinear', mode='F')
    lnr = imresize(lnr, src.shape, interp='bicubic', mode='F')

    nrs = imresize(nrs, tuple(2 * i for i in nrs.shape), interp='nearest', mode='F')
    nrs = imresize(nrs, src.shape, interp='nearest', mode='F')

    imsave("nrs_%03d.png" % (idx), nrs)
    imsave("lnr_%03d.png" % (idx), lnr)
    imsave("cbc_%03d.png" % (idx), cbc)
双线性/双三次图像实际上远离(0,0)每个图像,而最近的图像保持对齐


我将与PIL/SciPy人员核实,看看它是否已经修复。

这非常有趣。我甚至在
PIL
中也观察到类似的事情,但没有立即的解释。您关于“像素中心”和“像素边缘”的推理可能是一个线索(尽管这表明像素是正方形而不是0d点),以及边界注意事项和非整数倍调整大小的附加效果。对任何可能在这里说明问题的内容都非常感兴趣。结果表明,scipy实际上使用了
PIL
(请参阅中其他地方的
toimage
功能)您是否为此向PIL和/或scipy提交了错误报告?我现在对这种行为感到不舒服。