图像增强实战:空域滤波、频域滤波和退化恢复滤波器(附全部代码)

Airshow 图像增强

一、设计背景

受天气状况、空气质量、成像距离、成像设备性能、相对运动等多种因素的影响,2022 年 11 月第十四届中国国际航空航天博览会现场的空中飞行表演的图像存在退化和不“清晰”的问题,如图1所示。在数字图像处理领域,通常采用空域和频域增强,以及图像恢复处理等方式改善图像的质量,提高“清晰度”。

图1 不清晰的图像

二、设计目标

观察和分析 Airshow 图像以及对应视频的特点,充分本课程所学的知识,设计相关的算法,改善图像质量,并进行主观质量评价。

三、设计内容

3.1空域滤波-直方图均衡化

3.1.1 原理

直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。

直方图的概念:对一幅灰度图像,其直方图反映了该图像中不同灰度级出现的统计情况。图2给出了一个直方图的示例,其中图(a)是一幅图像,其灰度直方图可表示为图(b),其中横轴表示图像的各灰度级,纵轴表示图像中各灰度级像素的个数。(需要注意,灰度直方图表示了在图像中各个单独灰度级的分布,而图像对比度则取决于相邻近像素之间灰度级的关系。)

图2 图像的直方图

直方图均衡化的理论依据:为讨论方便起见,以 r 和 s 分别表示归一化了的原图像灰度和经直方图均衡化后的图像灰度(因为归一化了,所以 r 和 s 的取值在0到1之间)。当 r = s = 0时,表示黑色;当 r = s = 1时,表示白色;当 r, s ∈(0, 1)时,表示像素灰度在黑白之间变化。(所谓直方图均衡化,其实是根据直方图对像素点的灰度值进行变换,属于点操作范围。换言之,即:已知r,求其对应的s。)在 [0,1] 区间内的任何一个 r ,经变换函数 T(r) 都可以产生一个对应的 s ,且s=T(r)

式中,T(r) 应当满足以下两个条件:

扫描二维码关注公众号,回复: 15921128 查看本文章
  1. 在 0≤r≤1 内,T(r) 为单调递增函数;(此条件保证了均衡化后图像的灰度级从黑到白的次序不变)

  1. 在 0≤r≤1 内有 0≤T(r)≤1。(此条件保证了均衡化后图像的像素灰度值在允许的范围内)

由概率论可知,如果已知随机变量 r 的概率密度是,而随机变量 s 是 r 的函数,则 s 的概率密度可以由求出。假定随机变量 s 的分布函数用表示,根据分布函数的定义有

公式1

又因为概率密度函数是分布函数的导数,因此公式1两边对 s 求导可得:

公式2

从公式2可以看出,通过变换函数 T(r) 可以控制图像灰度级的概率密度函数,从而改善图像的灰度层次,这就是直方图均衡化的理论基础。

又有:从人眼视觉特性来考虑,一幅图像的灰度直方图如果是均匀分布的,那么该图像看上去效果比较好(参考冈萨雷斯数字图像处理3.3节)。因此要做直方图均衡化,这里的应当是均匀分布的概率密度函数。

由概率论知识可知,对于区间 [a,b]上的均匀分布,其概率密度函数等于。如果原图像没有进行归一化,即,那么,归一化之后,所以这里的

由公式6可以知道,又因为,所以有。对这个式子两边积分得:

公式3

公式3就是我们所求的变换函数 T(r)。它表明当变换函数 T(r) 是原图像直方图的累积分布概率时,能达到直方图均衡化的目的。

对于灰度级为离散的数字图像,用频率来代替概率,则变换函数的离散形式可以表示为:

公式4

式中,(注:这里的,表示归一化后的灰度级;k表示归一化前的灰度级)。由公式4可以知道,均衡化后各像素的灰度级可直接由原图像的直方图算出来。需要说明的是,这里的也是归一化后的灰度级,其值在 0 到 1 之间;有时需要将其乘以L-1再取整,使其灰度级范围在 0 到 L-1之间,与原图像一致。

3.1.2 实现

由于我们要处理的是彩色图片,所以我们分别对R G B色彩分量进行直方图均衡化,最后再把处理后的彩色分量综合起来。即可得到增强后的图像。

每一个分量的均衡化实现步骤:

第一步,计算原始图像的灰度直方图

第二步,计算原始图像的像素总个数。

第三步,计算原始图像的灰度分布频率。

第四步,计算原始图像的灰度累积分布频率。

第五步,将归一化的乘以L-1再四舍五入,以使得均衡化后图像的灰度级与归一化前的原始图像一致。

第六步,根据以上映射关系,参照原始图像中的像素,可以写出直方图均衡化之后的图像。

值得注意的是,有些时候,这样做很有可能会导致结果图像色彩失真。因此我们也尝试了将RGB空间转换为HSV之后,对V分量进行直方图均衡化,以保证图像色彩不失真。(HSV分别指色调、饱和度、亮度)。

RGB转HSV的公式为:

3.2 频域滤波-巴特沃斯高通加强滤波

3.2.1 原理

通过观察需要增强的图片,我发现造成图片中有雾或者模糊不清晰的成分主要是图片中的低通分量,所以我考虑使用高通滤波器对图片的频域进行滤波处理。选用巴特沃斯高通滤波器进行实验。

在滤波之前,需要先将图像从空域转化为频域,即使用二维快速傅里叶变换(FFT)对图像进行转换。

二维FFT本质就是将一个图像分解成若干个复平面波之和。

巴特沃斯高通滤波器:表达式为

D(u,v)表示频域中点到频域平面的距离,是截止频率。当D(u,v)增大时,对应的H(u,v)逐渐接近1,从而使得高频部分得以通过;而D(u,v)减小时,H(u,v)逐渐接近于0,实现低频部分过滤。

巴特沃斯高通加强滤波器:通过实验我们发现:如果将巴特沃斯滤波器表达式的分母加一个常数,滤波效果将会比直接进行巴特沃斯高通滤波好很多。这是因为直接进行巴特沃斯高通滤波也会将图片中有用的低频信息去除掉,导致图像不清晰。而巴特沃斯高通加强滤波器则可以很好地保留有效信息,滤除低频噪声,实现图像增强。其表达式如下:

其中常数C的取值我们将尝试不同的值,从0.5到1,我们最终采用0.9作为增强效果最优的参数。

3.2.2 实现

我们将C的值从0到1进行遍历尝试,C等于0时即为巴特沃斯高通滤波器,观察C取不同值下对图片的增强效果,即可得到最佳的参数。预测试如下图:

原图像

C=0

C=0.5

C=0.7

C=0.9

C=1

可以发现,随着C的增加,图像亮度会提高,即对低频成分的保留增多,主观判断C=0.9时图像增强效果最好。故选用C=0.9。

除此之外,我们默认巴特沃斯滤波器的截止频率为5。我们也尝试了截止频率取50、250后的滤波效果。如下图:

原图像

d=5

d=50

d=250

显然,截止频率取5增强效果最好,所以,截止频率d参数选取5、加强常数C选取0.9。

3.3 退化恢复滤波器-反锐化恢复滤波器

3.3.1 原理

我们将图片从清晰变模糊的过程假设定义为反锐化过程,即降低图像的对比率,让图像显得“平滑”,也即降低图像中轮廓等细节的过程。现在我们使用该过程的反过程对图片进行恢复。即采用反锐化恢复滤波器。

反锐化恢复滤波器本质是一个钝化模糊的偏移矩阵,将图像与矩阵进行卷积后即让图片通过滤波器即可实现对图像的增强处理。

3.3.2 实现

反锐化恢复滤波器我们采用matlab自带的函数fspecial('unsharp')

来生成偏移矩阵,其中有一个参数ALPHA fspecial('unsharp',ALPHA),ALPHA取值为[0,1],其作用是控制滤波器的形状,默认值为0.2,我们就采用0.2的默认参数值。生成的矩阵如图。

四、结果测试与分析

4.1 空域滤波-直方图均衡化

直方图对比如图所示

可以看到,我们的方案较好地实现了直方图的均衡化,图像增强效果也很好。

如果将RGB转为HSV再进行直方图均衡化,结果对比如图

RGB直方图均衡化

HSV直方图均衡化

显然,直接使用RGB直方图均衡化的效果更好。

4.2三种方式的最优参数设置对比

三种方式的最优参数图像增强结果如图:

原图

空域滤波-直方图均衡化

频域滤波-巴特沃斯加强滤波

退化恢复滤波器-反锐化恢复滤波器

在这幅测试样例中,空域滤波的效果最好,其次是频域滤波,最后反锐化恢复滤波器只是加强了轮廓,并没有很好地去除雾气,但是仍起到了一些效果。

五、设计总结与反思

对于不同的图片,有时可能需要采用不同的方法进行图像增强,才能达到最优的效果,没有一种方法可以适用于所有图片。

六、附件(代码)

6.1空域滤波(一)直方图均衡化

