图像阈值分割技术原理和比较讲解.docx
《图像阈值分割技术原理和比较讲解.docx》由会员分享,可在线阅读,更多相关《图像阈值分割技术原理和比较讲解.docx(23页珍藏版)》请在冰豆网上搜索。
图像阈值分割技术原理和比较讲解
图像阈值分割和边缘检测技术原理和比较
摘要
图像分割是一种重要的图像分析技术。
对图像分割的研究一直是图像技术研究中的热点和焦点。
医学图像分割是图像分割的一个重要应用领域,也是一个经典难题,至今已有上千种分割方法,既有经典的方法也有结合新兴理论的方法。
医学图像分割是医学图像处理中的一个经典难题。
图像分割能够自动或半自动描绘出医学图像中的解剖结构和其它感兴趣的区域,从而有助于医学诊断。
阈值分割是一种利用图像中要提取的目标物与其背景在灰度特性上的差异,把图像视为具有不同灰度级的两类区域(目标和背景)的组合,选取一个合适的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生对应的二值图像。
本文先介绍各种常见图像阈值分割和边缘检测方法的原理和算法,然后通过MATLAB程序实现,最后通过比较各种分割算法的结果并得出结论。
关键词:
图像分割;阈值选择;边缘检测;
1.概述
图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内,表现出一致性或相似性,而在不同区域间表现出明显的不同[37].简单的讲,就是在一幅图像中,把目标从背景中分离出来,以便于进一步处理。
图像分割是图像处理与计算机视觉领域低层次视觉中最为基础和重要的领域之一,它是对图像进行视觉分析和模式识别的基本前提.同时它也是一个经典难题,到目前为止既不存在一种通用的图像分割方法,也不存在一种判断是否分割成功的客观标准。
阈值法是一种传统的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.已被应用于很多的领域,例如,在红外技术应用中,红外无损检测中红外热图像的分割,红外成像跟踪系统中目标的分割;在遥感应用中,合成孔径雷达图像中目标的分割等;在医学应用中,血液细胞图像的分割,磁共振图像的分割;在农业工程应用中,水果品质无损检测过程中水果图像与背景的分割。
在工业生产中,机器视觉运用于产品质量检测等等。
在这些应用中,分割是对图像进一步分析、识别的前提,分割的准确性将直接影响后续任务的有效性,其中阈值的选取是图像阈值分割方法中的关键技术。
图像分析和理解的第一步常常是边缘检测。
边缘检测方法是人们研究得比较多的一种方法,它通过检测图像中不同区域的边缘来达到分割图像的目的。
边缘检测的实质是采用某种算法来提取出图像中对象与背景问的交界线。
我们将边缘定义为图像中灰度发生急剧变化的区域边界。
图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。
经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的。
2.图像阈值分割和边缘检测原理
2.1.阈值分割原理
对灰度图像的取阈值分割就是先确定一个处于图像灰度取值范围之中的灰度阈值,然后将图像中各个像素的灰度值都与这个阈值相比较,并根据比较结果将对应的像素分为两类。
这两类像素一般分属图像的两类区域,从而达到分割的目的。
阈值分割算法主要有两个步骤:
(1)确定需要的阈值;
(2)将分割阈值与像素值比较以划分像素。
可以看出,确定一个最优阈值是分割的关键。
现有的大部分算法都是集中在阈值确定的研究上。
阈值分割方法根据图像本身的特点,可分为单阈值分割方法和多阈值分割方法:
也可分为基于像素值的阈值分割方法、基于区域性质的阈值分割方法和基于坐标位置的阈值分割方法.若考虑分割算法所用的特征或准则的特点,还可以分为直方图与直方图变换法、最大类空间方差法、最小误差法与均匀化误差法、共生矩阵法、最大熵法、简单统计法与局部特性法、概率松弛法、模糊集法等。
在这里我们只介绍手动阈值分割(又称双峰阈值分割或者全局阈值分割),迭代算法阈值分割,大津法(OTSU法)阈值分割。
2.1.1.手动(全局)阈值分割
手动阈值分割算法,由于工作原理是用一个手动设定的灰度阈值对整个图像做分割,进而产生二值图像,所以又称全局分割算饭,同时这种分割算法对于图像灰度直方图呈双峰分布时比较有效,故又称双峰分割算法。
若图像中目标和背景具有不同的灰度集合:
目标灰度集合与背景灰度集合,且两个灰度集合可用一个灰度级阈值T进行分割。
这样就可以用阈值分割灰度级的方法在图像中分割出目标区域与背景区域,这种方法称为灰度阈值分割方法。
在物体与背景有较强的对比度的图像中,此种方法应用特别有效。
比如说物体内部灰度分布均匀一致,背景在另一个灰度级上也分布均匀,这时利用阈值可以将目标与背景分割得很好。
如果目标和背景的差别是某些其他特征而不是灰度特征时,那么先将这些特征差别转化为灰度差别,然后再应用阈值分割方法进行处理,这样使用阈值分割技术也可能是有效的设图像为f(x,y),其灰度集范围是[0,L],在0和L之间选择一个合适的灰度阈值T,则图像分割方法可由式(2.1)描述
(2.1)
这样得到的g(x,y)是一幅二值图像。
这时T的大小将直接影响分割的效果。
由于这种分割算法适用范围有限,而且要手动设定灰度阈值,过程复杂而且有时灰度阈值不易寻找,进而出现了自动阈值分割,主要是迭代算法和大津算法(OTSU)阈值分割。
2.1.2.迭代算法阈值分割
迭代算法是对双峰法的改进,它首先选择一个近似阈值T,将图像分割成两个部分G1和G2,然后计算G1和G2像素的平均灰度值m1和m2,选择新的分割阈值T=T=(m1+m2)/2;重复以上步骤,知道T不变为止。
迭代法适合图像直方图有明显波谷。
迭代算法是基于逼近的思想,其主要步骤如下:
1.为全局阈值选择一个初始估计值T(图像的平均灰度)。
2.用T分割图像。
产生两组像素:
G1有灰度值大于T的像素组成,G2有小于等于T像素组成。
3.计算G1和G2像素的平均灰度值m1和m2;
4.计算一个新的阈值:
T=(m1+m2)/2;
5.重复步骤2和4,直到连续迭代中的T值间的差小于一个预定义参数为止。
然后再用阈值分割对图像进行分割得到二值灰度图像。
2.1.3.大津算法阈值分割
大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。
从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。
对于图像f(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。
图像的总平均灰度记为μ,类间方差记为g。
假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:
ω0=N0/M×N
(1)
ω1=N1/M×N
(2)
N0+N1=M×N(3)
ω0+ω1=1 (4)
μ=ω0*μ0+ω1*μ1(5)
g=ω0(μ0-μ)^2+ω1(μ1-μ)^2(6)
将式(5)代入式(6),得到等价公式:
g=ω0ω1(μ0-μ1)^2 (7) 这就是类间方差
采用遍历的方法得到使类间方差g最大的阈值T,即为所求。
然后再用所得到的T进行全局阈值分割得到二值图像。
2.2.边缘检测原理
图像分析和理解的第一步常常是边缘检测。
边缘检测方法是人们研究得比较多的一种方法,它通过检测图像中不同区域的边缘来达到分割图像的目的。
边缘检测的实质是采用某种算法来提取出图像中对象与背景问的交界线。
我们将边缘定义为图像中灰度发生急剧变化的区域边界。
图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。
经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的。
2.2.1.roberts算子边缘检测
函数的梯度定义为
通常把梯度的模叫做图象的梯度。
对于数字图象,可以用差分来近似微分roberts算子模板的形式就是
2.2.2.prewitt算子边缘检测
Prewitt算子由两部分组成,检测水平边缘的模板
和
检测垂直边缘的模板。
对数字图像f(x,y),Prewitt算子的定义如下:
水平方向Gx=[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]
垂直方向Gy=[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]
G(i,j)=|Gx|+|Gy|。
经典Prewitt算子认为:
凡灰度新值大于或等于阈值的像素点都是边缘点。
即选择适当的阈值T,若G(i,j)≥T,则G(i,j)为边缘点。
这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丢失了。
2.2.3.sobel算子边缘检测
Sobel算子也有两个,一个是检测水平边缘的模板
,另一个是检测水平边缘的
模板
。
sobel算子的另一种形式是各向同性Sobel算子,也有两个模板组成,
一个是检测水平边缘的
,另一个是检测垂直边缘的
。
各向同性Sobel算子和普通Sobel算子相比,位置加权系数更为准确,在检测不同方向的边缘时梯度的幅度一致。
本文中我们使用原始的sobel算子。
2.2.4.高斯laplacian算子边缘检测
Laplacian算子定义为
它的差分形式为
laplacian表示成模板的形式就是
。
Laplace算子是一种各向同性算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。
Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。
存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。
在本文中我们先进性高斯平滑处理再使用laplacian算子进行边缘检测。
2.2.5.canny算子边缘检测
Canny边缘检测基本原理
(1)图象边缘检测必须满足两个条件:
一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。
这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
Canny边缘检测算法:
step1:
用高斯滤波器平滑图象;
step2:
用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:
对梯度幅值进行非极大值抑制;
step4:
用双阈值算法检测和连接边缘。
3.设计方案
这里通过MATLAB工具编写程序实现上述分割算法并给出处理后的结果,为了方便操作,形象的表示各分割算法的效果,通过一个MATLAB图形界面GUI窗口来进行操作,在图形窗口中有‘打开图像’按钮,一输入和显示阈值的文本输入框,一个选择分割算法的下拉菜单,以及一个显示原图像和一个显示处理后图像的坐标轴。
先点击‘打开图像’并选择电脑中的一幅图像,然后通过下拉菜单选择图像分割算法,在这里有两种情况,如果是选择‘手动阈值分割’,那么需要手动在文本编辑框中输入设定的阈值,而如果是选择其他的分割算法,由于这些算法都不需要手动输入阈值,而是通过程序自动选择阈值,所以这里文本编辑框中会显示程序自动选择的阈值。
点击下拉菜单中的条目选择不同的分割算法进行分割,分割后的图像会显示在右侧的坐标轴中。
示例如下:
4.实验过程
程序共有四个m文件构成,分别是主函数文件Imgprocess.m和四个函数文件fuzhi.m,td.m,dd.m和dajin.m。
在介绍各种图像分割算法之前,先介绍程序中的几个函数,如下:
1.利用阈值t0对图像cell进行二值化的函数fuzhi(cell,t0),代码如下:
functionncell=fuzhi(cell,t0);
[a,b]=size(cell);%获取文件的尺寸
fori=1:
a%通过循环分别对图像灰度与阈值t0进行比较判,如果大于t0则灰度置为%255,否则置为0;
forj=1:
b
ifcell(i,j)>t0
ncell(i,j)=255;
else
ncell(i,j)=0;
end
end
end
2.利用已经求得的水平方向梯度xa和垂直方向梯度ya来求它们的均方值的td(xa,ya),代码如下:
functionna=td(xa,ya)
[a,b]=size(xa);
fori=1:
a
forj=1:
b
na(i,j)=sqrt((xa(i,j)*xa(i,j))+(ya(i,j)*ya(i,j)));%求xa和ya的均方值并返回给na
end
end
3.对图像cell通过迭代法求阈值的函数dd(cell),代码如下:
functiont0=dd(cell)
[a,b]=size(cell);
zmax=max(max(cell));%求图像的最大灰度值
zmin=min(min(cell));%求图像的最小灰度值
t0=(zmax+zmin)/2;%将t0的初始值置为(zmax+zmin)/2
flag=1;
while(flag)%flag是循环标志,初始值为1,只有当找到要得到的t0才%置为0,从而结束循环
nbf=0;%前景数
nbk=0;%背景数
nibf=0;%前景和背景灰度总和
nibk=0;
fori=1:
a%通过循环遍历来计算前景数,背景数,前景灰度总和和%背景灰度总和。
forj=1:
b
ifcell(i,j)>t0
nbf=nbf+1;
nibf=nibf+double(cell(i,j));
else
nbk=nbk+1;
nibk=nibk+double(cell(i,j));
end
end
end
zo=nibf/nbf;%得到前景背景的平均灰度值
zb=nibk/nbk;
t0tmp=(zo+zb)/2;%判断t0是否变化,如果不变化则这时的t0就是所求阈值
ift0tmp==t0
flag=0;
else
t0=t0tmp;
end
end
4.对图像cell通过大津法求阈值的函数dajin(cell),代码如下:
functiont0=dajin(cell)
[a,b]=size(cell);
ni=zeros(1,256);
fori=0:
255%通过循环统计从0到255各个灰度的像素个数
forj=1:
a
fork=1:
b
ifcell(j,k)==i
ni(i+1)=ni(i+1)+1;
end
end
end
end
N=0;
forn=0:
255
N=N+ni(n+1);%计算总的像素个数
end
pi=zeros(1,255);
pi=ni/N;%计算各灰度值出现的概率
u=0;
fori=0:
255%计算u;
u=u+i*pi(i+1);
end
sgmat=zeros(1,256);%计算类间方差sgma(T)
forT=0:
255
wt=0;
ut=0;
fori=0:
T
wt=wt+pi(i+1);
ut=ut+i*pi(i+1);
end
sgmat(T+1)=(u*wt-ut)^2/(wt*(1-wt));
end
sgmamax=max(sgmat);%求出最大的类间误差
fori=0:
255%求出这时的阈值t0
ifsgmamax==sgmat(i+1)
t0=i;
break;
end
end
4.1.阈值分割
4.1.1.手动(全局)阈值分割
t0=b;%b是从文本编辑框中读取的阈值
pic2=fuzhi(pic,b);%进行二值化运算
4.1.2.迭代算法阈值分割
t0=dd(pic);%通过迭代算法求得阈值
pic2=fuzhi(pic,t0);
4.1.3.大津算法阈值分割
t0=dajin(pic);%通过大津算法求得阈值
pic2=fuzhi(pic,t0);
4.2.边缘检测
4.2.1.roberts算子边缘检测
t0=dajin(pic);%先通过大津算法求出阈值
xr=[10;0-1];%水平方向算子
yr=xr';%垂直方向算子
xpic=3*filter2(xr,pic,'same');%对图像求水平方向梯度
ypic=3*filter2(yr,pic,'same');%对图像求垂直方向梯度
pic2=td(xpic,ypic);%求梯度
pic2=fuzhi(pic2,t0);
4.2.2.prewitt算子边缘检测
pic=double(pic);
t0=dd(pic);
xp=[-1-1-1;000;111];%水平方向算子
yp=xp';
xa=filter2(xp,pic,'same');
ya=filter2(yp,pic,'same');
na=td(xa,ya);
pic2=fuzhi(na,t0);
4.2.3.sobel算子边缘检测
t0=dajin(pic);
xsobel=[-1-2-1;000;121];%水平方向算子
ysobel=xsobel';
xpic=filter2(xsobel,pic,'same');
ypic=filter2(ysobel,pic,'same');
npic=td(xpic,ypic);
pic2=fuzhi(npic,t0);
4.2.4.高斯laplacian算子边缘检测
gauss=[14741;
41626164;
72641267;
41626164;
14741]/273;%高斯算子
t0=dd(pic);
npic=filter2(gauss,pic,'same');%先对图像用高斯算子进行平滑
lap=[010;1-41;010];%laplacian算子
npic=filter2(lap,npic,'same');
npic=abs(15*npic);
pic2=fuzhi(npic,t0);
4.2.5.canny算子边缘检测
[pic2,th]=edge(pic,'canny');%canny实现起来太过复杂,我们直接调用%MATLAB自带的canny算子进行边缘检测
t0=th
(1);
5.试验结果及分析
5.1.实验结果
这里列出了分别对两幅图像进行上述分割方法处理的结果。
5.1.1.手动(全局)阈值分割
阈值选择过小的情况
阈值选择合适的情况
阈值选择过大的情况
5.1.2.迭代算法阈值分割
5.1.3.大津算法阈值分割
5.1.4.roberts算子边缘检测
5.1.5.prewitt算子边缘检测
5.1.6.sobel算子边缘检测
5.1.7.高斯laplacian算子边缘检测
5.1.8.canny算子边缘检测
5.2.实验结果分析和总结
由实验结果可以得到阈值分割和边缘检测之间的一大区别就是阈值分割标记处目标的所有部分,而边缘检测值标记目标的边缘。
在物体与背景有较强的对比度的图像中,即图像直方图中出现明显双峰时,手动阈值分割比较有效,同时,当有些前景图像和背景图像的灰度值太接近时会导致有些前景图像没有从背景中分离出来,出现图像失真。
迭代所得的阈值分割的效果很好,基于迭代的阈值能很好的区分出图像前景和背景的主要区域所在,但在图像的细微处还没有很好的区分度。
对某些特定图像,微小数据的变化却会引起分割效果的巨大改变。
不过总的来说,迭代法比双峰法效果要好很多。
在测试中发现:
大津法选取出的阈值非常理想,对各种情况都表现良好。
虽然在很多情况并不是最佳的分割方法,但分割质量还是有一定保障的。
Roberts算子定位精度高,在水平和垂直方向效果较好,但是对噪声敏感。
Sobel算子通常对灰度渐变和噪声较多的图像处理的较好。
Prewitt边缘检测算子不仅能检测出边缘点,而且能抑制噪声的影响,对灰度和噪声较多的图像处理较好。
高斯laplacian边缘检测算子由于在开始的时候先对图像进行了平滑,所以减轻了对噪声的敏感程度,由于高斯laplacian算子是二阶算子,所以对边缘点和独立点的反映都比较大。
Canny边缘检测算子是一类最优的边缘检测算子,它与其他边缘检测方法的不同之处在于它使用两种不同的阈值分别检测强边缘和弱边缘,并且进当弱边缘与强边缘相连时才将弱边缘包含在输出图像中,这种方法容易检测出真正的弱边缘。
参考文献
1.详解MATLAB数字图像处理;张德丰著;电子工业出版社。
2.冈萨雷斯数字图像处理(第二版);RafaelC.Gonzalez著;电子工业出版社;