单目标图像的目标区域提取

西安理工大学

研究生课程论文

课程名称: 数字图像分析 课程代号: 任课教师:论文题目: 单目标图像的目标区域提取 完成日期: 2015 年 1 月 13 日 学 科:

姓 名:

单目标图像的目标区域提取

摘 要:图像分割的目的是将图像划分为不同的区域,区域增长是一种根据事

先定义的准则将像素或子区域聚合成为更大的区域的过程,分裂合并是根据一致性准则处理目标和背景之间灰度渐变图像的典型算法。本文以单目标图像为对象,通过区域增长和分裂合并的方法实现了对目标区域的提取,并对实验结果进行了分析。

关键字:图像分割;区域增长;分裂合并;二值化

Abstract :The purpose of image segmentation is to divide the image into different

areas, regional growth is a kind of according to predefined criteria will become more pixels or subdomain polymerization process of large area, split the merger is processed according to the consistency criterion between target and background gray gradient image of typical algorithm. Based on the single target image as the object, through regional growth and division merge method to extract the target area is achieved, and the experiment results are analyzed.

Key words:Image segmentation;Regional growth;Split the merger;binarization

1引言

数字图像处理的目的之一是图像识别, 而图像分割与测量是图像识别工作的基础。图像分割是将图像分成一些有意义的区域, 然后对这些区域进行描述, 相当于提取出某些目标区域图像的特征, 判断图像中是否有感兴趣的目标。图像分割是图像处理到图像分析的关键步骤, 在图像工程中占据重要的位置。一方面, 它是目标表达的基础, 对特征测量有重要的影响。另一方面, 因为图像分割及其基于分割的目标表达、特征提取和参数测量等将原始图像转化为更抽象更紧凑的形式, 使得更高层的图像分析和理解成为可能。

2技术分析

2.1图像分割

图像分割就是将待处理的图像表示为物理上有意义的连通区域的集合,一般是通过对图像的不同特征如纹理、颜色、边缘、亮度等特征的分析,来达到图像

分割的目的。图像分割通常是为了进一步对图像进行分析、理解、识别、处理、跟踪等,分割的准确性直接影响到后续任务的有效性,因此分割在图像处理中具有十分重要的意义。

图像分割可以依据图像中每个像素的颜色、灰度、纹理信息和几何性质等特征,将图像中具有某些特殊含义的不同区域区分开,分割后所形成的这些区域是互不重叠的,并且每个区域都满足特定区域的一致性。分割出来的区域应该同时满足[1]:

(1)分割出来的图像区域的均匀性和连通性。

(2)相邻分割区域之间针对选定的某种特征具有明显的差异。 (3)分割区域边界应该规整,同时保证边缘的空间定位精度。

根据图像分割的处理方式不同,可以将基于区域的图像分割算法分为以下三大类:a. 阈值法;b. 区域生长和分裂合并法;c. 基于统计学的算法。常见的经典的图像分割技术有:并行边界分割技术、串行边界分割技术、并行区域分割技术和串行区域分割技术。串行区域分割技术指采用串行处理的策略通过对目标区域的直接检测来实现图像分割的技术, 它的特点是将整个处理过程分解为顺序的多个步骤逐次进行, 对后继步骤的处理要对前面已完成步骤的处理结果进行判断而确定。这里的判定要根据一定的准则, 一般来说如果准则是基于图像灰度特性的, 则这个方法可以用于灰度图像分割。基于区域的串行分割技术有两种基本的形式, 一是从单个象素出发, 渐渐合并以形成所需的分割区域, 二是从整个图出发, 分裂切割至所需要的分割区域, 第一种方法的典型技术就是区域增长。本文主要讨论的就是区域增长算法和分裂合并算法。

2.2区域增长算法

基于区域生长的算法的基本思想是把具有相似性质的像素归并在同一个区域内。像素的相似性判定包括图像的纹理信息、灰度值、颜色等其他像素特性。该算法首先对需要分割的每个区域选取一个种子像素,作为区域生长的起点位置,然后将种子像素与周围邻域内的像素进行相似性比较,如果满足约定好的相似性准则或生长准则,就把当前比较的像素合并到种子像素所在的区域。再利用新合并进去的像素作为种子点,与它周围的像素进行相似性比较,直到没有满足条件的像素可以被合并进来就表示完成了一个区域的生长过程。

下图中给出了一个已知种子点进行区域生长的示例。图 2-1(a)表示需要分割的图像,设已知有两个种子像素(用下划线标注),现进行区域生长。这里选

取的合并准则是:如果种子像素的灰度值与邻域像素的灰度值之差小于等于门限值 T,则将当前比较的像素归并到种子像素所在的区域。图 2-1(b)给出了 T=3 时的结果,图像被分割为两个区域。图 2-1(c)给出的是 T=1 时的结果,从图中可以看出分割结果中存在着较小的区域,产生了过分割现象。图 2-1(d)给出的是当 T=6 时的分割结果,该图显示图像中的所有像素都在一个区域内,没有达到分割图像的目的。因此可见,门限值的选取对于分割结果的好坏起着决定性的作用[3]。

(a)原图 (b)T=3

(c)T=1 (d)T=6

