前言
在上一篇文章中讲了利用频谱图进行低通平滑滤波与高通锐化滤波:https://blog.youkuaiyun.com/qq_44785013/article/details/110132798
钝化滤波、高提升滤波以及高频强调滤波则是在低通滤波与高频滤波得到的结果上,进一步计算以获得更好的结果。除此之外,还有同态滤波以及拉普拉斯滤波等频率域图像增强方法。
一、钝化滤波以及高提升滤波
1.计算步骤
计算步骤:
(1)首先得到低通滤波后的结果图像
f
L
P
(
x
,
y
)
f_{LP}(x,y)
fLP(x,y);
(2)原图减去低通滤波图像得到差值
g
(
x
,
y
)
g(x,y)
g(x,y):
g
(
x
,
y
)
=
f
(
x
,
y
)
−
f
L
P
(
x
,
y
)
g(x,y)=f(x,y)-f_{LP}(x,y)
g(x,y)=f(x,y)−fLP(x,y)
(3)原图加上差值图得到增强图像
h
(
x
,
y
)
h(x,y)
h(x,y):
h
(
x
,
y
)
=
f
(
x
,
y
)
+
k
∗
g
(
x
,
y
)
h(x,y)=f(x,y)+k*g(x,y)
h(x,y)=f(x,y)+k∗g(x,y)
其中,k=1时为钝化滤波,k>1时为高提升滤波。
2.MATLAB代码
代码如下(以布特沃斯低通滤波为例):
im1=imread('1.jpg');
im1=rgb2gray(im1);
figure
imshow(im1)
r=80; %设置滤波圆半径参数为80,可调
img_f=fftshift(fft2(double(im1))); %傅里叶变换得到频谱
[m,n]=size(img_f);
O_x=fix(m/2);
O_y=fix(n/2); %获取圆心坐标
img=zeros(m,n); %提前定义滤波后的频谱,提高运行速度
for j=1:n
for i=1:m
d=sqrt((i-O_x)^2+(j-O_y)^2); %计算两点之间的距离
H(i,j)=1/((1+d/r)^4); %布特沃斯滤波器,这里设n=2,即2阶滤波器,n可调
img(i,j)=H(i,j)*img_f(i,j); %滤波
end
end
img=ifftshift(img); %傅里叶反变换
img=uint8(real(ifft2(img))); %取实数部分
figure
imshow(img) %以上为布特沃斯低通滤波
k=1; %k=1时为钝化滤波,k>1时为高提升滤波
g=im1-img;
h=im1+k*g;
figure
imshow(h)
imwrite(h,'h1.jpg')
当k分别为1和1.5时结果如下:
二、高频强调滤波
1.高频强调滤波器
h
(
x
,
y
)
=
F
−
1
[
(
k
1
+
k
2
∗
H
H
P
(
u
,
v
)
)
∗
F
(
u
,
v
)
]
h(x,y)=F^{-1}[(k_1+k_2*H_{HP}(u,v))*F(u,v)]
h(x,y)=F−1[(k1+k2∗HHP(u,v))∗F(u,v)]
高通滤波器会将零频分量置零,导致处理后的灰度值平均值变为0,上面滤波器加上
k
1
k_1
k1后,改善了这种情况。
k
2
k_2
k2可以调节高频比例。
2.MATLAB代码
代码如下(以布特沃斯高通滤波为例):
im1=imread('1.jpg');
im1=rgb2gray(im1);
figure
imshow(im1)
r=30; %设置滤波圆半径参数为30,可调
img_f=fftshift(fft2(double(im1))); %傅里叶变换得到频谱
[m,n]=size(img_f);
O_x=fix(m/2);
O_y=fix(n/2); %获取圆心坐标
img=zeros(m,n); %提前定义滤波后的频谱,提高运行速度
for j=1:n
for i=1:m
d=sqrt((i-O_x)^2+(j-O_y)^2); %计算两点之间的距离
H(i,j)=1/((1+r/d)^4); %布特沃斯高通滤波器,这里设n=2,即2阶滤波器,n可调
k1=1;
k2=3;
img(i,j)=(k1+k2*H(i,j))*img_f(i,j); %滤波
end
end
img=ifftshift(img); %傅里叶反变换
img=uint8(real(ifft2(img))); %取实数部分
figure
imshow(img)
imwrite(img,'h3.jpg')
结果如下: