SciPy图像大小调整移位 - 预期的行为或错误?

Yur*_*nko 9 python numpy image-processing 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',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)
Run Code Online (Sandbox Code Playgroud)

现在似乎质心移动了双线性和双三次插值,但是没有移动到最近的插值.对于奇数和偶数目标大小都会发生这种情况.

我意识到坐标的不同定义是像素中心或像素边缘或将像素视为点样本或矩形将在重采样期间给出略微不同的结果,但这似乎是一个主要问题(除非我遗漏了一些东西).

这是另一个更清楚地证明转变的例子:

>>> 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) 
Run Code Online (Sandbox Code Playgroud)

由于没有发生水平尺寸变化,我不希望我的质心的水平坐标完全移动,但它明显从1.0移动到1.5.

那么,这是一个错误还是我错过了什么?

Yur*_*nko 0

看来这绝对是一个错误。我写了以下简短片段:

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)
Run Code Online (Sandbox Code Playgroud)

双线性/双三次图像实际上远离每个图像的 (0,0),而最近的图像保持对齐。

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