为什么输出从MATLAB到Python的代码不同?

时间:2013-05-15 17:38:54

标签: matlab python-2.7 fft

编辑: 经过scipy邮件列表的更多测试和回复后,问题似乎与fspecial()有关。为了获得相同的输出,我需要在Python中生成与Matlab fspecial命令生成的相同类型的内核。现在我将尝试从matlab导出内核并从那里开始工作。由于问题已被“关闭”而添加为编辑


我正在尝试将以下MATLAB代码移植到Python。它似乎工作但输出与MATLAB不同。我认为问题在于对对数(Amplituide)应用“均值”过滤器。任何帮助表示赞赏。

MATLAB代码来自:http://www.klab.caltech.edu/~xhou/projects/spectralResidual/spectralresidual.html

%% Read image from file
inImg = im2double(rgb2gray(imread('1.jpg')));
inImg = imresize(inImg, 64/size(inImg, 2));

%% Spectral Residual
myFFT = fft2(inImg);
myLogAmplitude = log(abs(myFFT));
myPhase = angle(myFFT);
mySpectralResidual = myLogAmplitude - imfilter(myLogAmplitude, fspecial('average', 3), 'replicate');
saliencyMap = abs(ifft2(exp(mySpectralResidual + i*myPhase))).^2;

%% After Effect
saliencyMap = mat2gray(imfilter(saliencyMap, fspecial('gaussian', [10, 10], 2.5)));
imshow(saliencyMap);

这是我在python中的尝试:

from skimage import img_as_float                                                       
from skimage.io import imread
from skimage.color import rgb2gray                                                    
from scipy import fftpack, ndimage, misc                                        
from scipy.ndimage import uniform_filter
from matplotlib.pyplot as plt

# Read image from file
image = img_as_float(rgb2gray(imread('1.jpg')))
image = misc.imresize(image, 64.0 / image.shape[0])

# Spectral Residual
fft = fftpack.fft2(image)                                                   
logAmplitude = np.log(np.abs(fft))                                          
phase = np.angle(fft)                                                       
avgLogAmp = uniform_filter(logAmplitude, size=3, mode="nearest") #Is this same a applying "mean" filter            
spectralResidual = logAmplitude - avgLogAmp                                 
saliencyMap = np.abs(fftpack.ifft2(np.exp(spectralResidual + 1j * phase))) ** 2

# After Effect
saliencyMap = ndimage.gaussian_filter(sm, sigma=2.5)
plt.imshow(sm)
plt.show()

对于completness,这里是输入图像和MATLAB和python的输出。

Input Image, Island Saliency Map (MATLAB) Saliency Map (PYTHON)

1 个答案:

答案 0 :(得分:2)

我怀疑任何人都能在这方面给你一个坚定的答案。它可以是任意数量的东西......可能是一个FFT以0为中心而另一个不是,可能是某个浮点数对比某个地方,可能是错误处理绝对值,可能是过滤器设置,......

如果我是你,我会为两个计算写出一些中间值,并找到比较它们的方法。从中间开始,如果他们比较好,然后向下移动,如果他们不比较好,那么向上移动。也许将python脚本中的中间值写入文件,导入到matlab中,采用元素差异和图形。如果它们的尺寸不同,那就是#1。