图2-1原图像和 T 取不同值的区域生长结果

算法的好坏取决于三个要素:(1)如何选择一组能够正确代表所选区域的种子像素;(2)如何确定在生长过程中能将相邻像素合并进来的准则;(3)如何确定生长终止的条件或规则。其优点是当区域的相似性准则和生长终止的条件比较容易找到时,可以取得较好的分割效果。但是,该算法在生长过程中考虑的只是当前种子点像素与周围邻域像素的相似性也即仅考虑了图像的局部信息,没有考虑生长的过程,对于变化特征比较缓慢的图像不能得到较好的分割效果。另外,种子像素点的选取和生长准则的确定直接影响到分割的效果图,如果选取不当则可能造成过分割或不能有效分割的问题(如图 2-1(c)和图2-1(d)所示)。

区域增长的关键是相似性准则也即区域生长准则的选取,相似性准则依赖于图像的灰度、纹理等信息。使用不同的增长准则会影响到图像的最终分割结果。

最简单的生长准则是基于灰度信息的生长准则。区域生长法是以区域为处理对像的, 它考虑到区域内部和区域之间的同异性, 尽量保持区域中像素的临近性和一致性的统一。这样就可以更好地分辨图像真正的边界。基于区域的分割方法的关键在于定义一个一致性准则, 用来判断两个邻接的区域是否可以合并, 一致则将两区域合并, 直到不能合并为止。

区域增长是以像素为基本单位进行操作的,基于灰度信息的区域生长算法实现过程[4]:

(1)顺序扫描图像,找到第一个还没有被合并的像素,设该像素为(x 0, y 0)。 (2)以(x 0, y 0)为中心,考虑(x 0, y 0)的4邻域像素,将该像素周围邻域内的像素

(x , y )与之进行比较,如果点(x , y )与(x

, y 0)的灰度值之差小于预先设定的值,

则将它们合并在同一个区域内,同时将(x , y )压入堆栈。

(3)从堆栈中取出一个像素作为中心像素(x 0, y 0),返回执行步骤(2)。 (4)当堆栈为空时,回到步骤(1)。

(5)重复(1)-(4)步, 直到图像中的每个像素点都不能满足归并条件,增长结束。

2.3分裂与合并算法

分裂合并算法是处理目标和背景之间灰度渐变图像的典型算法。它首先选取一致性准则,然后根据这一准则将图像分成四个区域,并分别判断这些区域是否满足一致性准则。如果不满足,则继续分割;否则,将满足准则的所有区域放在一起重新判断他们合并如此反复,直到不能再分割也不能再合并为止。分裂合并算法并不需要向区域增长法那样预先指定种子,它的研究重点是分裂和合并的规则设计[5]。

分裂合并算法的分割原理:从整个图像出发,根据图像和各区域的不均匀性,把图像或区域分裂成新的子区域;根据毗邻区域的均匀性,把毗邻的子区域合并成新的较大区域。设用R 表示整个图像,用R i 表示分割成的一个图像区域;并假设同一区域R i 中的所有像素都满足某一相似性准则时,P (R i ) =TRUE ,否则当P (R i ) =T P (R i ) =FALSE 。R U E

时,不再进一步分割该区域;当P (R i ) =FALSE

时,继续将该区域分成大小相同的四个更小的象限区域。在这种分割过程中,必定存在R h 的每个子区域R j 与R l 的某个子区域R k 具有相同性质,也即

P (R j R k ) =TRUE 时,这时就可以吧R j 和R k 合并组成新的区域[6]。如图2-2所示。

图2-2 分割示意图

3实现流程

本程序在VS 2010下采用C++语言实现,这里以对印章图像的特征提取为例,在处理图像之前需要对图像做二值化处理,采集的印章图像可以划分为三个部分:白色或灰色的背景区域;红色(为主) 印章代表的目标区域以及干扰噪声;黑色或蓝色的手写体签名、印刷体文字或底纹。当对一幅图像进行分割时, 使用两个不同的灰度级对其分割结果区分, 把前景像素点的灰度值都赋为a, 如O, 而所有的背景像素灰度值都赋为b, 如1或255。a 与b 是不相等的, 这样就可在结果图像中区分出前景和背景了。对于这种表示方法来说, 图像分割的过程也就是将一幅多灰度级的图像转化为只有两个灰度级图像的过程。只有两个灰度级的图像为二值图像,而由一幅多灰度级图像转化为二值图像的过程, 我们称之为图像二值化[2]。

将彩色图像转化成灰阶图像时,常采用如下的经验公式:gray=0.3×R+0.59×G+0.11×B 其中,gray 为灰度值,R 、G 、B 分别为红色、绿色、蓝色分量值,二值化图像就是把经过HSI 模型红色提取的图像转化为0、1取值的二值化图像,具体做法是:

如果Pixel i (R) threshold(R) 否则令: Pixel i i (R)=255 Pixel i i (G)=255 i i (B)=255

其中:Pixel i (R)、Pixel i (G)、Pixel i (B)是图像中第i 像素点的红、绿、蓝三基色值,threshold(R)为R 基色的阈值。在确定阈值后对印章图像进行点像素过滤,把不相关的像素点的值置成白色,把相关像素点的值设定为黑色,从而转化为二值图像。实验结果如图3-1所示。

图3-1(a) 原图 图3-1(b) 二值化结果

区域增长的算法函数RegionGrow(CPoint SeedPos, int thresh) ,调用该函数进行处理,区域增长的实验结果如图3-2所示

图3-2(a) 原图 图3-2(b) 二值化结果 图3-2(c) 区域增长结果

采用分裂合并算法后的实验结果如图3-3所示

图3-3(a)原图 图3-3(b)二值化结果 图3-3(c)分裂合并结果

4总结

分割问题的困难在于图像数据的模糊和噪声的干扰,目前为止,还没有一种或者几种完善的分割方法,可以按照人们的意愿准确的分割出任何一种图像。基于区域生长的分割算法优点是方法比较简单,区域生长准则确定的好时会得到相对较好的分割效果,但是该算法在生长过程中考虑的只是当前种子点像素与周围邻域像素的相似性也即仅考虑了图像的局部信息,没有考虑生长的过程,对于变化特征比较缓慢的图像不能得到较好的分割效果,而且种子像素点的选取和生长准则的确定直接影响到分割的效果图,如果选取不当则可能造成过分割或不能有

效分割的问题。

基于分裂与合并的分割算法,在分裂合并方法中,确定图像块的初始划分,就是从四分树中选择某一层作为初始层,该层图像的划分即为图像块的初始划分。若初始层选择较上层时,由于图像的分块内部边缘较长,出现断裂的概率较高,块内各区域相连通的概率较大,需要对块继续四等分。若初始层选择较下层时,图像容易被过分割,造成合并运算量剧增,增加不必要的开销。对有些图像采用分裂合并算法分割后效果不明显的,可以将各种算法结合对传统的分裂合并算法作改进。如在分割前进行去噪减少噪声影响,同时获得重要轮廓信息,降低计算复杂性。采用了本文的算法,在边缘的连接处,分块数量并无明显增多,且边界光滑。也可以结合边缘检测和分裂合并的图像分割算法,最大限度利用图像边缘信息进行区域分裂,一定程度上可避免过分割和人为分割造成的方块效应,从而达到理想的分割效果。

分割结果的好坏,目前还没有一个统一的评价判断标准,必须从分割的效果和实际应用的场景来判断。实际图像中景物情况各异,具体问题需要具体分析,需要根据实际情况选择合适的方法。可能同一个图像在不同算法下处理的效果会相差甚远,因此必须结合具体的图像和应用选择最好的算法来进行处理。

参考文献:

[1]吴学明. 图像分割的算法研究[D].成都理工大学,2006.

[2]章毓晋著, 《图像工程(中册) ———图像处理和分析》, 清华大学出版社,2006. [3]胡正平, 张晔, 谭营. 区域进化自适应高精度区域增长图像分割算法[J]. 系统工程与电子技术,2007,06:854-857.

[4]徐爱霞, 胡正平, 谭营. 基于区域进化的区域增长图像分割[J]. 光学技术,2006,S1:482 -484.

[5]黄猛, 唐琳, 胡世安, 张搏. 一种改进的分裂合并图像分割算法[J]. 现代电子技术,2009,22:102-105.

[6]林敏, 陈建新, 陈哲亮. 基于边缘检测与分裂合并的图像分割算法[J]. 电子技术应用,2011,07:130-133.

附件:主要程序清单

//区域增长

void ImgSegment::RegionGrow(CPoint SeedPos, int thresh) {if (m_nBitCount!=8)//只处理灰度图像

return ;

if (m_pImgDataOut!=NULL)//释放m_pImgDataOut指向的图像数据空间

{delete []m_pImgDataOut; m_pImgDataOut=NULL;}

if (m_lpColorTableOut!=NULL) delete []m_lpColorTableOut; m_lpColorTableOut=NULL;}

m_nBitCountOut=m_nBitCount;//输出图像与输入图像为同一类型

{//释放颜色表空间

m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut);//输出图像if (m_nColorTableLengthOut!=0){

memcpy(m_lpColorTableOut,m_lpColorTable,

sizeof (RGBQUAD)*m_nColorTableLengthOut);}

颜色表,与输入图像相同

m _lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut];

m_imgWidthOut=m_imgWidth;//输出图像的宽高, 与输入图像相等 m_imgHeightOut=m_imgHeight;

int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;//每行像素所占字节数

m_pImgDataOut=new unsigned char [lineByte*m_imgHeight];//申请输出图像缓冲区 memset(m_pImgDataOut,255,lineByte*m_imgHeight); //将输出图像初始化置255 //以下是区域生长代码

//二维数组direction 代表中心像素点8邻域坐标与该点在x 和y 方向上的偏移, //其中第一列为x 方向的偏移, 第二列为y 方向的偏移

