学习笔记:数字图像处理——频域滤波matlab
相角的改变对图像影响很大。
所以在滤波的时候,不改变相角,即等同影响实部和虚部,称之为零相移滤波器。
零相移滤波器必须是关于原点对称的。
基础代码:
%% 定义函数:二维傅里叶变化 和 逆变化 (中心化)
F = @(x) fftshift(fft2(x));
Ft = @(x) ifft2(ifftshift(x));
%% 傅里叶变化基础
f = imread('rice.jpg');
f = rgb2gray(f);
F = fft2(f); %傅里叶变化,未中心化
Fc = fftshift(F); %中心化
S = abs(Fc); %傅里叶谱,强度
S2 = log(1+abs(Fc)); %方便显示
phi = atan(imag(F),real(F)); %求相角
phi = angle(F); %也是求相角
f = real(ifft2(F)); %原空间图像
%% 频域滤波
% 频域的滤波实际上是周期性的,成为 循环卷积
%为了保证空间滤波 和 频域滤波 结果相同,在进行滤波之前,对空域图像填充0
% 有时候仅仅为了看简单的效果,可以不填充0,直接空间滤波
% 函数paddedsize:matlab没有自带的,Gonzalez书中的:函数paddedsize,只是计算大小的
% function PQ = paddedsize(AB,CD,PARAM)
% AB表示 f(x,y)的大小[A,B]
% CD表示 h(x,y)的大小[C,D]
% PQ表示 填充后的f大小[P,Q]
% PARAM 是干嘛的,我也不知道
% 函数lpfilter:M不带,生成一个低通滤波器,中心在边缘
% function H = lpfilter(type, M, N, D0, n)
% 'ideal' 'btw' 'gaussian'
% 内含 dftuv ,计算距离
% 函数hpfilter:M不带,生成一个高通滤波器,中心在边缘
% 函数dftfilt:M不带,接受输入图像和滤波器,输出滤波后图像,H中心在边缘
% function g = dftfilt(f, H)
% bandfilter函数,带阻,带通滤波器
%频域滤波
PQ = paddedsize(size(f));
Fp = fft2(f,PQ(1),PQ(2)); %padding方式计算fft,f自动填充到PQ的大小
Hp =lpfilter('gaussian',PQ(1),PQ(2),(PQ(1))/6);%生成一个PQ大小的高斯滤波器
Gp = Hp .* Fp;
gp = ifft2(Gp);
gpc = gp(1:size(f,1),1:size(f,2)); %修剪左上部分矩形大小为原始大小
imshow(gpc,[])
%频域滤波 直接使用 dftfilt
gpc = dftfilt(f, Hp);% Hp大小应该是填充后的大小PQ
imshow(gpc,[])
%空间滤波 都是matlab自带
h = fspecial('gaussian',15,7); %先生成空间滤波器
gs = imfilter(f,h); %再滤波
%空域生成 频域滤波函数
%h是空间滤波器,R C 是生成的频域滤波器的行列
%H的中心在中心
% H = freqz2(h,R,C);
H = freqz2(h,PQ(1),PQ(2));
H1 = ifftshift(H);
gf = dftfilt(f,H1);%频域滤波后结果