图像分割综述数字图像处理大作业Word文档格式.docx
《图像分割综述数字图像处理大作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《图像分割综述数字图像处理大作业Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
同时,某些分割算法也只是适用于某些特殊类型的图像分割。
分割结果的好坏需要根据具体的场合及要求衡量,没有统一的评价准则。
因此,图像分割是图像分析和计算机视觉中的经典难题。
2边缘检测
边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像,图像中的边缘通常与图像强度的不连续性有关。
图像强度的不连续性可分为:
①阶跃不连续,即图像强度在不连续处的两边的像素灰度值有着显著的差异;
②线条不连续,即图像强度突然从一个值变化到另一个值,保持一个较小的行程后又返回到原来的值。
2.1Roberts梯度算子法
Roberts梯度就是采用对角方向相邻两像素之差,故也称为四点差分法。
对应的水平和垂直方向的模板为:
标注的是当前像素的位置(i,j)为当前像素的位置,其计算公式如下:
特点:
用4点进行差分,以求得梯度,方法简单。
其缺点是对噪声较敏感,常用于不含噪声的图像边缘点检测。
梯度算子类边缘检测方法的效果类似于高通滤波,有增强高频分量,抑制低频分量的作用。
(a)原图(b)roberts处理后
图1roberts效果图
2.2Prewitt梯度算子法(平均差分法)
因为平均能减少或消除噪声,Prewitt梯度算子法就是先求平均,再求差分来求梯度。
水平和垂直梯度模板分别为:
利用检测模板可求得水平和垂直方向的梯度,再通过梯度合成和边缘点判定,就可得到平均差分法的检测结果。
(a)原图(b)prewitt处理后
图2prewitt效果图
2.3Sobel算子法(加权平均差分法)
Sobel算子就是对当前行或列对应的值加权后,再进行平均和差分,也称为加权平均差分。
Sobel算子和Prewitt算子一样,都在检测边缘点的同时具有抑制噪声的能力,检测出的边缘宽度至少为二像素。
由于它们都是先平均后差分,平均时会丢失一些细节信息,使边缘有一定的模糊。
但由于Sobel算子的加权作用,其使边缘的模糊程度要稍低于程度要稍低于Prewitt算子。
(a)原图(b)sobel处理后
图3sobel效果图
3阈值分割
阈值分割是一种简单有效的图像分割方法。
阈值分割的基本想法[2]是确定一个阈值,然后把每个像素点的像素值和阈值相比较,根据比较的结果把该像素划分成两类——前景或者背景。
一般阈值分割可以分成以下3步:
①确定阈值;
②将阈值和像素值比较;
③把像素归类。
3.1双峰法
假定图像由目标背景(具有不同的灰度级)组成,图像的灰度分布曲线可以近似的认为由两个正态分布函数叠加而成,则图像的直方图会出现双峰分布,如图4所示。
图4双峰分布的直方图
选择双峰直方图的波谷处,设灰度级为T,可以将图像分为两部分,双峰分割的结果可以表示为
式中,T为图像分割的阈值,结果图像的灰度级通常取
=0(黑色)、
=1(白色)。
(a)原图(b)双峰法分割图像
图5双峰法效果图
3.2迭代法
迭代阈值选取法是对双峰阈值选取的改进,该方法可以完成阈值的自动选取,具体方法和步骤如下:
1)选择一个初始阈值T,假如,假定图像像素的最大灰度值和最小灰度值为max和min,则初始阈值T可以选择为T=(max+min)/2。
2)利用选择的阈值T对图像进行分割,根据图像像素的灰度值,可以将图像分割为两部分,灰度值大于T的图像区域G1和灰度值小于等于T的图像区域G2。
3)分别计算G1和G2包含的像素的灰度均值u1和u2。
4)计算新的阈值T=(u1+u2)/2。
5)重复步骤2)、3)、4),直到连续两次计算得到的T的差值满足设定的范围,从而完成阈值的自动计算。
(a)原图(b)迭代法分割图像
图5迭代法效果图
4K均值聚类法
K均值聚类算法是聚类分析中的一种基本划分方法,由MacQueen[3]于1967年首次提出。
由于其算法简便,计算复杂度低,通常被作为大样本聚类分析的首选方案。
。
K均值聚类是一种固定类数的聚类方法,根据最小距离准则对样品进行分类,具有结构简单、计算复杂度低的优点。
其基本思想[4]为:
首先,随机选择K个像素点作为初始类中心,将图像中的每个样本分配到最近的类中心所属的集合之中,形成了均值聚类的初始类分布;
其次,按照初始类分布计算得到新的类中心,然后再次就近分配样本,得到新的类分布;
最后,通过迭代的方式,使得各个类的均值趋于稳定,从而实现区域的划分。
在迭代的过程中,可以设定相应的判断准则(如最小误差平方和)来实现迭代计算的自动停止。
假设迭代计算过程中某次聚类之后,在第i(i=1,2,…,K)类
中有
个样本x,此时
中所有样本的均值为
,即
则所有样本与其相应类别的聚类中心之间的误差平方和为
其中的
是迭代过程中某次聚类操作后聚类结果的误差平方和,表示用K个类别中心
代表K个样本子集
时产生的误差平方和。
当
最小时,聚类结果即为误差平方和准则下的最有结果。
在实际计算过程中,K均值聚类算法的具体流程如下(图6):
(1)从数据对象中任意选择K个对象作为初始聚类中心,选择时初始聚类中心可直接选择K个样本点,或者选择随机划分为K类的各类重心;
(2)根据每个聚类对象的均值(式1中的mi),计算每个对象与中心对象的中心距离,并求出相应的误差平方和
,同时,根据最小距离重新对相应对象进行划分;
(3)对于重新划分的聚类,计算其相应的均值并将其作为该类的新中心;
(4)循环步骤
(2)~(3),直到误差平方和
满足预先设定的门限值。
图6K均值聚类算法流程
图7给出了采用K均值聚类算法与传统阈值分割法进行图像分割的对比结果。
通过对比可以发现,K均值聚类法提取的目标边缘更加细致,在对大区域目标有效提取的同时还能够获得孤立小区域目标,并且在有效进行目标分割的基础上能够保留更加丰富的目标细节信息。
究其原因在于,阈值分割法是基于图像灰度信息的,在计算过程中图像的空间信息没有考虑在内,因此当图像中存在灰度差异不明显以及灰度值范围重叠较大的部分时,图像分割的结果准确性较差。
(a)原图(b)迭代法分割图像(c)K均值聚类法分割图像
图7K均值聚类法效果图
5结论
前面讨论了数字图像处理在进行图像分割时常用的方法,可以从三个方面入手,1)基于roberts,sobel等的边缘检测进行边界分割。
2)基于双峰法,迭代法等进行阈值分割3)基于K均值等聚类算法进行区域分割。
在本实验中可以看出,采用K均值聚类算法比传统阈值分割法进行图像分割存在优势,K均值聚类法提取的目标边缘更加细致,在对大区域目标有效提取的同时还能够获得孤立小区域目标,并且在有效进行目标分割的基础上能够保留更加丰富的目标细节信息。
参考文献
[1]刘刚.MATLAB数字图像处理[M].北京:
机械工业出版社,2010
[2]谢仪.常用数字图像分割算法研究[J].电脑开发与应用,2008
[3]MacQUEENJ.Somemethodsforclassificationandanalysisofmultivariateobservations[C]//Proc5thBerkeleySympMathStatistandProb,California:
UniversityofCaliforniaPress,1967,1:
281-297.
[4]华志励.K均值算法在海上目标识别的应用[J].山东科学,2012
附录
%边缘检测
closeall
clc
I=imread('
1.jpg'
);
I1=rgb2gray(I);
I2=edge(I1,'
roberts'
imshow(I2);
title('
roberts算子边缘检测'
figure
(2);
imwrite(I2,'
roberts.jpg'
I3=edge(I1,'
prewitt'
imshow(I3);
prewitt算子边缘检测'
figure(3);
imwrite(I3,'
prewitt.jpg'
I4=edge(I1,'
sobel'
imshow(I4);
sobel算子边缘检测'
figure(4);
imwrite(I4,'
sobel.jpg'
imshow(I);
原图'
%双峰法图像分割
clearall
2.jpg'
figure
(1);
th=97;
J=im2bw(I,th/255);
imshow(J);
双峰'
imwrite(J,'
双峰.jpg'
%迭代法图像分割
%计算图像的灰度最小和最大值
tmin=min(I(:
));
tmax=max(I(:
%设定初始阈值
th=(tmin+tmax)/2;
%定义开关变量,用于控制循环次数
ok=true;
%迭代法计算阈值
whileok
g1=I>
=th;
g2=I<
u1=mean(I(g1));
u2=mean(I(g2));
thnew=(u1+u2)/2;
%设定两次阈值的比较,当满足小于1时,停止循环
ok=abs(th-thnew)>
=1;
th=thnew;
end
th=floor(th);
%阈值分割
J1=im2bw(I,th/255);
str=['
迭代分割:
阈值Th='
num2str(th)];
imshow(J1);
迭代法'
imwrite(J1,'
迭代.jpg'
%K均值聚类法
clc;
clear;
k=4;
ima=double(I1);
copy=ima;
%做备份
ima=ima(:
%矢量化
mi=min(ima);
%dealwithnegative
ima=ima-mi+1;
%andzerovalues
s=length(ima);
%建立直方图
m=max(ima)+1;
h=zeros(1,m);
hc=zeros(1,m);
fori=1:
s
ifima(i)>
h(ima(i))=h(ima(i))+1;
end;
ind=find(h);
hl=length(ind);
%图心初始化
mu=(1:
k)*m/(k+1);
while(true)
oldmu=mu;
%当前分类
fori=1:
hl
c=abs(ind(i)-mu);
cc=find(c==min(c));
hc(ind(i))=cc
(1);
end
k,
a=find(hc==i);
mu(i)=sum(a.*h(a))/sum(h(a));
ifmu==oldmu
break;
%calculatemask
s=size(copy);
mask=zeros(s);
s
(1),
forj=1:
s
(2),
c=abs(copy(i,j)-mu);
a=find(c==min(c));
mask(i,j)=a
(1);
mu=mu+mi-1;
%恢复范围
k
mu1(i)=uint8(mu(i));
end;
q=0;
s
(1)
forj=1:
s
(2)
whileq<
=k
ifmask(i,j)==q
image(i,j)=mu1(q);
q=q+1;
q=0;
imwrite(image,'
22.jpg'
%聚类后的图像
g_max=double(max(max(image)));
g_min=double(min(min(image)));
T=round(g_max-(g_max-g_min)/3);
%T为二值化的阈值
[m,n]=size(image);
d=(double(image)>
=T);
%d:
二值图像
figure(5);
imshow(d);
K均值'
imwrite(d,'
Kmeans.jpg'