频率域图像增强
用傅里叶变换表示的函数特征可以完全通过傅里叶反变换进行重建而不丢失任何信息。
吉布斯现象Gibbs phenomenon(又叫吉布斯效应):将具有不连续点的周期函数(如矩形脉冲)进行傅立叶级数展开后,选取有限项进行合成。当选取的项数越多,在所合成的波形中出现的峰起越靠近原信号的不连续点。当选取的项数很大时,该峰起值趋于一个常数,大约等于总跳变值的9%。这种现象称为吉布斯现象。
一、傅里叶变换
l = fft2(x); %快速傅里叶变换 l = fft2(x,m,n);
x为输入图像;m和n分别用于将x的第一和第二维规整到指定的长度。当m和n均为2的整数次幂时算法的执行速度要比m和n均为素数时快。
-
l1 =
abs(l); %计算l的幅度谱
-
l2 = angle(l); %计算l的相位谱
-
Y = fftshift(l); %频谱平移
-
l = ifft2(x); %快速傅里叶逆变换
-
l =iff2(x,m,n);
-
%% fftshift 对数变换,所应用的图片本身很简单,就只有黑白
2种颜色
-
clc
-
clear
-
f = imread(
'.\images\dipum_images_ch04\Fig0403(a)(image).tif');
-
imshow(f)
-
title(
'原始图像')
-
imfinfo(
'.\images\dipum_images_ch04\Fig0403(a)(image).tif');%此处如果用Imfinfo(f)就会报错fft
-
%没有居中的傅里叶频谱
-
F=fft2(f);%进行二维快速傅里叶变换,其结果和DFT的一样,只是计算机的计算速度变快了而已,因而叫fft
-
S=
abs(F);%求傅里叶变换后的幅值
-
figure,subplot(
121),imshow(S,[]),title(
'傅里叶频谱图像1');%title函数一定要放在坐标显示的下一句才有效。
-
subplot(
122),imshow(S),title(
'傅里叶频谱图像2');%当没有第二个参数时,显示的图像为竖线加一些孤立的黑点
-
%居中的傅里叶频谱
-
Fc=fftshift(F);%将频谱图像原点移至图像矩形中间
-
S1=
abs(Fc);
-
figure,
-
subplot(
121),imshow(S1,[]);%加了第二个参数后显示的图像正常
-
%使用对数后视觉增强后的傅里叶频谱
-
S2=
log(
1+S1);
-
subplot(
122),imshow(S2,[]);
原始图像: 傅里叶频谱图:
居中频谱和对数后频谱:
补充:用fftshift对数变换显示稍微复杂的图片
-
%%%用fftshift对数变换显示稍微复杂的图片
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0409(a)(bld).tif');
-
imshow(f);
-
-
-
f=
double(f);%其实这句不要试过对后面的变换结果也没有影响
-
F=fft2(f);
-
Fc=fftshift(F);
-
S=
abs(Fc);
-
S2=
log(
1+S);%如果没有这句的话,那么根本看不到细节的图,所以一定要用对数压缩增加对比度
-
figure,imshow(S2,[])
二、频域滤波
没有经过0扩充:
-
%%先
0扩充再滤波
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0405(a)(square_original).tif');
-
imshow(f);
-
-
-
[M N]=size(f);
-
F=fft2(f);%没有经过
0扩充直接计算fft
-
sig=
10;%高斯滤波参数
-
H=lpfilter(
'gaussian',M,N,sig);
-
G=H.*F;%加了.号的乘法表示对应每个元素都相乘,没加.号的乘法说明是真正的矩阵乘法
-
g=real(ifft2(G));
-
figure,imshow(g,[]);
原图: 没有经过0扩充:
可知图像有些模糊,但是垂直边缘并不模糊。
经过0扩充:
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0405(a)(square_original).tif');
-
imshow(f);
-
-
PQ=paddedsize(size(f));%PQ为
0扩展的面积,这里设置为与图像的大小相同?这里size(f)的大小为
256*
256
-
Fp=fft2(f,PQ(
1),PQ(
2));%如果fft2有
3个参数的话,则是进行了
0扩展了
-
Hp=lpfilter(
'gaussian',PQ(
1),PQ(
2),
2*sig);%构造高斯滤波器 现在滤波器大小是不使用填充时滤波器大小的两倍
-
Gp=Hp.*Fp;%对
0扩展后的图像进行高斯滤波
-
gp=real(ifft2(Gp));
-
figure,imshow(gp,[]);
-
-
gpc=gp(
1:size(f,
1),
1:size(f,
2));%取gp图像的
1到f的第一维的行,
1到f第二维的列部分,即取与图像大小相同的部分
-
figure,imshow(gpc,[]);%此时显示的结果应该与g图像一样。
实验结果:
直接空间滤波器:
-
%直接使用空间域滤波
-
h=fspecial(
'gaussian',
15,
7);
-
gs=imfilter(f,h);
-
figure,imshow(gs,[]);
实验结果:
调用imfilter时,默认情形下会使用0来填充图像的边界。
三、空间滤波器和频域滤波器的比较
-
%%空间滤波和频域滤波的比较
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0409(a)(bld).tif');
-
imshow(f);
-
-
-
F=fft2(f);
-
S=fftshift(
log(
1+
abs(F)));
-
S=gscale(S);%用gscale来进行将数据缩放到默认值
0~
255
-
figure,imshow(S);
-
-
h=fspecial(
'sobel');%构造sobel空间滤波器
-
figure,freqz2(h);%查看滤波器的图形
-
-
-
PQ=paddedsize(size(f));
-
H=freqz2(h,PQ(
1),PQ(
2));%将空间滤波器h转换成频域滤波器H,但是滤波器的原点在矩阵的中心处
-
H1=ifftshift(H);%原点迁移到左上角
-
-
figure,mesh(
abs(H1(
1:
20:
1200,
1:
20:
1200)));
-
figure,subplot(
121),imshow(
abs(H),[]);
-
subplot(
122),imshow(
abs(H1),[]);
-
-
-
gs=imfilter(
double(f),h);%空间滤波,其实就是边缘检测
-
gf=dftfilt(f,H);%频域滤波
-
subplot(
121),imshow(gs,[]),subplot(
122),imshow(gf,[]);%将
2种滤波结果显示出来
-
-
figure,subplot(
121),imshow(
abs(gs)>
0.2
abs(max(gs(:))));%只显示最大值的20%的边缘
-
subplot(
122),imshow(
abs(gf)>
0.2
abs(max(gf(:))));
-
-
d=
abs(gs-gf);
-
a=max(d(:))
-
b=min(d(:))
实验结果:
Sobel滤波器图形:
将空间滤波器h转换成频域滤波器H且原点迁移到左上角
空间滤波和频域滤波对比:
经过阈值处理的结果:
四、构造低通滤波器
-
%%构造低通滤波器
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0413(a)(original_test_pattern).tif');
-
imshow(f);
-
-
-
F1=fft2(f);
-
imshow(
log(
1+
abs(fftshift(F1))),[]);%直接显示取对数后的傅里叶变换
-
-
-
PQ=paddedsize(size(f));
-
[U V]=dftuv(PQ(
1),PQ(
2));%这个函数还真不明白什么意思,help中解释的是计算网格频率矩阵U和V,这
2个矩阵是用来频率滤波的
-
D0=
0.05
PQ(2);
-
-
F=fft2(f,PQ(
1),PQ(
2));%用
0扩充大小为PQ(
1)*PQ(
2),然后fft变换
-
figure,imshow(
log(
1+
abs(fftshift(F))),[]);%显示
0扩充后的fft变换图
-
-
H=
exp(-(U.^
2+V.^
2)/(
2(D0^
2)));%构造频域滤波算子
-
figure,imshow(fftshift(H),[]);%显示平移后滤波器算子
-
g=dftfilt(f,H)
-
figure,imshow(g,[]);
原图像:
频谱图:
以图像形式显示的高斯低通滤波器:
处理后的图像:
低通滤波器处理后图像比原图像要模糊一些。
五、线框图与表面图
-
%%绘制一个低通滤波器的mesh图
-
clc
-
clear
-
H1=lpfilter(
'gaussian',
500,
500,
50)%构造一个中心点在左上角的高斯低通滤波器,size为
500*
500
-
H2=fftshift(H1);%将中心点平移至矩阵中心
-
mesh(H1(
1:
10:
500,
1:
10:
500)),figure,mesh(H2(
1:
10:
500,
1:
10:
500));%绘出
2者的mesh图
-
axis([
0
50
0
50
0
1]);%xy轴范围
0~
50,z轴范围
0~
1
-
figure,subplot(
121),imshow(H1,[]),subplot(
122),imshow(H2,[]);%绘出
2者的灰度图
实验结果:
将中心点平移至矩阵中心
灰度图:
六、锐化频域滤波器
-
%%使用高通滤波器
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0413(a)(original_test_pattern).tif');
-
-
PQ=paddedsize(size(f));
-
D0=
0.05*PQ(
1);
-
H=hpfilter(
'gaussian',PQ(
1),PQ(
2),D0);
-
g=dftfilt(f,H);
-
figure,subplot(
121),imshow(f),title(
'原始图像');
-
subplot(
122),imshow(g,[]),title(
'高斯高通滤波后结果');
滤波器处理之后,图像的边缘和其他亮度急速变化区得到了增强,图像失去大部分原图像所呈现的背景色调。
七、高频强调滤波
就是给高通滤波器上加上一个偏移量,若偏移量与将滤波器乘以一个大于1的常数结合起来,由于该变量乘数突出了高频部分,所以叫高频强调滤波。
-
%%将高通滤波和直方图均衡结合起来
-
clc
-
clear
-
f=imread(
'.\images\dipum_images_ch04\Fig0419(a)(chestXray_original).tif');
-
imshow(f)
-
title(
'原始图像')
-
-
-
PQ = paddedsize(size(f));
-
D0 =
0.05*PQ(
1);
-
HBW=hpfilter(
'btw',PQ(
1),PQ(
2),D0,
2);%构造高通Butterworth滤波器,截断频率为D0
-
H=
0.5+
2*HBW;
-
gdw=dftfilt(f,HBW);
-
gbw=gscale(gdw);%将灰度值自动缩放到
0~
255之间
-
figure,subplot(
121),imshow(gdw,[]);
-
title(
'高通滤波后图像');
-
-
-
gbe=histeq(gbw,
256);%直方图均衡化
-
subplot(
122),imshow(gbe,[]);
-
title(
'高通滤波且直方图均衡化后图像');
-
-
-
ghf=dftfilt(f,H);%H是HBW的线性变换
-
ghf=gscale(ghf);
-
figure,subplot(
121),imshow(ghf,[]);
-
title(
'高频强调滤波后图像');
-
-
-
ghe=histeq(ghf,
256);
-
subplot(
122),imshow(ghe,[]);
-
title(
'高频强调且均衡化后图像');
实验结果: