系列文章
·【基于MATLAB的数字图像处理】第二章·视觉系统与图像处理系统
·【基于MATLAB的数字图像处理】第四章·图像增强
·【基于MATLAB的数字图像处理】大作业·综合图像处理平台
目录
图像增强是指采用一系列技术,对原图像进行处理、加工,使其更适合具体的应用要求,改善图像的视觉效果,将图像转换成一种更加适合于人和机器进行分析处理的形式。
图像增强不是以图像保真为原则,而是以需要为原则,增强图像中需要的信息,去除或削弱一些不需要的信息,分为空域增强和变换域增强,变换域增强主要是频域增强。
- 空域增强:直接对图像的像素灰度值进行操作。包括图像的灰度变换、直方图修正、图像空域平滑和锐化处理等。
- 频域增强:在图像的变换域中,对图像的变换值进行操作,然后经逆变换获得所需的增强结果,常用的方法包括低通滤波、高通滤波以及同态滤波等。
一、空域图像增强技术
空域增强的通式是:
代表增强操作
点操作: 定义在每个(x,y)点上,输出图像的每个像素的灰度值仅由相应输入像素决定,如灰度映射方法。
模板操作:定义在点的邻域上,通常是使用一个模板滑过整幅图像产生新的像素,输出像素的灰度值由对应输入像素的一个邻域内的几个像素的灰度值共同决定,如图像平滑和图像锐化。
1.灰度直方图
灰度直方图:灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其横坐标是灰度级,纵坐标是该灰度出现的频率(像素的个数,或个数与总数之比)
直方图的性质:
- 不表示图像的空间信息:直方图只反应图像灰度分布的特性,和灰度所在的位置无关,将同一副图像中的像素位置改变时,图像的视觉效果会改变,但是灰度直方图并不会发生变化
- 直方图反映了图像整体灰度分布的情况:较暗的图像,直方图的组成主要集中在灰度级低的一边;较亮的图像,直方图倾向于灰度级高的一侧。
- 直方图有叠加性:如果一图像由两个不连接的区域组成,并且每个区域的直方图已知,则整幅图像的直方图是该两个区域的直方图之和
直方图的用途:
- 判断量化是否恰当:一幅高质量的数字图像应该利用全部或几乎全部可能的灰度级
- 判断图像明暗:通过直方图的性质2可以判断图像整体效果的明暗
- 判断图像对比度:在直方图中强对比度的图像灰度分布比较分散,而弱对比度的图像分布比较集中
- 边界阈值选择:对于双峰直方图(一幅图背景是浅色的,其中有一个深色的物体),可以将阈值选定在两峰之间的谷处,用来提取前景物体的边界
例程:
%% 显示Lena女士灰度图的直方图
clear;clc;
I=imread("Lena.tif");
I=im2double(I);
subplot(121);imshow(I);
subplot(122);imhist(I);
效果:
2.直方图修正技术
a.直方图均衡化
直方图均衡化主要是用于增强动态范围偏小的图像的反差,将原图像的直方图变为均匀分布,增加像素值的动态范围,增加图像整体的对比度效果。以累计分布函数变换法为基础。
图像均衡化的步骤如下:
- 统计给定图像中各灰度级像素个数
- 计算图像中每个灰度级的像素出现概率
- 计算累计直方图
- 取整
- 确定映射对应关系 k->
- 对图像进行增强变换(k->)
例程:
%% 直方图均衡化
N=histeq(M); %直方图均衡化
figure;
subplot(221);imshow(M);title("原图像");
subplot(222);imhist(M);title("原图像直方图");
subplot(223);imshow(N);title("均衡化后图像");
subplot(224);imhist(N);title("均衡化后直方图");
效果:
直方图均衡化由于它的变换函数采用的是累积分布函数,因此只能产生近似均匀的直方图,这样就限制它的效能,也就是说,在不同的情况下,并不总是需要具有均匀直方图的图像。
另外它的增强效果不易控制,处理的结果总是得到全局均衡化的直方图,有时需要变换具有特定的直方图的图像,以便能对图像中某种灰度级加以增强,即有选择性的增强某个灰度值范围内的对比度,这时就要用到直方图规定化。
b.直方图规定化
直方图规定化是修改一幅图像的直方图,使它与另一幅图像的直方图匹配或具有另一种预先规定的函数形状。
直方图规定化步骤:
- 对原始直方图进行灰度均衡化
- 规定需要的直方图,计算能使规定直方图均衡化的变换
- 将原始直方图对应映射到规定直方图
第三步中采用的映射规则十分重要,一种为单映射方法,是从原始累积直方图向规定直方图映射,但有时存在较大的取整误差;另一种是组映射方法,是从规定直方图向原始累积直方图映射,映射误差较小。
例程:
%% 直方图规定化
hgram=50:1:250; %直方图规定化的指定向量
G=histeq(M,hgram); %直方图规定化
subplot(325);imshow(G);title("规定化后图像");
subplot(326);imhist(G,64);title("规定化后直方图");
效果:
3.图像灰度映射
灰度映射:根据某种灰度映射规则(变换函数),将原始图像中每个像素的灰度值转化为另一灰度。
灰度映射是一种点操作,关键在于合理的设计映射函数,赋予各个点新的灰度值,以使图像产生新的视觉效果
a.线性灰度映射
线性灰度映射是最简单的一种映射方法:
根据系数a、b不同的取值,可以对图像进行不同的操作:
- 若a=0,b=0,图像灰度值不发生变化
- 若a=1,b≠0,图像灰度值上移或下移,图像整体变量或变暗
- 若0<a<1,图像变暗,对比度减弱,相当于对图像进行压缩
- 若a>1,图像变亮,对比度增强,相当于对图像进行放大
- 若a<0,暗区域变亮,亮区域变暗
- 若a=-1,b=max,反色
其中非常常用的是图像取反操作,当黑色面积占据整幅图像的主导地位时,经常使用取反操作,将图像的内容显示的更明显。
例程:
%% 线性灰度映射操作
a=input('请输入线性灰度映射系数a:');
b=input('请输入线性灰度映射系数b:');
J=I*a+b;
figure;
subplot(221);imshow(I);title("原图");
subplot(222);imhist(I);title("原图的直方图");
subplot(223);imshow(J);title("变换后的图像");
subplot(224);imhist(J);title("变换后的直方图");
效果:
b.分段线性灰度映射
分段线性灰度映射主要功能是用来增强图像的对比度,通过将图像的值域分成多个值域并进行不同的线性变换,可以根据自己的需要,对某一段进行压缩或扩展。
比如这个图,第一段是将原来灰度值为94的点,压缩为26,第二段将原来灰度值为226的点压缩为154,实现了分段压缩;常用的方式是将接近于黑色(灰度值接近于0)的部分压缩为黑色,接近于白色(灰度值接近于255)的部分扩展为白色,以增强图像的对比度。
例程:
%% 分段线性灰度映射操作
M=imadjust(I,[0.3,0.7],[0,1],1);
figure;
subplot(221);imshow(I);title("原图");
subplot(222);imhist(I);title("原图的直方图");
subplot(223);imshow(M);title("变换后的图像");
subplot(224);imhist(M);title("变换后的直方图");
效果:
c.非线性灰度映射
非线性灰度映射最常用的映射函数就是对数函数,它的目的是对原图进行灰度压缩,将原来动态范围很大的图像压缩到显示器设备允许的动态范围。
对数变换的公式为:t=Clog(1+|s|)
C:尺度比例系数,用于调节动态范围
在程序中,可以通过改变imadjust函数中最后一项gamma变量调节曲线形状,gamma>1时映射偏重于更低数值(灰暗)输出,形状为下凸;gamma<1时映射偏重于更高数值(明亮)输出,形状为上凸;
例程:
%% 非线性灰度映射操作
gamma=input('请输入gamma的值,大于1为下凸,小于1位上凸:');
M=imadjust(I,[0.3,0.7],[0,1],gamma);
figure;
subplot(221);imshow(I);title("原图");
subplot(222);imhist(I);title("原图的直方图");
subplot(223);imshow(M);title("变换后的图像");
subplot(224);imhist(M);title("变换后的直方图");
效果:
d.灰度切分
灰度切分是分段线性映射的一种特例,当分段线性映射的两个拐点取值相等时,就变为了灰度切分映射,它是用来使s1与s2之间的灰度级更突出。
4.图像间的运算
图像间的运算是指以图像为单位进行的操作,运算结果是一幅新图像,是两幅图像进行点对点的加减乘除运算后得到输出图像的过程。
a.加法运算
加法运算主要应用分为两个:
- 用于多幅图像求平均效果,以便有效降低具有叠加性的随机噪声
- 一幅图像叠加到另一幅图像上去,达到二次曝光(Double-exposure)
一把我们实际采集到的图像,经常有一些干扰和噪声混入到图像中,表达式如下:
e(x,y)为噪声项,一般假设噪声都是符合高斯分布的,均值为0,那么我们就可以采集一系列的图像g(x,y)进行相加计算均值,来消除噪声:
进行无限张图像求平均后, 新图像的期望就只有f(x,y)一项了;实际过程中,随着平均图数量的增加,噪声在每个像素位置的影响逐步减小。
例程:
%% 加法运算
clear;clc;
I=imread('ins1.png');
I=I(:,1:640,:);
J=imread('ins2.png');
K=imadd(I,J); %图像间的相加操作 等价于 K=I+J
subplot(221);imshow(I);
subplot(222);imshow(J);
subplot(223);imshow(K);
subplot(224);imhist(K);
效果:
b.减法运算
图相间的减法运算通常用于提取两图之间的差异,以及去除背景等方面。在图像中运动物的检测中,通过前后两个图像的减法运算,可以了解运动物体移动的程度,计算出运动速度,并画出移动轨迹。
例程:
%% 减法运算
%减去不均匀背景
rice=imread('rice.png');
background=imopen(rice,strel('disk',15)); %取半径为15的圆盘结构元素对图像用开运算估计背景
rice2=imsubtract(rice,background); %图像间的相减操作 等价于 K=I-J
figure;
subplot(121);imshow(rice);
subplot(122);imshow(rice2);
%识别前景物体
car1=imread('car1.png');
car2=imread('car2.png');
car3=imsubtract(car1,car2);
car4=imsubtract(car2,car1);
Z=imadd(car3,car4);
figure;
subplot(221);imshow(car1);
subplot(222);imshow(car2)
subplot(223);imshow(Z);
subplot(224);imhist(Z);
效果:
c.乘法运算
图像的乘法运算主要用于提取图像中的某些内容,也就是进行掩模操作,提取出感兴趣的部分,通常需要两幅图像满足以下条件:
- 两幅图像同样大小
- 模板图像中对应原图像感兴趣的区域像素灰度值设置为1
- 模板图像中对应原图像需要删除的区域像素灰度值设置为0
一幅图像乘以一个常数实现的是缩放操作,如果使用的缩放因数大于1,则原图像亮度增强;通过缩放因数小于1,则原图像亮度变暗。
例程:
d.除法运算
图像的除法运算可以矫正成像设备的非线性影响,也可以检测两幅图像之间的差别,但是除法操作得到的是相应像素之间的变换比例,而不是每个像素的绝对差异,应用不多,就不写例程了,懒。
函数名 | 功能 |
imadd | 两图像的加法 |
imsubtract | 两图像的减法 |
immultiply | 两图像的乘法 |
imdivide | 两图像的除法 |
imabsdiff | 两图像的绝对值差值 |
imcomplment | 一幅图像的补运算 |
imlincomb | 计算两幅图像的线性组合 |
5.图像平滑处理
图像平滑处理是空域滤波的一种常见的方法,是利用像素及像素邻域组成的空间进行图像增强的方法,目的是平滑图像或锐化图像,原理是对图像进行模板运算,比如模板卷积,步骤如下:
- 将模板在图像中漫游,并将模板中心与图像中某个像素位置重合
- 将模板上的各个系数与模板下各对应像素点的灰度值相乘
- 将所有乘积相加,再除以模板的系数个数
- 将上述木板的输出赋值给图中模板中心位置的像素
图像平滑操作主要是为了消除图像中的噪声,图像中的噪声分为两类:高斯噪声和椒盐噪声
高斯噪声:一种源于电子电路噪声和由低照明度或高温带来的传感器噪声。高斯噪声也常称为正态噪声,符合高斯分布。高斯噪声可以通过空域滤波的平滑滤波方法来消除。
椒盐噪声:指图像中出现的噪声只有两种灰度值,分别为a和b,通常情况下脉冲噪声总是数字化为允许的最大或最小值,所以负脉冲以黑点(类似胡椒)出现在图像中,正脉冲以白点(类似盐)出现在图像中。
噪声实例:
%% 添加图像噪声
clear;clc;
I=imread('ins1.png');
N1=imnoise(I,'gaussian',0.2);
N2=imnoise(I,'salt & pepper',0.09);
subplot(131);imshow(I);title("原图像");
subplot(132);imshow(N1);title("高斯噪声");
subplot(133);imshow(N2);title("椒盐噪声");
效果:
a.线性平滑滤波器
邻域平均法:最简单的平滑滤波处理方法,模板所有系数都为1,基本思想是用几个像素的平均值代替每个像素的灰度,可以选择模板的大小,常用的有3X3、5X5等大小,注意邻域选择过大,会使图像的灰度突变边缘变得模糊,并且必须保证全部权系数之和为1。
实例:
%% 邻域平均法
H1=ones(3,3)/9; %3x3模板
J=imfilter(I,H1); %领域平均
J1=imfilter(N1,H1);
J2=imfilter(N2,H1);
figure;
subplot(231),imshow(I);title("原图像");
subplot(232),imshow(N1);title("高斯噪声");
subplot(233),imshow(N2);title("椒盐噪声");
subplot(234),imshow(J);title("原图像平滑");
subplot(235),imshow(J1);title("高斯噪声平滑");
subplot(236),imshow(J2);title("椒盐噪声平滑");
效果:
优化版本--阈值邻域平均法:为了减轻图像均值滤波带来的模糊,基本思想是当某个像素的灰度值大于其邻域像素的平均值,且达到了一定水平,就判断该像素为噪声,使用邻域像素的均值取代这一像素,否则的话,图像的像不改变。
加权平均法:均值滤波器的缺点是会将图像变得模糊,在将噪声点分摊的同时,将图像中景物的边界也分摊了,为了改善效果,可以使用加权平均的方式构造滤波器。一般离中心近的像素对滤波的贡献大,所以选择中心的系数大,周围的系数小,但无论使用哪种模板,都必须保证全部权系数之和为单位值。
b.非线性平滑滤波器
虽然均值滤波器对噪声有抑制作用,但同时会使图像变得模糊。即使是加权均值滤波,改善的效果也是有限的,为了有效地改善这一状况,必须改换滤波器的设计思路,中值滤波就是一种有效的方法。
它的基本思路是:噪声(如椒盐噪声)使该点像素比周围的像素亮(暗)许多。如果在某个模板中,对像素进行由小到大排列的重新排列,那么最亮的或者是最暗的点一定被排在两侧,取模板中排在中间位置上的像素的灰度值替代待处理像素的值,就可以达到滤除噪声的目的。
算法步骤:
- 将模板中心与像素位置重合
- 读取模板下各对应像素的灰度值
- 将这些灰度值从小到大排成1列
- 找出这些值里排在中间的1个
- 将这个中间值赋给模板中心位置像素
对于椒盐噪声,中值滤波效果比均值滤波效果好。椒盐噪声的噪声灰度值为0或255,分布在灰度级的两侧,中值滤波选择中间的灰度值代替像素点,可以避免噪声。
对于高斯噪声,均值滤波效果比中值滤波效果好。因为高斯噪声的均值为0,通过取模板的均值滤波可以消除噪声。
中值滤波其实是属于百分比滤波的一种特例,常用的百分比滤波器有最大值滤波器和最小值滤波器,中值滤波选择排序为50%的值代替像素点,最大值滤波器选择排序为100%,可以去除图像中的暗斑,同时也会使亮斑增大;最小是滤波器选择排序为0%,可以去除图像中的亮斑 ,同时也会增大暗斑。
实例:
%% 中值滤波
close all;
M=rgb2gray(imread('rice.png'));
M=im2double(M);
Mnoise=imnoise(M,'salt & pepper',0.03);
Mmidfilter=medfilt2(Mnoise); %使用默认的3X3模板进行中值滤波
figure;
subplot(131);imshow(M);title("原图");
subplot(132);imshow(Mnoise);title("噪声图");
subplot(133);imshow(Mmidfilter);title("中值滤波");
效果:
6.图像锐化处理
图像锐化的主要目的是得到边缘鲜明的图像或者需要得到图像的边缘轮廓,突出图像的边缘信息,加强图像的轮廓特征。
因为边缘和轮廓都位于灰度突变的地方。所以锐化算法的实现是基于微分作用。
对一幅图像施加梯度模算子,可以增强灰度变化的幅度,对于离散函数,可以利用差分来代替微分运算:
几种常见地算子:
a.水平垂直算子
表达式:
模板图:
b.Roberts算子
Roberts算子用交叉的差分表示,交叉的梯度称为罗伯茨(Roberts)梯度,其表达式:
模板图:
c.Priwitt算子
模板图:
d.Sobel算子
Sobel算子是最常用的一种算子,效果一般来说都很好,相当于是Priwitt算子的加权版本
模板图:
模板系数输出处理:由于模板系数有正有负,而且总平均值为0,所以输出值也会有正有负,而且总平均值也为0,在图像处理中一般限制图像的灰度值为正,所以卷积锐化后,需要将输出图的灰度值范围变回原图像的灰度范围,常用的方法有两种:
- 整体加一个正数,这样可以得到类似浮雕的效果
- 将所有的像素取值为平均值,可以获得对边缘的有方向提取
实例:
%% 锐化滤波
clear;clc;
I=rgb2gray(imread('rice.png'));
I=im2double(I);
h=[0,1,0;1,-4,1;0,1,0]; %拉普拉斯算子
J=conv2(I,h,'same');
K=I-J;
subplot(121);imshow(I);title("原图");
subplot(122);imshow(K);title("锐化后图像");
%% 使用不同算子进行锐化
close all;figure;
subplot(131);
imshow(I);
title('原图像');
BW1=edge(I,'Roberts'); %使用Roberts算子
subplot(132);imshow(BW1);title('Roberts算子');
BW2=edge(I,'sobel'); %使用Sobel算子
subplot(133);imshow(BW2);title('Sobel算子');
% 更多的可选参数:'Prewitt' 'log' 'zerocross' 'Canny' 'approxcanny'
效果:
二、频域图像增强技术
频域增强技术是以卷积定理为基础的,通过卷积运算,将时域空间的图像卷积,变为频域空间的相应频谱的乘积。
一般步骤如下:
- 计算图像的傅里叶变换
- 将其与一个根据实际需要的转移函数相乘
- 将输出结果通过傅里叶逆变换以得到增强的图像
常用的有:低通滤波器、高通滤波器、带阻带通滤波器、同态滤波器
1.低通滤波器
a.理想低通滤波器
理想的低通滤波器是指小于截止频率D的信号可以完全不受影响的通过滤波器,而大于D的信号则可以完全滤除,但这种理想状态在现实中是不存在的,实际电子器件不可能呈现出这样的效果。
因为图像的边缘和尖锐细节主要集中在高频部分,会被滤除掉,因此截止频率越小,得到的图像边界变得越不清晰,图像整体变得更加模糊,会产生一种很严重的振铃效应,理想低通滤波所产生的“振铃”现象在2-D图像上表现为一系列同心圆环,圆环半径反比于截断频率,如果D0较小,就会产生较少但是较宽的同心圆,并使图像模糊的比较厉害。D0较大相反,模糊减轻。
b.巴特沃斯低通滤波器
巴特沃斯低通滤波器很好的解决了振铃效应,它的传递函数图像没有明显的截断,而是平滑的曲线,经常取使H最大值降到某个百分比的频率为截止频率,一般取降到0.707处的频率。
c.其他低通滤波器
包括指数滤波器和梯形滤波器,指数型滤波器处理效果比巴特沃斯滤波器更模糊一点,而梯形滤波器有一定的振铃效果。
2.高通滤波器
高通滤波器可以让图像高频部分顺利通过而使低频信息受到抑制,使图像的边缘或线条变得清晰,使图像得到锐化,与低通滤波器正好相反。
a.理想高通滤波
也无法通过实际的电子器件硬件实现,就光想想吧。
b.巴特沃斯高通滤波器
形状与巴特沃斯低通滤波器的形状正好相反
经过这种滤波器的图像基本不存在振铃现象,截止频率一般也取0.707处
c.高频增强滤波器
因为图像的大部分能量集中在低频分量,高通滤波会使很多低频分量被滤除,会使光滑区域灰度减弱、变暗甚至接近黑色,因此可以对转移函数加一个常数以将一些低频分量保留,从而既能使图像的边缘、轮廓变得清晰,又可以保留图像灰度变化缓慢的光滑区域。
将图像反变换回去后,既包含了高通滤波的结果,也包括了一部分原始图像的内容。
3.带通带阻滤波器
带通滤波器是消除或保留图像中的某个频段范围内的分量
带阻滤波器:
带阻陷波滤波器:
带通滤波器:与带阻滤波器相反
4.同态滤波器
同态滤波是一种在频域中同时将图像亮度范围进行压缩和将图像对比度进行增强的方法。利用压缩亮度范围和增强对比度来改善图像的质量。使用这种方法可以使图像处理符合人眼对于亮度响应的非线性特性,避免了直接对图像进行傅立叶变换处理的失真。
图像f(x,y)是由光源产生的照度i(x,y)和目标的反射r(x,y)的共同作用下产生的,可以表达成:f(x,y)=i(x,y)r(x,y)
同态滤波的一般步骤是:
- 两边取对数:lnf(x,y)=lni(x,y)+lnr(x,y)
- 两边去傅里叶变换:F(u,v)=I(u,v)+R(u,v)
- 用一频域函数H(u,v)处理F(u,v)
- 反变换到空域
- 两边取指数
实例:
%% 本程序实现频域滤波
clear;clc;
%手写巴特沃斯低通滤波器
X=imread('Lena.tif');
I=im2double(X);
I=imnoise(I,'gaussian',0,0.03);
M=2*size(I,1);
N=2*size(I,2);%图像尺寸的两倍
u=-M/2:(M/2-1);
v=-N/2:(N/2-1);
[U,V]=meshgrid(u,v);%生成二维网格矩阵
D=sqrt(U.^2+V.^2);
D0=40;
n=6;
H=1./(1+(D./D0).^(2*n));%巴特沃斯增强函数
J=fftshift(fft2(I,size(H,1),size(H,2)));
K=J.*H;
L=ifft2(ifftshift(K));
L=L(1:size(I,1),1:size(I,2));
figure;
subplot(131);imshow(X);title('原图');
subplot(132);imshow(I);title('高斯噪声');
subplot(133);imshow(L);title('巴特沃斯滤波器');
%手写同态滤波器
I=imread('BaboonRGB.tif');
X=rgb2gray(I);
subplot(121);imshow(I);title('原图');
I=double(X);
[M,N]=size(I);
rL=0.3;rH=2.0;
c=2;d0=10;
I1=log(I+1);
FI=fft2(I1);
n1=floor(M/2);n2=floor(N/2);
for i=1:M
for j=1:N
D(i,j)=((i-n1).^2+(j-n2).^2);
H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL; %高斯同态滤波
end
end
I2=ifft2(H.*FI);
I3=real(exp(I2));
subplot(122);imshow(I3,[]);
title('同态滤波后');
效果:
三、频域增强技术与空域增强技术
空域滤波主要包括平滑滤波器和锐化滤波器
空间平滑滤波器:消除或减弱图像中灰度值具有较大较快变化部分的影响,这些部分对应频域中的高频分量,所以可用频域低通滤波来实现。
空间锐化滤波器:消除或减弱图像中灰度值缓慢变化的部分,这些部分对应频域中的低频分量,所以可用频域高通滤波来实现。