int direction[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //栈申请,此处假定进栈的像素最多为图像总像素数 CPoint *stack=new CPoint[m_imgWidth*m_imgHeight]; int top;//栈顶指针

CPoint currentPoint, popPoint;//当前正处理的点和弹出的点

int k;//循环变量,遍历array 数组的第一维下标 i nt label;//标记变量

int temp1, temp2;//临时变量

*(m_pImgDataOut+SeedPos.y*lineByte+SeedPos.x)=0;//将给定种子点置标记0, 入栈 top=0;

stack[top].x=SeedPos.x; stack[top].y=SeedPos.y;

while (top>-1){//堆栈

temp1=*(m_pImgData+SeedPos.y*lineByte+SeedPos.x);//记录种子像素的灰度值

popPoint.x=stack[top].x;//弹出栈顶元素, 该元素已经生长 popPoint.y=stack[top].y;

top--;

//考察弹出像素周围是否有没有生长的像素 for (k=0;k

currentPoint.x=popPoint.x+direction[k][0]; currentPoint.y=popPoint.y+direction[k][1]; //如果待考察的点不在图像内,则跳过

if (currentPoint.xm_imgWidth-1|| currentPoint.ym_imgHeight-1)

continue ;

//该点标号

label=*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x); //弹出的点周围有尚没生长的点 if (label==255){ temp2=*(m_pImgData+currentPoint.y*lineByte+currentPoint.x); //如果当前被考察的像素灰度值与种子点灰度值之差小于给定的阈值, //则认为相似, 将其进栈处理 if (abs(temp1-temp2)

*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x)=0; top++;

stack[top].x=currentPoint.x;

stack[top].y=currentPoint.y;

} } } }

delete []stack;}//清除缓冲区

//分裂合并

void ImgSegment::Split(unsigned char *pImgData) { if (m_nBitCount!=8)return ; //只处理灰度图像 //释放m_pImgDataOut指向的图像数据空间 if (m_pImgDataOut!=NULL){ delete []m_pImgDataOut; m_pImgDataOut=NULL;}

if (m_lpColorTableOut!=NULL){

delete []m_lpColorTableOut;//释放颜色表空间 m_lpColorTableOut=NULL;}

m_nBitCountOut=m_nBitCount;//输出图像与输入图像为同一类型 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut);

if (m_nColorTableLengthOut!=0){//输出图像颜色表,与输入图像相同 m_lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,

sizeof (RGBQUAD)*m_nColorTableLengthOut);}

m_imgWidthOut=m_imgWidth;//输出图像的宽高, 与输入图像相等

m_imgHeightOut=m_imgHeight;

m_pImgDataOut=new unsigned char [lineByte*m_imgHeight];//申请输出图像缓冲区 int i,j;//遍历图象的横、纵坐标 int nLocalThresh[2][2] ;// 局部阈值 int nLocAvg ;// 子图象的平均值 nLocAvg = 0 ;// 对左上图像逐点扫描: for (i=0; i

nLocAvg /= ( (m_imgHeight - m_imgHeight/2) * (m_imgWidth/2) ) ;// 计算均值 nLocalThresh[1][0] = nLocAvg ;// 设置阈值为子图象的平均值

nLocalThresh[0][1] = nLocAvg ;// 设置阈值为子图象的平均值 for (j=0; j

} { } nLocAvg +=pImgData[j*lineByte + i]; // 计算均值 nLocAvg /= ( (m_imgHeight - m_imgHeight/2) * (m_imgWidth - m_imgWidth/2) ) ; // 设置阈值为子图象的平均值 nLocalThresh[1][1] = nLocAvg ; // 对右下图像逐点扫描进行分割: for (j=m_imgHeight/2; j

西安理工大学

研究生课程论文

课程名称: 数字图像分析 课程代号: 任课教师:论文题目: 单目标图像的目标区域提取 完成日期: 2015 年 1 月 13 日 学 科:

姓 名:

单目标图像的目标区域提取

摘 要:图像分割的目的是将图像划分为不同的区域,区域增长是一种根据事

先定义的准则将像素或子区域聚合成为更大的区域的过程,分裂合并是根据一致性准则处理目标和背景之间灰度渐变图像的典型算法。本文以单目标图像为对象,通过区域增长和分裂合并的方法实现了对目标区域的提取,并对实验结果进行了分析。

关键字:图像分割;区域增长;分裂合并;二值化

Abstract :The purpose of image segmentation is to divide the image into different

areas, regional growth is a kind of according to predefined criteria will become more pixels or subdomain polymerization process of large area, split the merger is processed according to the consistency criterion between target and background gray gradient image of typical algorithm. Based on the single target image as the object, through regional growth and division merge method to extract the target area is achieved, and the experiment results are analyzed.

Key words:Image segmentation;Regional growth;Split the merger;binarization

1引言

数字图像处理的目的之一是图像识别, 而图像分割与测量是图像识别工作的基础。图像分割是将图像分成一些有意义的区域, 然后对这些区域进行描述, 相当于提取出某些目标区域图像的特征, 判断图像中是否有感兴趣的目标。图像分割是图像处理到图像分析的关键步骤, 在图像工程中占据重要的位置。一方面, 它是目标表达的基础, 对特征测量有重要的影响。另一方面, 因为图像分割及其基于分割的目标表达、特征提取和参数测量等将原始图像转化为更抽象更紧凑的形式, 使得更高层的图像分析和理解成为可能。

2技术分析

2.1图像分割

图像分割就是将待处理的图像表示为物理上有意义的连通区域的集合,一般是通过对图像的不同特征如纹理、颜色、边缘、亮度等特征的分析,来达到图像

