一个
Matlab
实例。这将是一个很好的起点。
加载图片:
origimage = imread('cameraman.tif');
figure, imagesc(origimage)
axis square
colormap gray
title('Original Image')
set(gca, 'XTick', [], 'YTick', [])
整个过程:
ksize = 31;
kernel = zeros(ksize);
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));
figure, imagesc(kernel)
axis square
title('Blur Kernel')
colormap gray
[h, w] = size(origimage);
kernelimage = zeros(h,w);
kernelimage(1:ksize, 1:ksize) = kernel;
fftimage = fft2(double(origimage));
fftkernel = fft2(kernelimage);
fftkernel(abs(fftkernel)<1e-6) = 1e-6;
fftblurimage = fftimage.*fftkernel;
blurimage = ifft2(fftblurimage);
figure, imagesc(blurimage)
axis square
title('Blurred Image')
colormap gray
set(gca, 'XTick', [], 'YTick', [])
前图像:
![未模糊的前图像](https://istack.dev59.com/TBEti.webp)
后图像:
![已模糊的后图像](https://istack.dev59.com/haoNz.webp)
注意,由于零填充没有将核心放置在中心,因此会产生偏移。本答案解释了包裹问题。使用FFT进行高斯模糊
imread
,而我们无法访问。(2)不要简单地使用红色通道转换为灰度。使用rgb2gray
来完成。(3)如果您有时间,请扩展到彩色图像,其中您将分别对每个通道执行过滤。(4)使用find
将所有零值设置为最小值有点低效。改用逻辑索引:fftkernel(fftkernel == 0) = 1e-6;
您在这里不需要find
。 - rayryeng