如何将matlab中的imresize()函数移植到python中

来源:转载


最近在用混沌数学做图像识别的相关研究和matlab代码移植的时候,遇到了一个问题,就是如何实现matlab里面的imresize()函数。

最开始,我使用scipy.misc.imresize()来代替matlab中的imresize()函数,但是很快就发现python和matlab的计算结果不一致,于是我开始怀疑是python中的scipy.misc.imresize()和matlab中的imresize函数不一样,于是就做了以下验证:


matlab代码:


clc;
clear all;
n=256;
HSV0=imread('lena256.bmp');
HSVC=HSV0(110:195,110:175);
HSV1=imresize(HSVC,[n,n]);
HSV1(1,1:10)
运行结果:


python代码:


import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import scipy.misc
n=256
HSV0=mpimg.imread('lena256.bmp')
HSV=HSV0[109:195,109:175]
HSV1=scipy.misc.imresize(HSV,[n,n])
print(HSV1[0,0:10])运行结果:



这里将图片以矩阵形式打开,然后将矩阵的第一行的前十列打印出来,发现结果不一样。


在网上找了半天资料,最后在 stackoverflow看见了一篇相关问题:How to use Matlab's imresize in python


原因大致是因为 matlab的 imresize 函数默认是开启了 anti-aliasing选项的,而scipy.misc.imresize()并没有这样一个选项,也就无法做到和 matlab的 imresize ()函数结果一致。但是在这篇文章里面没有解决怎么在python中 做到 MATLAB imresize 函数的 anti-aliasing 功能这个问题,继续查找资料,发现还有一个和scipy.misc.imresize()函数功能非常类似的函数PIL.Image.resize(),抱着死马当活马医的心态,我试了下这个函数,但是问题又来了,PIL.Image.resize()函数的参数只能接收Image对象,所以在使用之前需要以Image方式打开,然后为了方便我就使用crop()函数进行切割,发现结果还是和matlab不一样:


python代码:


import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import scipy.misc
n=256
HSVO = Image.open('lena256.bmp')
HSVC = HSVO.crop((110,110,175,195))
HSV1 = HSVC.resize((n,n))
a=np.array(HSV1)
print(a[0,0:10])

运行结果:




为了排除crop()函数引起错误的可能性,我又用矩阵切割试了一次:


python代码:


import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import scipy.misc
n=256
HSV0=mpimg.imread('lena256.bmp')
HSV=HSV0[109:195,109:175]
HSV1=scipy.misc.imresize(HSV,[n,n])
print(HSV1[0,0:10])

运行结果:




结果是一样的。

总结:


在matlab中的imresize()函数使用默认设置的情况下,可以在python使用PIL.Image.resize()函数得到一样的结果,至于matlab中的imresize()函数的其他设置如何在python中实现,还有待于进一步的研究。



分享给朋友:
您可能感兴趣的文章:
随机阅读: