The scipy.misc.imresize
功能对我来说有点奇怪。一方面,这就是当我指定您提供给 a 的示例 2D 图像时发生的情况scipy.misc.imresize
以 1.0 的比例调用此图像。理想情况下,它应该给你相同的图像,但我们得到的是这样的(在 IPython 中):
In [35]: from scipy.misc import imresize
In [36]: import numpy as np
In [37]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]))
In [38]: out = imresize(dtest, 1.0)
In [39]: out
Out[39]:
array([[ 0, 32, 64],
[ 96, 127, 159],
[191, 223, 255]], dtype=uint8)
它不仅将输出的类型更改为uint8
, 但它scales价值观也是如此。一方面,看起来它使图像的最大值等于 255,最小值等于 0。MATLAB 的imresize
不这样做,它会按照我们期望的方式调整图像大小:
>> dtest = [1,2,3;4,5,6;7,8,9];
>> out = imresize(dtest, 1)
out =
1 2 3
4 5 6
7 8 9
但是,您需要认识到 MATLAB 执行调整大小默认启用抗锯齿功能。我不知道什么scipy.misc.resize
在这里做,但我敢打赌没有启用抗锯齿功能。
编辑 - 2016 年 11 月 23 日
正如 Eric 在下面的评论中指出的,如果您将图像预先转换为所需的类型,您将获得预期的结果:
In [10]: dtest = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.uint8)
In [11]: out = imresize(dtest, 1.0)
In [12]: out
Out[12]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=uint8)
我们可以看到图像没有缩放到[0,255]
范围。为了最终到达您需要去的地方,我们必须获得图像的浮点表示。scipy.misc.imresize
有一个额外的标志称为'mode'
你可以将其指定为'F'
以确保输出为浮点型。
In [14]: scale = 1.4
In [15]: out = imresize(dtest, 1/scale, mode='F')
In [16]: out
Out[16]:
array([[ 2.5 , 3.75],
[ 6.25, 7.5 ]], dtype=float32)
正如您稍后将看到的,您看到的结果scipy.misc.resize
与您在 MATLAB 中看到的不匹配。
为了获得最佳结果,请勿指定比例 - 指定目标输出大小以重现结果。像这样,1/scale
在你的情况下接近2 x 2
大小输出,因此您可以在 MATLAB 中执行以下操作:
>> dtest = [1,2,3;4,5,6;7,8,9];
>> out = imresize(dtest, [2,2], 'bilinear', 'AntiAliasing', false)
out =
2.0000 3.5000
6.5000 8.0000
您可以看到矩阵中的某些值与scipy.misc.resize
。与您在 MATLAB 中看到的内容相符。最接近你想要的是 OpenCV 的resize函数,或 scikit-image 的resize功能。这两个都没有抗锯齿功能。如果想让 Python 和 MATLAB 相互匹配,请使用双线性插值方法。imresize
MATLAB 中默认使用双三次插值,而且我知道 MATLAB 使用自定义内核来执行此操作,因此如果您在方法之间使用双三次插值,匹配它们的输出将会更加困难。请参阅这篇文章以获得更多信息的结果:
MATLAB vs C++ vs OpenCV - imresize
使用 Python OpenCV:
In [93]: import numpy as np
In [94]: import cv2
In [95]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]), dtype='float')
In [96]: out = cv2.resize(dtest, (2,2))
In [97]: out
Out[97]:
array([[ 2. , 3.5],
[ 6.5, 8. ]])
使用 scikit 图像:
In [100]: from skimage.transform import resize
In [101]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]), dtype='uint8')
In [102]: out = resize(dtest, (2,2), order=1, preserve_range=True)
In [103]: out
Out[103]:
array([[ 2. , 3.5],
[ 6.5, 8. ]])
最后一件有趣的事情是,MATLAB、OpenCV 和 scikit-image 在指定浮点比例时的行为彼此不同。我做了一些实验,通过指定浮点大小,我无法获得匹配的结果。除此之外,scikit-image 不支持采用比例因子,这更有理由明确说明输出大小而不是比例。