Python SciPy图像大小调整移位-预期行为还是错误?
我注意到scipy.misc.resize有点奇怪——似乎使用“最近”以外的任何插值方法都会导致结果图像中的(0,0)偏移大约1x1像素 下面是一个将3x3图像转换为6x6的完全合成示例: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
>>> 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提交了错误报告?我现在对这种行为感到不舒服。