目的:将图像中自己想要的部分突出,不想要的部分抑制
图像增强是图像预处理部分最基础的处理手段,也是最基础的技术
灰度变换按一定的变换关系,逐点改变原图像中每一个像素值
也被称为图像的点运算(只针对图像的某一像素点)
其变换形式如下: s=T(r)
其中,T是灰度变换函数;r是变换前的灰度;s是变换后的像素。
加减常数
g(x,y)=f(x,y)+c
I=imread('greens.jpg');
J=rgb2gray(I);
[M,N]=size(J);
x=1;y=1;
for x=1:M
for y=1:N
H(x,y)=J(x,y)-100;
end
end
subplot(121),imshow(J);
subplot(122),imshow(H);
图像反转
g(x,y)= - f(x,y)
乘常数
g(x,y)= cf(x,y)
反转及称常数操作与加减操作类似,大家可以自己尝试一下。
在线性灰度变换的基础上,将图像按灰度等级进行分段,不同段进行不同的操作。
削波:选定一个阈值,超出阈值的部分做一种处理,未超出的做另一种处理。
I=imread('greens.jpg');
J=rgb2gray(I);
[M,N]=size(J);
x=1;y=1;
for x=1:M
for y=1:N
if(J(x,y)>240);
H(x,y)=J(x,y)-50;
else
H(x,y)=0;
end
end
end
subplot(121),imshow(J);
subplot(122),imshow(H);
目的:将图像分成若干个或不相交的小区域
依据:像素之间具有相似性和跳变性
原理:阈值化
阈值化:阈值化是削波的一个特殊案例,将超出阈值部分的像素的值改为1,低于阈值的改为0.
阈值选择
一般来说,若图像的直方图呈现明显的双峰,那么谷底对应的灰度值即为阈值。
图像阈值分割
直方图门限选择:画出直方图,选择阈值,大于阈值为白,小于阈值为黑。
若有两个阈值,两阈值之间为黑,其他为白。
半阈值选择图像分割:画出直方图,选择阈值,大于阈值与小于阈值的部分一方不变,另一方
为黑或白
迭代阈值图像分割:选择一个阈值作为初始值,按照某种策略不断地进行改进。
低灰度区扩展,高灰度区压缩
I=imread('circles.png');
J=double(I);
[M,N]=size(J);
x=1;y=1;
for x=1:M
for y=1:N
H(x,y)=log(1+J(x,y));
end
end
subplot(121),imshow(J);
subplot(122),imshow(H);
低灰度区压缩,高灰度区扩展
H(x,y)=a.^J(x,y)+b;
H(x,y)=J(x,y).^a+b;
那么现在我们已经可以对图像做一些基本的操作了,如对比度拉伸,直方图均衡
I = imread('pout.tif');
J = imadjust(I);
subplot(121),imshow(I);
subplot(122),imshow(J);
I = imread('pout.tif');
J = histeq(I);
subplot(121),imshow(I);
subplot(122),imshow(J);
因为图像在传输过程中会受到干扰,造成图像的失真,所以我们在接收到图像后要进行平滑处理。
目的:1)模糊:提取大目标前,将小的细节去除
2)消除噪声
线性平滑: 用某一模板对每个像素及其邻域的所有像素进行处理
非线性平滑:设定一个阈值,求像素及其邻域的平均值,若该像素值超出阈值,则令该像素值为
平均值,否则不做改变
卷积运算: 卷积其实就是按照模板作加权求和的过程
方法
图像平滑有中值滤波、均值滤波、高斯滤波、双边滤波等多种方法。
原理:对模板覆盖范围内的像素从小到大进行排序,位于中间的像素值作为滤波后的值。
在中值滤波时,我们采用matlab提供的函数medfilt2
I=imread('coins.png');
J=imnoise(I,'salt & pepper',0.02);%添加椒盐噪声
K=medfilt2(J);
figure;
subplot(131);imshow(I);
subplot(132);imshow(J);
subplot(133);imshow(K);
原理:取模板覆盖范围内所有像素的平均值作为滤波值
I=imread('coins.png');
J=imnoise(I,'salt & pepper',0.02);%添加椒盐噪声
h=ones(3,3)/5;%设置模板
K=imfilter(J,h);
figure;
subplot(131);imshow(I);
subplot(132);imshow(J);
subplot(133);imshow(K);
本次使用的是3*3的全为1的模板,大家可以对模板进行修改,看看其他的模板有什么效果
目的:突出图像细节,增强图像边缘
1、用差分表示微分: 一阶微分:f(x+1)-f(x)
二阶微分:f(x+1)+f(x-1)-2f(x)
2、微分的方向有两个:横向与纵向
一阶横向微分运算:G(i,j)=f(i,j)-f(i,j-1)
一阶纵向微分运算:G(i,j)=f(i,j)-f(i-1,j)
纵横两方向都进行:
G(i,j)=sqrt{[f(i,j)-f(i,j-1)]*[f(i,j)-f(i,j-1)]+[f(i,j)-f(i-1,j)]*[f(i,j)-f(i-1,j)]}
二阶横向微分运算:f(x+1)+f(x-1)-2f(x)
二阶纵向微分运算:f(y+1)+f(y-1)-2f(y)
梯度是一个矢量,有分别沿x和y方向计算微分的结果构成。
一般来说,梯度的计算方法有以下三种:
原理:边缘上灰度变化较平缓、而边缘两侧变化较快。
robert算子(交叉微分算子)
Gx=f(x+1,y+1)-f(x,y);
Gy=f(x+1,y)-f(x,y+1);
Roberts算子的边缘定位精度高,但它容易丢失一部分边缘,且不具备抑制噪声能力
Gx=f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1)-f(x-1,y-1)-2f(x,y-1)-f(x+1,y-1)
Gy=f(x-1,y-1)+2f(x-1,y)+f(x-1,y+1)-f(x+1,y-1)-2f(x+1,y)-f(x+1,y+1)
sobel算子抑制噪声的能力较好,但它对灰度的变化不敏感、定位不是特别准确
prewitt算子
Gx=f(x+1,y-1)+f(x+1,y)+f(x+1,y+1)-f(x-1,y-1)-f(x-1,y)-f(x-1,y+1)
Gy=f(x-1,y-1)+f(x,y-1)+f(x+1,y-1)+f(x-1,y+1)-f(x,y+1)-f(x+1,y+1)
prewitt算子与sobel算子类似,都具有抗噪声能力,对图像边缘也都无法准确定位。
为了让大家有更直观的感受,我们将三种算子的效果进行对比
对于一个含噪声少的图像,使用三种算子对其进行检测
I=imread('rice.png');
[H1,t]=edge(I,'roberts','both');
[H2,t]=edge(I,'sobel','both');
[H3,t]=edge(I,'prewitt','both');
figure;
subplot(221);imshow(I);
subplot(222);imshow(H1);
subplot(223);imshow(H2);
subplot(224);imshow(H3);
当添加噪声后再对其进行检测
I=imread('rice.png');
J=imnoise(I,'salt & pepper',0.02);%添加椒盐噪声
[H1,t]=edge(J,'roberts','both');
[H2,t]=edge(J,'sobel','both');
[H3,t]=edge(J,'prewitt','both');
figure;
subplot(321);imshow(I);
subplot(322);imshow(J);
subplot(323);imshow(H1);
subplot(324);imshow(H2);
subplot(325);imshow(H3);
可以看出,roberts算子的抗干扰能力远远低于sobel和prewitt算子。
拉普拉斯算子
对阶跃型边缘定位准确,但抗噪声能力差
对拉普拉斯算子,我们要先求出他的梯度,然后根据它的模板的中心系数的正负判断加或减。
把高斯平滑器和拉普拉斯锐化结合,先滤掉噪声,再进行边缘检测。
优缺点:克服了拉普拉斯算子抗噪能力差的缺点,但在抑制噪声时,平滑掉了比较尖锐的边缘,故
无法检测到尖锐边缘
检测线段
检测图像中的线段时,常用下方的模板:
I=imread('.png')
I=rgb2gray(I);%灰度化
h1=[-1,-1,-1;2,2,2;-1,-1,-1];%检测水平线段
h1=[-1,-1,2;-1,2,-1;2,-1,-1];%+45
h1=[-1,2,-1;-1,2,-1;-1,2,-1];%垂直
h1=[2,-1,-1;-1,2,-1;-1,-1,2];%-45
J1=imfilter(I,h1);
J2=imfilter(I,h2);
J3=imfilter(I,h3);
J4=imfilter(I,h4);
J=J1+J2+J3+J4;
figure;
subplot(321),imshow(I);
subplot(322),imshow(J);
subplot(323),imshow(J1);
subplot(324),imshow(J2);
subplot(325),imshow(J3);
subplot(326),imshow(J4);
检测边缘
edge函数:[g,t]=edge(f, ‘边缘检测算子’, parameter)
其中,parameter可以为选定的阈值(在此使用的是roberts算子)
I=imread('rice.png');
I=im2double(I);
[J,thresh]=edge(I,'roberts',35/255);
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);
也可以为检测的方向,‘horizontal’(水平), ‘vertical’(垂直), ‘both’(两者都)
I=imread('rice.png');
I=im2double(I);
[J,t]=edge(I,'roberts','both');
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);
本章主要讲述了在空间域上进行图像增强方法,主要包括灰度变换和空间滤波两种,其中,灰度
变换包括线性变换和非线性变换,空间滤波包括图像平滑和图像锐化。本文对它们的原理及应用
做了一些简单的介绍,对图像滤波及边缘检测等也进行了简单的实验。