·【基于MATLAB的数字图像处理】第一章·绪论
·【基于MATLAB的数字图像处理】第二章·视觉系统与图像处理系统
·【基于MATLAB的数字图像处理】第三章·基本图像变换
·【基于MATLAB的数字图像处理】第四章·图像增强
·【基于MATLAB的数字图像处理】第五章·图像编码
·【基于MATLAB的数字图像处理】第六章·形态学图像处理
·【基于MATLAB的数字图像处理】大作业·综合图像处理平台
目录
一、空域图像增强技术
1.灰度直方图
2.直方图修正技术
a.直方图均衡化
b.直方图规定化
3.图像灰度映射
a.线性灰度映射
b.分段线性灰度映射
c.非线性灰度映射
d.灰度切分
4.图像间的运算
a.加法运算
b.减法运算
c.乘法运算
d.除法运算
5.图像平滑处理
a.线性平滑滤波器
b.非线性平滑滤波器
6.图像锐化处理
a.水平垂直算子
b.Roberts算子
c.Priwitt算子
d.Sobel算子
二、频域图像增强技术
1.低通滤波器
a.理想低通滤波器
b.巴特沃斯低通滤波器
3.其他低通滤波器
2.高通滤波器
a.理想高通滤波
b.巴特沃斯高通滤波器
c.高频增强滤波器
3.带通带阻滤波器
4.同态滤波器
三、频域增强技术与空域增强技术
图像增强是指采用一系列技术,对原图像进行处理、加工,使其更适合具体的应用要求,改善图像的视觉效果,将图像转换成一种更加适合于人和机器进行分析处理的形式。
图像增强不是以图像保真为原则,而是以需要为原则,增强图像中需要的信息,去除或削弱一些不需要的信息,分为空域增强和变换域增强,变换域增强主要是频域增强。
空域增强的通式是:
代表增强操作
点操作: 定义在每个(x,y)点上,输出图像的每个像素的灰度值仅由相应输入像素决定,如灰度映射方法。
模板操作:定义在点的邻域上,通常是使用一个模板滑过整幅图像产生新的像素,输出像素的灰度值由对应输入像素的一个邻域内的几个像素的灰度值共同决定,如图像平滑和图像锐化。
灰度直方图:灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其横坐标是灰度级,纵坐标是该灰度出现的频率(像素的个数,或个数与总数之比)
直方图的性质:
直方图的用途:
例程:
%% 显示Lena女士灰度图的直方图
clear;clc;
I=imread("Lena.tif");
I=im2double(I);
subplot(121);imshow(I);
subplot(122);imhist(I);
效果:
直方图均衡化主要是用于增强动态范围偏小的图像的反差,将原图像的直方图变为均匀分布,增加像素值的动态范围,增加图像整体的对比度效果。以累计分布函数变换法为基础。
图像均衡化的步骤如下:
例程:
%% 直方图均衡化
N=histeq(M); %直方图均衡化
figure;
subplot(221);imshow(M);title("原图像");
subplot(222);imhist(M);title("原图像直方图");
subplot(223);imshow(N);title("均衡化后图像");
subplot(224);imhist(N);title("均衡化后直方图");
效果:
直方图均衡化由于它的变换函数采用的是累积分布函数,因此只能产生近似均匀的直方图,这样就限制它的效能,也就是说,在不同的情况下,并不总是需要具有均匀直方图的图像。
另外它的增强效果不易控制,处理的结果总是得到全局均衡化的直方图,有时需要变换具有特定的直方图的图像,以便能对图像中某种灰度级加以增强,即有选择性的增强某个灰度值范围内的对比度,这时就要用到直方图规定化。
直方图规定化是修改一幅图像的直方图,使它与另一幅图像的直方图匹配或具有另一种预先规定的函数形状。
直方图规定化步骤:
第三步中采用的映射规则十分重要,一种为单映射方法,是从原始累积直方图向规定直方图映射,但有时存在较大的取整误差;另一种是组映射方法,是从规定直方图向原始累积直方图映射,映射误差较小。
例程:
%% 直方图规定化
hgram=50:1:250; %直方图规定化的指定向量
G=histeq(M,hgram); %直方图规定化
subplot(325);imshow(G);title("规定化后图像");
subplot(326);imhist(G,64);title("规定化后直方图");
效果:
灰度映射:根据某种灰度映射规则(变换函数),将原始图像中每个像素的灰度值转化为另一灰度。
灰度映射是一种点操作,关键在于合理的设计映射函数,赋予各个点新的灰度值,以使图像产生新的视觉效果
线性灰度映射是最简单的一种映射方法:
根据系数a、b不同的取值,可以对图像进行不同的操作:
其中非常常用的是图像取反操作,当黑色面积占据整幅图像的主导地位时,经常使用取反操作,将图像的内容显示的更明显。
例程:
%% 线性灰度映射操作
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("变换后的直方图");
效果:
分段线性灰度映射主要功能是用来增强图像的对比度,通过将图像的值域分成多个值域并进行不同的线性变换,可以根据自己的需要,对某一段进行压缩或扩展。
比如这个图,第一段是将原来灰度值为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("变换后的直方图");
效果:
非线性灰度映射最常用的映射函数就是对数函数,它的目的是对原图进行灰度压缩,将原来动态范围很大的图像压缩到显示器设备允许的动态范围。
对数变换的公式为: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("变换后的直方图");
效果:
灰度切分是分段线性映射的一种特例,当分段线性映射的两个拐点取值相等时,就变为了灰度切分映射,它是用来使s1与s2之间的灰度级更突出。
图像间的运算是指以图像为单位进行的操作,运算结果是一幅新图像,是两幅图像进行点对点的加减乘除运算后得到输出图像的过程。
加法运算主要应用分为两个:
一把我们实际采集到的图像,经常有一些干扰和噪声混入到图像中,表达式如下:
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);
效果:
图相间的减法运算通常用于提取两图之间的差异,以及去除背景等方面。在图像中运动物的检测中,通过前后两个图像的减法运算,可以了解运动物体移动的程度,计算出运动速度,并画出移动轨迹。
例程:
%% 减法运算
%减去不均匀背景
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);
效果:
图像的乘法运算主要用于提取图像中的某些内容,也就是进行掩模操作,提取出感兴趣的部分,通常需要两幅图像满足以下条件:
一幅图像乘以一个常数实现的是缩放操作,如果使用的缩放因数大于1,则原图像亮度增强;通过缩放因数小于1,则原图像亮度变暗。
例程:
图像的除法运算可以矫正成像设备的非线性影响,也可以检测两幅图像之间的差别,但是除法操作得到的是相应像素之间的变换比例,而不是每个像素的绝对差异,应用不多,就不写例程了,懒。
函数名 | 功能 |
imadd | 两图像的加法 |
imsubtract | 两图像的减法 |
immultiply | 两图像的乘法 |
imdivide | 两图像的除法 |
imabsdiff | 两图像的绝对值差值 |
imcomplment | 一幅图像的补运算 |
imlincomb | 计算两幅图像的线性组合 |
图像平滑处理是空域滤波的一种常见的方法,是利用像素及像素邻域组成的空间进行图像增强的方法,目的是平滑图像或锐化图像,原理是对图像进行模板运算,比如模板卷积,步骤如下:
图像平滑操作主要是为了消除图像中的噪声,图像中的噪声分为两类:高斯噪声和椒盐噪声
高斯噪声:一种源于电子电路噪声和由低照明度或高温带来的传感器噪声。高斯噪声也常称为正态噪声,符合高斯分布。高斯噪声可以通过空域滤波的平滑滤波方法来消除。
椒盐噪声:指图像中出现的噪声只有两种灰度值,分别为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("椒盐噪声");
效果:
邻域平均法:最简单的平滑滤波处理方法,模板所有系数都为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("椒盐噪声平滑");
效果:
优化版本--阈值邻域平均法:为了减轻图像均值滤波带来的模糊,基本思想是当某个像素的灰度值大于其邻域像素的平均值,且达到了一定水平,就判断该像素为噪声,使用邻域像素的均值取代这一像素,否则的话,图像的像不改变。
加权平均法:均值滤波器的缺点是会将图像变得模糊,在将噪声点分摊的同时,将图像中景物的边界也分摊了,为了改善效果,可以使用加权平均的方式构造滤波器。一般离中心近的像素对滤波的贡献大,所以选择中心的系数大,周围的系数小,但无论使用哪种模板,都必须保证全部权系数之和为单位值。
虽然均值滤波器对噪声有抑制作用,但同时会使图像变得模糊。即使是加权均值滤波,改善的效果也是有限的,为了有效地改善这一状况,必须改换滤波器的设计思路,中值滤波就是一种有效的方法。
它的基本思路是:噪声(如椒盐噪声)使该点像素比周围的像素亮(暗)许多。如果在某个模板中,对像素进行由小到大排列的重新排列,那么最亮的或者是最暗的点一定被排在两侧,取模板中排在中间位置上的像素的灰度值替代待处理像素的值,就可以达到滤除噪声的目的。
算法步骤:
对于椒盐噪声,中值滤波效果比均值滤波效果好。椒盐噪声的噪声灰度值为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("中值滤波");
效果:
图像锐化的主要目的是得到边缘鲜明的图像或者需要得到图像的边缘轮廓,突出图像的边缘信息,加强图像的轮廓特征。
因为边缘和轮廓都位于灰度突变的地方。所以锐化算法的实现是基于微分作用。
对一幅图像施加梯度模算子,可以增强灰度变化的幅度,对于离散函数,可以利用差分来代替微分运算:
几种常见地算子:
表达式:
模板图:
Roberts算子用交叉的差分表示,交叉的梯度称为罗伯茨(Roberts)梯度,其表达式:
模板图:
模板图:
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'
效果:
频域增强技术是以卷积定理为基础的,通过卷积运算,将时域空间的图像卷积,变为频域空间的相应频谱的乘积。
一般步骤如下:
常用的有:低通滤波器、高通滤波器、带阻带通滤波器、同态滤波器
理想的低通滤波器是指小于截止频率D的信号可以完全不受影响的通过滤波器,而大于D的信号则可以完全滤除,但这种理想状态在现实中是不存在的,实际电子器件不可能呈现出这样的效果。
因为图像的边缘和尖锐细节主要集中在高频部分,会被滤除掉,因此截止频率越小,得到的图像边界变得越不清晰,图像整体变得更加模糊,会产生一种很严重的振铃效应,理想低通滤波所产生的“振铃”现象在2-D图像上表现为一系列同心圆环,圆环半径反比于截断频率,如果D0较小,就会产生较少但是较宽的同心圆,并使图像模糊的比较厉害。D0较大相反,模糊减轻。
巴特沃斯低通滤波器很好的解决了振铃效应,它的传递函数图像没有明显的截断,而是平滑的曲线,经常取使H最大值降到某个百分比的频率为截止频率,一般取降到0.707处的频率。
包括指数滤波器和梯形滤波器,指数型滤波器处理效果比巴特沃斯滤波器更模糊一点,而梯形滤波器有一定的振铃效果。
高通滤波器可以让图像高频部分顺利通过而使低频信息受到抑制,使图像的边缘或线条变得清晰,使图像得到锐化,与低通滤波器正好相反。
也无法通过实际的电子器件硬件实现,就光想想吧。
形状与巴特沃斯低通滤波器的形状正好相反
经过这种滤波器的图像基本不存在振铃现象,截止频率一般也取0.707处
因为图像的大部分能量集中在低频分量,高通滤波会使很多低频分量被滤除,会使光滑区域灰度减弱、变暗甚至接近黑色,因此可以对转移函数加一个常数以将一些低频分量保留,从而既能使图像的边缘、轮廓变得清晰,又可以保留图像灰度变化缓慢的光滑区域。
将图像反变换回去后,既包含了高通滤波的结果,也包括了一部分原始图像的内容。
带通滤波器是消除或保留图像中的某个频段范围内的分量
带阻滤波器:
带阻陷波滤波器:
带通滤波器:与带阻滤波器相反
同态滤波是一种在频域中同时将图像亮度范围进行压缩和将图像对比度进行增强的方法。利用压缩亮度范围和增强对比度来改善图像的质量。使用这种方法可以使图像处理符合人眼对于亮度响应的非线性特性,避免了直接对图像进行傅立叶变换处理的失真。
图像f(x,y)是由光源产生的照度i(x,y)和目标的反射r(x,y)的共同作用下产生的,可以表达成:f(x,y)=i(x,y)r(x,y)
同态滤波的一般步骤是:
实例:
%% 本程序实现频域滤波
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('同态滤波后');
效果:
空域滤波主要包括平滑滤波器和锐化滤波器
空间平滑滤波器:消除或减弱图像中灰度值具有较大较快变化部分的影响,这些部分对应频域中的高频分量,所以可用频域低通滤波来实现。
空间锐化滤波器:消除或减弱图像中灰度值缓慢变化的部分,这些部分对应频域中的低频分量,所以可用频域高通滤波来实现。