%主函数
function coloraverage()
I=imread('g.png');
imshow(I);
I1=I(:,:,1);%提取红色分量
I2=I(:,:,2);%提取绿色分量
I3=I(:,:,3);%提取蓝色分量
I1=histogram(I1);   %构造的函数
I2=histogram(I2);
I3=histogram(I3);
c=cat(3,I1,I2,I3);  %cat用于构造多维数组
subplot(2,2,1);imshow(I);title('输入图像'); 
subplot(2,2,2);imhist(I);title('输入图像的直方图'); %显示图片灰度值的统计结果直方图
subplot(2,2,3);imshow(c);title('处理后图像'); 
subplot(2,2,4);imhist(c);title('处理后图像的直方图'); %显示图片灰度值的统计结果直方图
imwrite(c,'g1.png');


%调用的(直方图均衡化)构造函数
function d=histogram(I)%构造histogram函数
J=I;
[m,n]=size(I);      %确定矩阵大小
area=m*n;
a=zeros(1,256);     %产生1*256的零矩阵a,用来存放原始图像各个灰度值的个数
b=zeros(1,256);
for i=1:m           %记录各个灰度值的个数
    for j=1:n
        d=I(i,j)+1;   %获取(i,j)位置的灰度值(注意:灰度值为0-255,对应矩阵的1-256)
        a(1,d)=a(1,d)+1;    %矩阵a上对应灰度值的计数+1
    end
end
for i=1:256         %均衡化
    sum=0;
    for j=1:i
        sum=sum+a(1,j);
    end
    b(1,i)=sum*255/area;
end
for i=1:m           %用均衡化后的数据代替原位置的数据
    for j=1:n
        d=J(i,j)+1;
        J(i,j)=b(1,d);
    end
end
d=J;

6.2空域滤波(二)RGB转HSV后均衡化

I=imread('tst1.png');
R=rgb2hsi(I);
H1=R(:,:,1);
S1=R(:,:,2);
X1=R(:,:,3);
g1=histeq(H1);
g2=histeq(S1);
g3=histeq(X1);
I1=cat(3,H1,S1,g3);
f1=hsi2rgb(I1);
subplot(2,2,1);imshow(I);title('输入图像'); 
subplot(2,2,2);imhist(I);title('输入图像的直方图'); 
subplot(2,2,3);imshow(f1);title('HSI均衡化图像'); 
subplot(2,2,4);imhist(f1);title('HSI均衡化图像的直方图'); 
imwrite(f1,'05HSI均衡化图像.jpg');

function hsi = rgb2hsi(rgb)
 
% 抽取图像分量
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
 
% 执行转换方程
num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).^2 + (r - b).*(g - b));
theta = acos(num./(den + eps)); %防止除数为0
 
H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);
 
num = min(min(r, g), b);
den = r + g + b;
den(den == 0) = eps; %防止除数为0
S = 1 - 3.* num./den;
 
H(S == 0) = 0;
 
I = (r + g + b)/3;
 
% 将3个分量联合成为一个HSI图像
hsi = cat(3, H, S, I);
end


function rgb=hsi2rgb(hsi)
H=hsi(:,:,1)*2*pi;
S=hsi(:,:,2);
I=hsi(:,:,3);
%实现转换方程式
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));
% R G (0<=H<2*pi/3).
idx=find((0<=H)&(H<2*pi/3));
B(idx)=I(idx).*(1-S(idx));
R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));
G(idx)=3*I(idx)-(R(idx)+B(idx));
% B G (2*pi/3<=H<4*pi/3).
idx=find((2*pi/3<=H)&(H<4*pi/3));
R(idx)=I(idx).*(1-S(idx));
G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));
B(idx)=3*I(idx)-(R(idx)+G(idx));
% B R
idx=find((4*pi/3<=H)&(H<=2*pi));
G(idx)=I(idx).*(1-S(idx));
B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));
R(idx)=3*I(idx)-(G(idx)+B(idx));
%将所有三个结果合并为RGB图像。裁剪到[0,1]以补偿浮点算术舍入效果
rgb=cat(3,R,G,B);
rgb=max(min(rgb,1),0);
end

6.3巴特沃斯频域滤波

clc;
clear all;
close all;
J=imread('j.png');
% if size(J, 3)==3
%     J = rgb2gray(J);
% end 
J1=J(:,:,1);%提取红色分量
J2=J(:,:,2);%提取绿色分量
J3=J(:,:,3);%提取蓝色分量
subplot(1,3,1);imshow(uint8(J));xlabel('input');
con=0.9;
dc=5;
%-------------------------------彩色分量R----------------------------------
J1=double(J1);
f=fft2(J1);      %采用傅里叶变换
g=fftshift(f);   %数据矩阵平衡
[M,N]=size(f);
n1=floor(M/2);
n2=floor(N/2);
n=2;

d1=dc;%截止频率
for i=1:M        %进行巴特沃兹高通滤波和巴特沃兹高通加强滤波
    for j=1:N
        d=sqrt((i-n1)^2+(j-n2)^2);
        if d==0
            h1=0;
            h2=con;
        else
            h1=1/(1+(d1/d)^(2*n));
            h2=1/(1+(d1/d)^(2*n))+con;
        end
        gg1(i,j)=h1*g(i,j);
        gg2(i,j)=h2*g(i,j);
    end
end
gg1=ifftshift(gg1);
gg1=uint8(real(ifft2(gg1))); 

gg2=ifftshift(gg2); 
gg2=uint8(real(ifft2(gg2))); 
%--------------------------巴特沃斯高通滤波结束-----------------------------




%--------------------------彩色分量G---------------------------------------
J2=double(J2);
f=fft2(J2);      %采用傅里叶变换
g=fftshift(f);   %数据矩阵平衡
[M,N]=size(f);
n1=floor(M/2);
n2=floor(N/2);
n=2;

d1=dc;%截止频率
for i=1:M        %进行巴特沃兹高通滤波和巴特沃兹高通加强滤波
    for j=1:N
        d=sqrt((i-n1)^2+(j-n2)^2);
        if d==0
            h1=0;
            h2=con;
        else
            h1=1/(1+(d1/d)^(2*n));
            h2=1/(1+(d1/d)^(2*n))+con;
        end
        gg3(i,j)=h1*g(i,j);
        gg4(i,j)=h2*g(i,j);
    end
end
gg3=ifftshift(gg3);
gg3=uint8(real(ifft2(gg3))); 

gg4=ifftshift(gg4); 
gg4=uint8(real(ifft2(gg4))); 
%--------------------------------------------------------------------------
%-----------------------------彩色分量B------------------------------------
J3=double(J3);
f=fft2(J3);      %采用傅里叶变换
g=fftshift(f);   %数据矩阵平衡
[M,N]=size(f);
n1=floor(M/2);
n2=floor(N/2);
n=2;

d1=dc;%截止频率
for i=1:M        %进行巴特沃兹高通滤波和巴特沃兹高通加强滤波
    for j=1:N
        d=sqrt((i-n1)^2+(j-n2)^2);
        if d==0
            h1=0;
            h2=con;
        else
            h1=1/(1+(d1/d)^(2*n));
            h2=1/(1+(d1/d)^(2*n))+con;
        end
        gg5(i,j)=h1*g(i,j);
        gg6(i,j)=h2*g(i,j);
    end
end
gg5=ifftshift(gg5);
gg5=uint8(real(ifft2(gg5))); 

gg6=ifftshift(gg6); 
gg6=uint8(real(ifft2(gg6))); 
%--------------------------------------------------------------------------
c1=cat(3,gg1,gg3,gg5);  %cat用于构造多维数组
c2=cat(3,gg2,gg4,gg6);  %cat用于构造多维数组
subplot(1,3,2);imshow(c1);   %显示巴特沃兹高通滤波
xlabel('巴特沃兹高通滤波 5');
% imwrite(c1,'05 巴特沃兹高通滤波 5.jpg');

subplot(1,3,3);imshow(c2);   %显示巴特沃兹高通加强滤波
xlabel('巴特沃兹高通加强滤波 5');
imwrite(c2,'j2.png');



6.4反锐化恢复滤波器

I=imread('c.png');
subplot(221);
imshow(I);
title('src');
H=fspecial('motion',20,30); %运动卷积的偏移矩阵
MotionBlur=imfilter(I,H); %卷积
subplot(222);
imshow(MotionBlur);
title('MotionBlur')
H1=fspecial('disk',10); %圆盘状偏移矩阵
disk=imfilter(I,H1); %卷积
subplot(223);
imshow(disk);
title('disk')
H2=fspecial('unsharp'); %钝化模糊的偏移矩阵
unsharp=imfilter(I,H2); %卷积
subplot(224);%H = fspecial(‘unsharp’,alpha)为对比度增强滤波器。参数alpha用于控制滤波器的形状,范围为【0,1】,默认值为0.2。返回的也是3×3大小的矩阵
imshow(unsharp);
title('unsharp')
imwrite(unsharp,'c3.png');

猜你喜欢

转载自blog.csdn.net/m0_63859672/article/details/128751753