Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1808152
  • 博文数量: 195
  • 博客积分: 4227
  • 博客等级: 上校
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-04 10:39
文章分类

全部博文(195)

文章存档

2013年(1)

2012年(26)

2011年(168)

分类: C/C++

2012-04-25 10:41:09

基于梯度调整的矩不变自动阈值图像分割算法

来源:电子技术应用  作者:罗诗途 罗飞路 张王已 王艳玲 文演

摘要:提出了一种改进的矩不变自动阈值算法。该算法针对矩不变自动阈值法忽略图像细节的缺点,在矩不变自动阈值 的基础上增加了基于目标边缘像素的梯度调整,从而使分割效果兼顾图像的整体和细节。该算法无须迭代或搜索,运算速度快,可以满足实时性的要求。仿真结果表 明,该算法能有效地对目标图像进行分割。

关键词:图像分割 阈值选取 矩不变法 梯度调整 目标跟踪

图像分割是计算机视觉中的一个关键问题,它是一种重要的图像分析技术。其目的是将图像中有意 义的特征或者需要应用的特征提取出来。图像分割所遵循的基本原则是,使区域内部所考虑的特征或属性是相同或相似的。而这些特征或属性在不同的区域中则不 同、存在差异[1]。人们通常将图像分割的方法归纳为基于灰度直方图的阈值化方法和基于区域增长法两大类。其中阈值化方法因其简单、计算量小、性能较稳定 而成为图像分割中应用最广泛的分割技术。近年来,随着各学科新理论和方法的提出,人们也提出了许多结合特定理论、方法和工具的分割技术,例如基于数学形态 学的分割技术、借助统计模式识别方法的分割技术、利用神经网络的分割技术等[2]。

图像阈值分割是根据一定的阈值将目标从视场背景分离出来的过程。在实际系统中,图像目标和背 景之间并不具备截然不同的灰度,随着可见光照射角度的不同,目标的亮度和背景的亮度均要变化。因此阈值的正确选择是很重要的,直接影响着分割的精度及图像 描述分析的正确性。通常采用自适应阈值选取,下面介绍基于梯度调整的矩不变自动阈值法,它克服了矩不变自动阈值法的缺陷,达到较好的分割效果。

1 矩不变阈值分割法介绍

矩是随机变量的数学特征。矩法是由 Karl pearson在1894年引入的参数点估计算法,其基本思想是:样本抽自总体,样本的矩在一定程度上反映了总体的矩。因此可以用样本矩函数的估计作为相 应的总体矩函数的估计量。矩法是一种效率较高的正态性检验方法。具体作法是:样本矩作为相应总体矩的估计量;以样本矩的函数作为相应的总体矩同样函数的估 计量。这种方法最常见的应用是用样本平均数估计总体数学期望。

从统计学观点来看,图像可以看作是二维随机过程(随机场)中的一个样本,这个样本可以看作是 理想图像的模糊视觉,其特性反映了总体的特性。从统计的角度来看,分割就是由样本估计总体的特征,由样本的分布估计总体的分布,分割本身也是对整体的一种 描述和估计,是一个参数估计的问题,可以用参数估计的方法进行目标图像的分割。矩不变阈值分割法就是把矩法用于图像的分割,其基本思想是:使阈值分割前 后,图像的矩保持不变[3]。矩不变阈值法可以看作是一种图像变换,它将原始模糊图像变换成理想图像。

二维图像的第k阶矩mk定义为:

其中i为灰度值,pi为图像中灰度为i的像素比例。对于图像分割来说,如果进行二值分割,则分割后只有Zo和Z1两个灰度级,且Zo

对于划分目标和背景的最佳阈值,应当保持分割前后的图像的前三阶矩相等。即有:

mi'=mi    (3)

则可以得到如下方程组:

为了找到希望的阈值t,需要先从上述方程组中解出po:

其中,

求出Po后再在原图像直方图上选择合适的t使之满足:

则t就是所求的分割阈值。当找不到精确的灰度值做门限满足P0时,选择最为接近的灰度值作为分割阈值。

矩不变法的运算速度较快,可以满足实时性的要求,但其受目标影响较大,目标大小的变化会影响分割的准确性。

2 矩不变法的梯度调整

矩不变法是根据样本估计总体的特性推导而出,是根据图像的整体信息进行图像分割。这种分割方 法在实际应用中,发现分割后的目标边缘细节信息有很大的丢失。通过对算法原理及不足点的分析,本文利用图像中目标边界和相邻背景的灰度差别较大、而目标区 域或背景区域内部像素间的灰度差别较小的特性,提出了一种基于梯度调整的改进的矩不变自动阈值法。改进后的算法的基本原理如下:

首先由矩不变法得到初始分割阈值t,然后利用梯度算子对图像进行处理,计算出图像的梯度分布。设现行扫描点、后一行扫描点和下一行中相邻点的灰度为f(i,j),f(i+1,j)和f(i,j+1),在x、y方向上的一阶差分定义为:

梯度定义为:

G=Δxf(i,j)i+Δyf(i,j)j    (8)

其模为:

为了简便计算,梯度模G[f(i,j)]选用如下的近似公式:

G[f(i,j)]=max[|Δxf(i,j)|,|Δyf(i,j)|]    (10)

根据计算出的梯度模,找出边缘像素。设边缘像素的梯度为Gef(i,j),则有:

其中Te为边界梯度阈值,可适当选取为(Gmax-Gmin)/2左右。

再求出边缘像素的梯度均值:

MG=E[Ge[f(i,j]]    (12)

这样,基于梯度调整的矩不变自动阈值分割法的阈值T为:

T=t-α·MG    (13)

其中,α(0≤α≤0.3)为调整系数,根据经验在0.1左右选择。

3 算法仿真

在仿真试验中,选取了两幅图像,以矩不变自动阈值法和基于梯度调整的矩不变阈值法作分割,这 两幅图像分别具有双峰直方图和单峰直方图的特性。由图1可以看出这两种阈值法在分割目标灰度分布简单的图像上的效果不相上下,都能比较好地分割出目标图 像。由图2可以看出,当直方图为单峰或为单调函数时,用矩不变阈值法进行分割后的目标图像,虽然与原目标图像很相近,但是背景的干扰比较严重,存在较大的 误判率,不利于后续的跟踪处理;而用基于梯度调整的矩不变阈值法对图像分割后,无明显的误判,分割出来的目标图像轮廓鲜明,可以极为方便地确定目标质心, 有利于后续跟踪处理。从结果上可以看出其分割效果明显优于矩不变阈值法;且基于梯度调整的矩不变阈值法的算法相对简单,无须迭代或搜索,运算速度快。

到目前为止,虽然人们已经提出了很多种图像分割方法,但没有任何一种图像分割方法能够适用于 所有的图像[4]。如何选择分割方法,主要是根据实际的应用环境和具体的目标而定。笔者所从事的“车载电视跟踪系统”中,目标图像分割是自动目标识别和跟 踪的重要环节,其性能对跟踪系统具有显著影响。应用基于梯度调整的矩不变自动阈值分割法,由实验结果可以看出,能满足系统实时处理的要求,而且在处理相对 复杂的目标图像时,能够取得比较好的效 果。                                                                   

 

int FunMain::Karl(unsigned char *image, int rows, int cols)//基于梯度调整的矩不变自动阈值
{
 //int Z0=0,Z1=255;
 int Hist[256];
 float PIs[256]; // 图像直方图,256个点
 int i,j,x,y;
 int nps;
 int Size=rows*cols;
 // 对直方图置零...
 //memset(ihist, 0, sizeof(ihist));
 for (i = 0; i <256; i++)
  Hist[i]=0;
 
 // 生成直方图
 for (i =0; i < rows; i++)
 {
  for (j = 0; j < cols; j++)
  {   nps =(int) image[i*cols+j];
  Hist[nps]++;
  }
 }
 
 for (i = 0; i <256; i++)
  PIs[i]=(float)Hist[i]/Size;
 
 double m0=1,m1=0,m2=0,m3=0;
 double C0,C1,G,P0,P1=0,Tr;
 
 for (i = 0; i <256; i++) //计算三个矩
 {
  m1+=PIs[i]*i;
  m2+=PIs[i]*i*i;
  m3+=PIs[i]*i*i*i;
 }
 
 C0=double((m1*m3-m2*m2)/(m2-m1*m1));//转换
 C1=double((m1*m2-m3)/(m2-m1*m1));
 G=double((sqrt(C1*C1-4*C0)-C1)/2);
 P0=double((G-m1)/(2*G+C1));//计算机P0
 
 for (i = 0; i <256; i++)
 {P1+=PIs[i];
 if(P1==P0){Tr=i;break;}
 else if(P1>P0){Tr=i-1;break;}
 }


 int Gf[500][500];
 int xf,yf, Temp;
 int max0=0,min0=255;
 for (i =0; i < rows-1; i++)
 {
  for (j = 0; j < cols-1; j++)
  {
   xf=abs((int) image[(i+1)*cols+j]-(int) image[i*cols+j]);
   yf=abs((int) image[(i)*cols+j+1]-(int) image[i*cols+j]);
   Gf[i][j]=max(xf,yf);
   if(Gf[i][j]>max0)max0=Gf[i][j];
   if(Gf[i][j]  }
 }
 int Te=(max0-min0)/2;
 double MG=0,Cont=0;
 
 for (i =0; i < rows-1; i++)
 {      for (j = 0; j < cols-1; j++)
        {
          if(Gf[i][j]>=Te)
           {
             MG+=Gf[i][j];
             Cont++;
        }
 }
 }
 MG=double(MG/Cont);
 Tr=abs(Tr-0.4*MG);
 return Tr;
}           

阅读(2102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~