分割的目的。图像分割通常是为了进一步对图像进行分析、理解、识别、处理、跟踪等,分割的准确性直接影响到后续任务的有效性,因此分割在图像处理中具有十分重要的意义。

图像分割可以依据图像中每个像素的颜色、灰度、纹理信息和几何性质等特征,将图像中具有某些特殊含义的不同区域区分开,分割后所形成的这些区域是互不重叠的,并且每个区域都满足特定区域的一致性。分割出来的区域应该同时满足[1]:

(1)分割出来的图像区域的均匀性和连通性。

(2)相邻分割区域之间针对选定的某种特征具有明显的差异。 (3)分割区域边界应该规整,同时保证边缘的空间定位精度。

根据图像分割的处理方式不同,可以将基于区域的图像分割算法分为以下三大类:a. 阈值法;b. 区域生长和分裂合并法;c. 基于统计学的算法。常见的经典的图像分割技术有:并行边界分割技术、串行边界分割技术、并行区域分割技术和串行区域分割技术。串行区域分割技术指采用串行处理的策略通过对目标区域的直接检测来实现图像分割的技术, 它的特点是将整个处理过程分解为顺序的多个步骤逐次进行, 对后继步骤的处理要对前面已完成步骤的处理结果进行判断而确定。这里的判定要根据一定的准则, 一般来说如果准则是基于图像灰度特性的, 则这个方法可以用于灰度图像分割。基于区域的串行分割技术有两种基本的形式, 一是从单个象素出发, 渐渐合并以形成所需的分割区域, 二是从整个图出发, 分裂切割至所需要的分割区域, 第一种方法的典型技术就是区域增长。本文主要讨论的就是区域增长算法和分裂合并算法。

2.2区域增长算法

基于区域生长的算法的基本思想是把具有相似性质的像素归并在同一个区域内。像素的相似性判定包括图像的纹理信息、灰度值、颜色等其他像素特性。该算法首先对需要分割的每个区域选取一个种子像素,作为区域生长的起点位置,然后将种子像素与周围邻域内的像素进行相似性比较,如果满足约定好的相似性准则或生长准则,就把当前比较的像素合并到种子像素所在的区域。再利用新合并进去的像素作为种子点,与它周围的像素进行相似性比较,直到没有满足条件的像素可以被合并进来就表示完成了一个区域的生长过程。

下图中给出了一个已知种子点进行区域生长的示例。图 2-1(a)表示需要分割的图像,设已知有两个种子像素(用下划线标注),现进行区域生长。这里选

取的合并准则是:如果种子像素的灰度值与邻域像素的灰度值之差小于等于门限值 T,则将当前比较的像素归并到种子像素所在的区域。图 2-1(b)给出了 T=3 时的结果,图像被分割为两个区域。图 2-1(c)给出的是 T=1 时的结果,从图中可以看出分割结果中存在着较小的区域,产生了过分割现象。图 2-1(d)给出的是当 T=6 时的分割结果,该图显示图像中的所有像素都在一个区域内,没有达到分割图像的目的。因此可见,门限值的选取对于分割结果的好坏起着决定性的作用[3]。

(a)原图 (b)T=3

(c)T=1 (d)T=6

图2-1原图像和 T 取不同值的区域生长结果

算法的好坏取决于三个要素:(1)如何选择一组能够正确代表所选区域的种子像素;(2)如何确定在生长过程中能将相邻像素合并进来的准则;(3)如何确定生长终止的条件或规则。其优点是当区域的相似性准则和生长终止的条件比较容易找到时,可以取得较好的分割效果。但是,该算法在生长过程中考虑的只是当前种子点像素与周围邻域像素的相似性也即仅考虑了图像的局部信息,没有考虑生长的过程,对于变化特征比较缓慢的图像不能得到较好的分割效果。另外,种子像素点的选取和生长准则的确定直接影响到分割的效果图,如果选取不当则可能造成过分割或不能有效分割的问题(如图 2-1(c)和图2-1(d)所示)。

区域增长的关键是相似性准则也即区域生长准则的选取,相似性准则依赖于图像的灰度、纹理等信息。使用不同的增长准则会影响到图像的最终分割结果。

最简单的生长准则是基于灰度信息的生长准则。区域生长法是以区域为处理对像的, 它考虑到区域内部和区域之间的同异性, 尽量保持区域中像素的临近性和一致性的统一。这样就可以更好地分辨图像真正的边界。基于区域的分割方法的关键在于定义一个一致性准则, 用来判断两个邻接的区域是否可以合并, 一致则将两区域合并, 直到不能合并为止。

区域增长是以像素为基本单位进行操作的,基于灰度信息的区域生长算法实现过程[4]:

(1)顺序扫描图像,找到第一个还没有被合并的像素,设该像素为(x 0, y 0)。 (2)以(x 0, y 0)为中心,考虑(x 0, y 0)的4邻域像素,将该像素周围邻域内的像素

(x , y )与之进行比较,如果点(x , y )与(x

, y 0)的灰度值之差小于预先设定的值,

则将它们合并在同一个区域内,同时将(x , y )压入堆栈。

