編輯:經過一些更多的測試和答覆形成scipy郵件列表,問題似乎與fspecial()。爲了得到相同的輸出,我需要在Matlab fspecial命令生成的Python中生成相同類型的內核。現在我會嘗試從matlab中導出內核並從那裏開始工作。添加爲編輯,因爲問題已經被「關閉」爲什麼從MATLAB移植到Python的代碼的輸出不同?
我想端口下面的MATLAB代碼到Python。它似乎工作,但輸出與MATLAB不同。我認爲問題在於對日誌應用「平均值」過濾器(振幅)。任何幫助讚賞。
的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的輸出。
嗯......不知道如何改善問題。我打算調查FFT實現之間的區別(謝謝科林)。看不到很多機會重新開放。討厭我必須等待2天才能刪除? – Michael
在scipy郵件列表進行了一些更多的測試和響應之後,問題似乎與fspecial()相同。爲了得到相同的輸出,我需要在Matlab fspecial命令生成的Python中生成相同類型的內核。現在我將嘗試從Matlab中導出內核並從那裏開始工作。我會嘗試將此添加爲原始帖子的修改。 – Michael