栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在python中使用Matlab的imresize

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在python中使用Matlab的imresize

scipy.misc.imresize
功能对我来说有点奇怪。一方面,这就是当我
scipy.misc.imresize
在该图像上以1.0比例指定您提供给呼叫的示例2D图像时发生的情况。理想情况下,它应该为您提供相同的图像,但是我们得到的是(在IPython中):

In [35]: from scipy.misc import imresizeIn [36]: import numpy as npIn [37]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]))In [38]: out = imresize(dtest, 1.0)In [39]: outOut[39]: array([[  0,  32,  64],       [ 96, 127, 159],       [191, 223, 255]], dtype=uint8)

它不仅将输出的类型更改为

uint8
,而且还 缩放
值。一方面,它看起来使图像的最大值等于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]: outOut[12]: array([[1, 2, 3],       [4, 5, 6],       [7, 8, 9]], dtype=uint8)

我们可以看到图像没有缩放到该

[0,255]
范围。为了最终到达您需要去的地方,我们必须获得图像的浮点表示。
scipy.misc.imresize
有一个称为的附加标志
'mode'
,您可以指定此标志
'F'
以确保输出为浮点数。

In [14]: scale = 1.4In [15]: out = imresize(dtest, 1/scale, mode='F')In [16]: outOut[16]: array([[ 2.5 ,  3.75],       [ 6.25,  7.5 ]], dtype=float32)

如您将在后面看到的,您看到的结果

scipy.misc.resize
与您在MATLAB中看到的结果不匹配。

为了获得最佳结果,请不要指定比例-请指定目标输出大小以重现结果。这样,

1/scale
您的情况就接近于
2 x2
大小输出,因此这就是您在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 npIn [94]: import cv2In [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]: outOut[97]: array([[ 2. ,  3.5],       [ 6.5,  8. ]])

使用scikit-image:

In [100]: from skimage.transform import resizeIn [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]: outOut[103]: array([[ 2. ,  3.5],       [ 6.5,  8. ]])

最后需要注意的一件事是,当指定浮点比例时,MATLAB,OpenCV和scikit-
image的行为彼此不同。我做了一些实验,并通过指定浮点大小,无法获得匹配的结果。除此之外,scikit-
image不支持采用比例因子,这更是明确声明输出尺寸而非比例的原因。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634240.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号