版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37385726/article/details/82707222
目录
Python中OpenCV2下实现参见这里
一、初始知识
- 关于 distmatrix 的作用,见https://blog.csdn.net/qq_37385726/article/details/82697648,看源代码可以知道函数的意义。
- 但是,不懂函数的意义也没关系,只要记住,fftshift(distmatrix)生成的是各个坐标到中心坐标的距离即可
[M,N] = size(tif);
D = distmatrix(M,N);
dist = fftshift(D); %距离矩阵(距中心)
figure
subplot(1,2,1),mesh(D),title('distmatrix');
subplot(1,2,2),mesh(fftshift(D)),title('fftshift(distmatrix)');
- 关于傅里叶变换,知道频域滤波就知道傅里叶变换实现的是时域(空域)到频率域的转变,对于2D傅里叶变换,坐标(1,1) %Python中为(0,0)%是频率为0的直流信号,坐标(u,v)是在x方向频率为u,y方向频率为v的信号
二、理想LPF
扫描二维码关注公众号,回复:
4230089 查看本文章
由于生硬的过度,图像会产生振铃伪影。
% idea LPF
H1 = zeros(M,N);
radius = 35;
ind = dist <= radius;
H1(ind) = 1;
Hd1 = double(H1);
三、高斯LPF
% Gaussion LPF
sigma = 30;
H2 = exp(-dist.^2/2/sigma^2);
Hd2 = double(H2);
四、巴特沃斯(Butterworth)LPF
从函数图上看,更圆滑,用幂系数n可以改变滤波器的形状。n越大,则该滤波器越接近于理想滤波器
% Butterworth LPF
D0 = 30;
n = 3;
H3 = 1./(1+(dist/D0).^(2*n));
Hd3 = double(H3);
五、滤波器和频谱的卷积
I_dft = fft2(tif); %原频谱
fts = fftshift(I_dft); %shift后的频谱
ft_img1 = fts .* Hd1;
ft_img2 = fts .* Hd2;
ft_img3 = fts .* Hd3;
六、完整代码
tif = imread('C:\\Program Files\\MATLAB\\R2017a\\toolbox\\images\\imdata\\AT3_1m4_01.tif');
tif = im2double(tif);
I_dft = fft2(tif); %原频谱
fts = fftshift(I_dft); %shift后的频谱
[M,N] = size(tif);
D = distmatrix(M,N);
dist = fftshift(D); %距离矩阵(距中心)
% idea LPF
H1 = zeros(M,N);
radius = 35;
ind = dist <= radius;
H1(ind) = 1;
Hd1 = double(H1);
% Gaussion LPF
sigma = 30;
H2 = exp(-dist.^2/2/sigma^2);
Hd2 = double(H2);
% Butterworth LPF
D0 = 30;
n = 3;
H3 = 1./(1+(dist/D0).^(2*n));
Hd3 = double(H3);
ft_img1 = fftshift(I_dft) .* Hd1;
ft_img2 = fftshift(I_dft) .* Hd2;
ft_img3 = fftshift(I_dft) .* Hd3;
subplot(1,4,1),imshow(tif),axis tight,title('initial');
subplot(1,4,2),imshow(real(ifft2(fftshift(ft_img1)))),axis tight,title('Ideal LPF');
subplot(1,4,3),imshow(real(ifft2(fftshift(ft_img2)))),axis tight,title('Guassion LPF');
subplot(1,4,4),imshow(real(ifft2(fftshift(ft_img3)))),axis tight,title('Butterworth LPF');
三类滤波器mesh后的形状:
频谱的变化如下: