1

編集: いくつかのテストと scipy メーリング リストからの応答の後、問題は fspecial() にあるようです。同じ出力を得るには、Matlab の fspecial コマンドが生成するものと同じ種類のカーネルを Python で生成する必要があります。今のところ、カーネルを matlab からエクスポートして、そこから作業してみます。質問が「クローズ」されたため、編集として追加されました


次の 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()

完全を期すために、ここに入力画像と MATLAB および python からの出力を示します。

入力画像、島 顕著性マップ (MATLAB) 顕著性マップ (PYTHON)

4

1 に答える 1

2

これについては、はっきりとした答えを出せる人はいないと思います。それはいくつもの可能性があります...一方のFFTが0中心で、もう一方がそうではない可能性があります。どこかでfloat対doubleである可能性があり、絶対値の取り扱いが間違っている可能性があり、フィルター設定である可能性があります...

もし私があなたなら、両方の計算の中間値を書き出して、それらを比較する方法を見つけます。真ん中から始めて、うまく比較できれば下に移動し、うまく比較できなければ上に移動します。おそらく、python スクリプトからファイルに中間値を書き込んで、matlab にインポートし、要素ごとの差を取り、グラフ化します。それらが同じ次元でない場合、それが手がかり #1 です。

于 2013-05-15T21:17:07.763 に答える