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

时间:2014-10-29 22:14:41

标签: 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',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。

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

1 个答案:

答案 0 :(得分: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)

并且双线性/双三次图像逐字地离开(0,0)每个图像,而最近的图像保持对齐。

我会与PIL / SciPy人员核实是否已经修复。