(3)从堆栈中取出一个像素作为中心像素(x 0, y 0),返回执行步骤(2)。 (4)当堆栈为空时,回到步骤(1)。

(5)重复(1)-(4)步, 直到图像中的每个像素点都不能满足归并条件,增长结束。

2.3分裂与合并算法

分裂合并算法是处理目标和背景之间灰度渐变图像的典型算法。它首先选取一致性准则,然后根据这一准则将图像分成四个区域,并分别判断这些区域是否满足一致性准则。如果不满足,则继续分割;否则,将满足准则的所有区域放在一起重新判断他们合并如此反复,直到不能再分割也不能再合并为止。分裂合并算法并不需要向区域增长法那样预先指定种子,它的研究重点是分裂和合并的规则设计[5]。

分裂合并算法的分割原理:从整个图像出发,根据图像和各区域的不均匀性,把图像或区域分裂成新的子区域;根据毗邻区域的均匀性,把毗邻的子区域合并成新的较大区域。设用R 表示整个图像,用R i 表示分割成的一个图像区域;并假设同一区域R i 中的所有像素都满足某一相似性准则时,P (R i ) =TRUE ,否则当P (R i ) =T P (R i ) =FALSE 。R U E

时,不再进一步分割该区域;当P (R i ) =FALSE

时,继续将该区域分成大小相同的四个更小的象限区域。在这种分割过程中,必定存在R h 的每个子区域R j 与R l 的某个子区域R k 具有相同性质,也即

P (R j R k ) =TRUE 时,这时就可以吧R j 和R k 合并组成新的区域[6]。如图2-2所示。

图2-2 分割示意图

3实现流程

本程序在VS 2010下采用C++语言实现,这里以对印章图像的特征提取为例,在处理图像之前需要对图像做二值化处理,采集的印章图像可以划分为三个部分:白色或灰色的背景区域;红色(为主) 印章代表的目标区域以及干扰噪声;黑色或蓝色的手写体签名、印刷体文字或底纹。当对一幅图像进行分割时, 使用两个不同的灰度级对其分割结果区分, 把前景像素点的灰度值都赋为a, 如O, 而所有的背景像素灰度值都赋为b, 如1或255。a 与b 是不相等的, 这样就可在结果图像中区分出前景和背景了。对于这种表示方法来说, 图像分割的过程也就是将一幅多灰度级的图像转化为只有两个灰度级图像的过程。只有两个灰度级的图像为二值图像,而由一幅多灰度级图像转化为二值图像的过程, 我们称之为图像二值化[2]。

将彩色图像转化成灰阶图像时,常采用如下的经验公式:gray=0.3×R+0.59×G+0.11×B 其中,gray 为灰度值,R 、G 、B 分别为红色、绿色、蓝色分量值,二值化图像就是把经过HSI 模型红色提取的图像转化为0、1取值的二值化图像,具体做法是:

如果Pixel i (R) threshold(R) 否则令: Pixel i i (R)=255 Pixel i i (G)=255 i i (B)=255

其中:Pixel i (R)、Pixel i (G)、Pixel i (B)是图像中第i 像素点的红、绿、蓝三基色值,threshold(R)为R 基色的阈值。在确定阈值后对印章图像进行点像素过滤,把不相关的像素点的值置成白色,把相关像素点的值设定为黑色,从而转化为二值图像。实验结果如图3-1所示。

图3-1(a) 原图 图3-1(b) 二值化结果

区域增长的算法函数RegionGrow(CPoint SeedPos, int thresh) ,调用该函数进行处理,区域增长的实验结果如图3-2所示

图3-2(a) 原图 图3-2(b) 二值化结果 图3-2(c) 区域增长结果

采用分裂合并算法后的实验结果如图3-3所示

图3-3(a)原图 图3-3(b)二值化结果 图3-3(c)分裂合并结果

4总结

分割问题的困难在于图像数据的模糊和噪声的干扰,目前为止,还没有一种或者几种完善的分割方法,可以按照人们的意愿准确的分割出任何一种图像。基于区域生长的分割算法优点是方法比较简单,区域生长准则确定的好时会得到相对较好的分割效果,但是该算法在生长过程中考虑的只是当前种子点像素与周围邻域像素的相似性也即仅考虑了图像的局部信息,没有考虑生长的过程,对于变化特征比较缓慢的图像不能得到较好的分割效果,而且种子像素点的选取和生长准则的确定直接影响到分割的效果图,如果选取不当则可能造成过分割或不能有

效分割的问题。

基于分裂与合并的分割算法,在分裂合并方法中,确定图像块的初始划分,就是从四分树中选择某一层作为初始层,该层图像的划分即为图像块的初始划分。若初始层选择较上层时,由于图像的分块内部边缘较长,出现断裂的概率较高,块内各区域相连通的概率较大,需要对块继续四等分。若初始层选择较下层时,图像容易被过分割,造成合并运算量剧增,增加不必要的开销。对有些图像采用分裂合并算法分割后效果不明显的,可以将各种算法结合对传统的分裂合并算法作改进。如在分割前进行去噪减少噪声影响,同时获得重要轮廓信息,降低计算复杂性。采用了本文的算法,在边缘的连接处,分块数量并无明显增多,且边界光滑。也可以结合边缘检测和分裂合并的图像分割算法,最大限度利用图像边缘信息进行区域分裂,一定程度上可避免过分割和人为分割造成的方块效应,从而达到理想的分割效果。

分割结果的好坏,目前还没有一个统一的评价判断标准,必须从分割的效果和实际应用的场景来判断。实际图像中景物情况各异,具体问题需要具体分析,需要根据实际情况选择合适的方法。可能同一个图像在不同算法下处理的效果会相差甚远,因此必须结合具体的图像和应用选择最好的算法来进行处理。

参考文献:

[1]吴学明. 图像分割的算法研究[D].成都理工大学,2006.

[2]章毓晋著, 《图像工程(中册) ———图像处理和分析》, 清华大学出版社,2006. [3]胡正平, 张晔, 谭营. 区域进化自适应高精度区域增长图像分割算法[J]. 系统工程与电子技术,2007,06:854-857.

[4]徐爱霞, 胡正平, 谭营. 基于区域进化的区域增长图像分割[J]. 光学技术,2006,S1:482 -484.

[5]黄猛, 唐琳, 胡世安, 张搏. 一种改进的分裂合并图像分割算法[J]. 现代电子技术,2009,22:102-105.

[6]林敏, 陈建新, 陈哲亮. 基于边缘检测与分裂合并的图像分割算法[J]. 电子技术应用,2011,07:130-133.

附件:主要程序清单

//区域增长

void ImgSegment::RegionGrow(CPoint SeedPos, int thresh) {if (m_nBitCount!=8)//只处理灰度图像

return ;

if (m_pImgDataOut!=NULL)//释放m_pImgDataOut指向的图像数据空间

{delete []m_pImgDataOut; m_pImgDataOut=NULL;}

if (m_lpColorTableOut!=NULL) delete []m_lpColorTableOut; m_lpColorTableOut=NULL;}

m_nBitCountOut=m_nBitCount;//输出图像与输入图像为同一类型

{//释放颜色表空间

m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut);//输出图像if (m_nColorTableLengthOut!=0){

memcpy(m_lpColorTableOut,m_lpColorTable,

sizeof (RGBQUAD)*m_nColorTableLengthOut);}

颜色表,与输入图像相同

m _lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut];

m_imgWidthOut=m_imgWidth;//输出图像的宽高, 与输入图像相等 m_imgHeightOut=m_imgHeight;

int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;//每行像素所占字节数

m_pImgDataOut=new unsigned char [lineByte*m_imgHeight];//申请输出图像缓冲区 memset(m_pImgDataOut,255,lineByte*m_imgHeight); //将输出图像初始化置255 //以下是区域生长代码

//二维数组direction 代表中心像素点8邻域坐标与该点在x 和y 方向上的偏移, //其中第一列为x 方向的偏移, 第二列为y 方向的偏移

int direction[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //栈申请,此处假定进栈的像素最多为图像总像素数 CPoint *stack=new CPoint[m_imgWidth*m_imgHeight]; int top;//栈顶指针

CPoint currentPoint, popPoint;//当前正处理的点和弹出的点

int k;//循环变量,遍历array 数组的第一维下标 i nt label;//标记变量

int temp1, temp2;//临时变量

*(m_pImgDataOut+SeedPos.y*lineByte+SeedPos.x)=0;//将给定种子点置标记0, 入栈 top=0;

stack[top].x=SeedPos.x; stack[top].y=SeedPos.y;

while (top>-1){//堆栈

temp1=*(m_pImgData+SeedPos.y*lineByte+SeedPos.x);//记录种子像素的灰度值

popPoint.x=stack[top].x;//弹出栈顶元素, 该元素已经生长 popPoint.y=stack[top].y;

top--;

//考察弹出像素周围是否有没有生长的像素 for (k=0;k

currentPoint.x=popPoint.x+direction[k][0]; currentPoint.y=popPoint.y+direction[k][1]; //如果待考察的点不在图像内,则跳过

if (currentPoint.xm_imgWidth-1|| currentPoint.ym_imgHeight-1)

continue ;

//该点标号

label=*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x); //弹出的点周围有尚没生长的点 if (label==255){ temp2=*(m_pImgData+currentPoint.y*lineByte+currentPoint.x); //如果当前被考察的像素灰度值与种子点灰度值之差小于给定的阈值, //则认为相似, 将其进栈处理 if (abs(temp1-temp2)

*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x)=0; top++;

stack[top].x=currentPoint.x;

stack[top].y=currentPoint.y;

} } } }

delete []stack;}//清除缓冲区

//分裂合并

