2013-05-15 60 views
1

編輯:經過一些更多的測試和答覆形成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的輸出。

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

+0

嗯......不知道如何改善問題。我打算調查FFT實現之間的區別(謝謝科林)。看不到很多機會重新開放。討厭我必須等待2天才能刪除? – Michael

+1

在scipy郵件列表進行了一些更多的測試和響應之後,問題似乎與fspecial()相同。爲了得到相同的輸出,我需要在Matlab fspecial命令生成的Python中生成相同類型的內核。現在我將嘗試從Matlab中導出內核並從那裏開始工作。我會嘗試將此添加爲原始帖子的修改。 – Michael

回答

2

我懷疑任何人都可以給你在這一個堅定的回答。它可以是任何數量的東西......可能是一個FFT是以0爲中心的,而另一個不是,可能是浮點數或雙精度,可能是錯誤處理絕對值,可能是過濾器設置,...

如果我是你,我會爲這兩種計算寫出一些中間值並找到一種方法來比較它們。從中間開始,如果他們比較好,然後向下移動,如果他們沒有比較好,然後向上移動。也許從python腳本中寫出一箇中間值到一個文件,導入到matlab中,採取元素方面的差異和圖形。如果它們不是相同的尺寸,那就是線索#1。

+0

謝謝,非常有幫助。我曾經假定在翻譯爲python時出現錯誤,並不認爲FFT的生成方式可能會有所不同。我會做更多的研究。 – Michael

+0

找到此SO帖子:http://stackoverflow.com/questions/8680909/fft-in-matlab-and-numpy-scipy-give-different-results這可能解釋了這種差異。 – Michael

+0

好的。轉置對我的情況沒有幫助。如果我刪除imresize(),那麼圖像看起來是一樣的,幾乎相同。我現在懷疑應用最終的高斯濾波器會導致「真正」的問題/差異,這對於較小的圖像具有更多的顯着影響。只需要找到相當於imfilter的python(saliencyMap,fspecial('gaussian',[10,10],2.5))「 – Michael