2012-04-01 8 views
1

ランダムな画像にどのフィルタが使用されているかを判断する必要があります。正しいもの(ガウス、プリウィット、ソベル、平均など)を検出する一般的な方法がありますか、一種の「ブルートフォース」検出?フィルタ検出

私はMatlabで見つけようとしましたが、それ以上の検索方法はありません。。現時点では、ヘイスタックで針を見つけるのが好きです。私はまた、bashスクリプトとimagemagickを使用することを考えましたが、これは空腹のリソースになるでしょう。

私はこれが問題ではないでしょう取り払わが、それは非常に時間がかかる Fは、元の画像とするフィルタを推測し、この

f = fspecial('gaussian', [3 3], 1); 
res = imfilter(orginal, f); 
corr2(res, pic); 
+1

あなたはフィルタリングされた画像と元の画像を持っている場合、それは、フィルタ係数を決定することは非常にシンプルだし、そこからあなたは、フィルタカーネルを分類することができます。 –

+0

はい、どちらもありますが、どのように係数を決定できますか? matlabで? – NaN

+1

両方の画像のFFTを取ってデコンボリューションし、除算して、結果の逆FFTを取ります。例えば、 http://www.mathworks.com/matlabcentral/fileexchange/5465-fast-deconvolution –

答えて

4

のようにそれを試して、をgことですように、1個、およびH fはに適用されるフィルタを濾過:

f * h = g 

渡すTHA tを周波数ドメインに変換する:

F.H = G, so H = G/F 

問題は、反転Fがノイズに非常に敏感であるということです。

MATLABでこれを実装する方法:

close all; 
f = imread('cameraman.tif'); 
[x,y] = size(f); 
figure,imshow(f); 
h = fspecial('motion', 20, 40); % abitrary filter just for testing the algorithm 
F = fft2(f); 
H = fft2(h,x,y); 
G = F.*H; 
g = ifft2(G); % the filtered image 
figure, imshow(g/max(g(:))); 
% Inverting the original image 
epsilon = 10^(-10); 
small_values = find(abs(F)<epsilon); 
F(small_values) = epsilon; 
F_i = ones(x,y)./F; 
H_calculated = G.*F_i; 

h_calculated = ifft2(H_calculated); 

% remove really small values to try to infer the original size of h 
r = sum(h_calculated,1)<epsilon; 
c = sum(h_calculated,2)<epsilon; 
h_real = h_calculated(~r,~c); 

% Calculate error 
% redo the filtering with the found filter 
figure,g_comp = ifft2(fft2(f).*fft2(h_real,x,y)); 
imshow(g_comp/max(g_comp(:))); 
rmse = sqrt(mean(mean((double(g_comp) - double(g)).^2,2),1)) 

編集を:ちょうど説明するイプシロン一部を:

それはFでいくつかの値がゼロである、またはゼロに非常に近いことをすることができます。これらの小さな値でFを反転しようとすると、無限大に問題が生じます。これを解決する簡単な方法は、Fの任意の小数点以下の小数点以下の小数点以下を切り捨てることです。

数学的には、どのように行われたことはこれです:

For all F < epsilon, F = epsilon 
+3

また、スペクトルヌルに対しても非常に敏感です。 –

+2

そうですね、それで私はそれを切り捨てているのです。私にとってこのアプローチの本当の問題はノイズです。しかし、それはまったく何よりも優れています... – Castilho