void ImgSegment::Split(unsigned char *pImgData) { if (m_nBitCount!=8)return ; //只处理灰度图像 //释放m_pImgDataOut指向的图像数据空间 if (m_pImgDataOut!=NULL){ delete []m_pImgDataOut; m_pImgDataOut=NULL;}

if (m_lpColorTableOut!=NULL){

delete []m_lpColorTableOut;//释放颜色表空间 m_lpColorTableOut=NULL;}

m_nBitCountOut=m_nBitCount;//输出图像与输入图像为同一类型 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut);

if (m_nColorTableLengthOut!=0){//输出图像颜色表,与输入图像相同 m_lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,

sizeof (RGBQUAD)*m_nColorTableLengthOut);}

m_imgWidthOut=m_imgWidth;//输出图像的宽高, 与输入图像相等

m_imgHeightOut=m_imgHeight;

m_pImgDataOut=new unsigned char [lineByte*m_imgHeight];//申请输出图像缓冲区 int i,j;//遍历图象的横、纵坐标 int nLocalThresh[2][2] ;// 局部阈值 int nLocAvg ;// 子图象的平均值 nLocAvg = 0 ;// 对左上图像逐点扫描: for (i=0; i

nLocAvg /= ( (m_imgHeight - m_imgHeight/2) * (m_imgWidth/2) ) ;// 计算均值 nLocalThresh[1][0] = nLocAvg ;// 设置阈值为子图象的平均值

nLocalThresh[0][1] = nLocAvg ;// 设置阈值为子图象的平均值 for (j=0; j

} { } nLocAvg +=pImgData[j*lineByte + i]; // 计算均值 nLocAvg /= ( (m_imgHeight - m_imgHeight/2) * (m_imgWidth - m_imgWidth/2) ) ; // 设置阈值为子图象的平均值 nLocalThresh[1][1] = nLocAvg ; // 对右下图像逐点扫描进行分割: for (j=m_imgHeight/2; j


相关内容

  • 一种从彩色扫描图像上提取等高线的方法
  • 2011年 第4期 赵国成, 等:一种从彩色扫描图像上提取等高线的方法 文章编号:0494 0911(2011) 04 0035 03 中图分类号:P208 文献标识码:B 35 一种从彩色扫描图像上提取等高线的方法 赵国成, 孙 群, 安晓亚, 陈焕新 1 1 1 2 (1. 信息工程大学测绘学院 ...

  • 车辆检测可行性报告
  • 智能交通视频流监控系统软件可行性报告 一.总 述 1.系统基本要求 利用Visual C++ 6.0进行程序设计,主要实现以下目标: (1)通过对视频流中的车辆进行跟踪检测,统计车道流量和平均车速. (2)在视频流中锁定逆行车辆,并给出抓拍信号. (3)在视频流中确定违规停车车辆,并进行锁定,同时给 ...

  • 图像特征提取
  • 图像特征提取方法 特征提取是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征,其结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点.连续的曲线或者连续的区域. 常用的图像特征有颜色特征.纹理特征.形状特征和空间关系特征. 图1.图像特征分类及其方法 一.颜色特征 颜色特征是一种全 ...

  • 检测交通视频中运动目标的程序设计
  • 专业综合实践任务书 学生姓名:________专业班级: 指导教师: 工作单位: 信息工程学院 题 目:检测交通视频中运动目标的程序设计 初始条件: (1) 提供实验室机房及其matlab 软件: (2) 数字图像处理的基本理论学习. 要求完成的主要任务:(包括课程设计工作量及其技术要求, 以及说明 ...

  • 遥感图像中基于视觉显著性的分层目标检测
  • 第37卷第3期吉林大学学报(工学版) V01.37No.3 2007年5月 JournalofJilinUniversity(EngineeringandTechnologyEdition) May2007 遥感图像中基于视觉显著性的分层目标检测 张国敏,殷建平,祝 恩,强永刚 (国防科学技术大学计 ...

  • 基于视觉的缺陷检测概述
  • 基于视觉的缺陷检测 在机器视觉的应用中, 表面缺陷检测占据非常重要的位置, 因为其可有效地提高产品质量. 降低成本, 并可提高用户满意度. 根据表面图像的特点可以将基于视觉的缺陷检测技术分为两类:一类为不具备明显纹理特征材质的缺陷检测,如光学元件,金属类器件等:一类为纹理类材质的缺陷检测,如木材.布 ...

  • 基于MATLAB的运动物体轨迹跟踪 毕业论文
  • 摘要 视频运动目标检测与跟踪算法是计算机视觉领域的一个核心课题,也是智能视频监控系统的关键底层技术.它融合了图像处理.人工智能等领域的研究成果,已经广泛应用于安保监控.智能武器.视频会议.视频检索等各个领域.因此,检测与跟踪算法研究具有极其重要的理论意义和实用价值. 运动目标检测与跟踪涉及到计算机图 ...

  • 基于图像处理的人群行为识别方法综述_高玄
  • 总第322期2016年第8期 计算机与数字工程 Comuter&DiitalEnineerin pgggVol.44No.8 1557 基于图像处理的人群行为识别方法综述 高 玄1 刘勇奎2 汪大峰1 * ()()北方民族大学计算机科学与工程学院 银川 7大连民族学院计算机科学与工程学院 大 ...

  • 一种含有运动物体的图像拼接方法
  • http://www.paper.edu.cn 一种含有运动物体的图像拼接方法1 肖甫 吴慧中 汤杨 肖亮 南京理工大学计算机科学与技术系 南京 210094 E-mail :摘 要:图像拼接是生成全景图的关键技术之一,针对传统图像拼接方法只能处理静态图像这一问题,本文提出了一种含有运动物体的图像拼 ...