2014-05-18 20 views
5

Ho letto un sacco di domande su SO riguardo la sfocatura gaussiana e la FFT, ma non ci sono risposte su come implementarle (ma ci sono commenti come "sono i tuoi compiti"). Voglio sapere come riempire correttamente il kernel e usare FFT e IFFT su kernel e immagine. Potete fornire qualche pseudocodice o implementazione in qualsiasi lingua come Java, Python, ecc come fare questo, o almeno qualche buon tutorial su come capirlo:Corretta implementazione della sfocatura gaussiana tramite FFT

1. FFT the image 
2. FFT the kernel, padded to the size of the image 
3. multiply the two in the frequency domain (equivalent to convolution in the spatial domain) 
4. IFFT (inverse FFT) the result 

passaggi copiati da Gaussian blur and FFT

risposta

2

A Matlab Esempio. Dovrebbe essere un buon punto di partenza per te.

caricare l'immagine:

%Blur Demo 

%Import image 
origimage = imread('tonimorrison','jpg'); 

%Reduce image to 2-D 
origimage = origimage(:,:,1); 

%Plot image 
figure, imagesc(origimage) 
axis square 
colormap gray 
title('Original Image') 
set(gca, 'XTick', [], 'YTick', []) 

L'intero processo:

%Blur Kernel 
ksize = 31; 
kernel = zeros(ksize); 

%Gaussian Blur 
s = 3; 
m = ksize/2; 
[X, Y] = meshgrid(1:ksize); 
kernel = (1/(2*pi*s^2))*exp(-((X-m).^2 + (Y-m).^2)/(2*s^2)); 

%Display Kernel 
figure, imagesc(kernel) 
axis square 
title('Blur Kernel') 
colormap gray 

%Embed kernel in image that is size of original image 
[h, w] = size(origimage); 
kernelimage = zeros(h,w); 
kernelimage(1:ksize, 1:ksize) = kernel; 

%Perform 2D FFTs 
fftimage = fft2(double(origimage)); 
fftkernel = fft2(kernelimage); 

%Set all zero values to minimum value 
fftkernel(find(fftkernel == 0)) = 1e-6; 

%Multiply FFTs 
fftblurimage = fftimage.*fftkernel; 

%Perform Inverse 2D FFT 
blurimage = ifft2(fftblurimage); 

%Display Blurred Image 
figure, imagesc(blurimage) 
axis square 
title('Blurred Image') 
colormap gray 
set(gca, 'XTick', [], 'YTick', []) 
+0

Grande codice di esempio. Ho alcuni suggerimenti per renderlo ancora migliore. (1) Mostra un risultato di esempio usando un'immagine reale con cui possiamo testare. Stai usando 'imread' con un'immagine locale a cui non abbiamo accesso. (2) Non utilizzare semplicemente il canale rosso per convertire in scala di grigi. Usa 'rgb2gray' per farlo per te. (3) Se si ha tempo, estendere alle immagini a colori dove si eseguirà il filtro separatamente per canale. (4) Impostare tutti i valori zero su un valore minimo con 'find' è un po 'inefficiente. Usa invece l'indicizzazione logica: 'fftkernel (fftkernel == 0) = 1e-6;' Non hai bisogno di 'find' qui. – rayryeng

Problemi correlati