6

ガウスぼかしと FFT に関する SO に関する多くの質問を読みましたが、その手順を実装する方法についての回答はありません (ただし、「それはあなたの宿題です」などのコメントがあります)。カーネルを適切にパディングし、カーネルとイメージで FFT と IFFT を使用する方法を知りたいです。Java、Pythonなどの任意の言語で擬似コードまたは実装を提供できますか。これを行う方法、または少なくともそれを理解するための優れたチュートリアル:

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

ガウスぼかしと FFTからコピーされたステップ

4

1 に答える 1

3

Matlab例。それはあなたにとって良い出発点になるはずです。

画像を読み込みます:

%Blur Demo

%Import image in matlab default image set.
origimage = imread('cameraman.tif');

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

全体のプロセス:

%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(abs(fftkernel)<1e-6) = 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', [])

前の画像: 前の画像、ぼかしなし

後画像: アフターイメージ、ぼやけ

ゼロ フィリングではカーネルが中央に配置されないため、オフセットが発生することに注意してください。この回答は、ラッピングの問題を説明しています。 FFTによるガウスぼかし

于 2014-05-26T20:46:52.497 に答える