收藏 分享(赏)

图象分割处理.doc

上传人:weiwoduzun 文档编号:2418370 上传时间:2018-09-15 格式:DOC 页数:44 大小:3.85MB
下载 相关 举报
图象分割处理.doc_第1页
第1页 / 共44页
图象分割处理.doc_第2页
第2页 / 共44页
图象分割处理.doc_第3页
第3页 / 共44页
图象分割处理.doc_第4页
第4页 / 共44页
图象分割处理.doc_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、132第 7 章 图像分割及测量本章要点: 图像阈值分割 目标物体的轮廓提取 模板匹配 图像的测量71 概述数字图像处理的目的之一是图像识别,图像分割与测量是图像识别工作的基础。图像分割将图像分为一些有意义的区域,然后可以对这些区域进行描述,相当于提取出某些目标区域图像的特征,判断图像中是否有感兴趣的目标。图像分割的基础是像素间的相似性和跳变性。所谓“相似性”是指在某个区域内像素具有某种相似的特性,如灰度一样,纹理相同;所谓“跳变性”是指特性不连续,如灰度值突变等。从总体上说,图像分割就是把图像分成若干有意义的区域的处理技术。这些区域互不交迭,每一个区域内部的某种特性或特征相同或接近,而不同区

2、域间的图像特征则有明显差别,即同一区域内部特性变化平缓,相对一致,而区域边界处则特性变化比较剧烈。区域内是一个所有像素都有相邻或相接触像素的集合,是像素的连通集。在一个连通集中任意两个像素之间,都存在一条完全由这个集合的元素构成的连通路径。连通路径是一条可在相邻像素间移动的路径。所以,在一个连通集中,你可以跟踪在任意两个像素间的连通路径而不离开这个集合。图像分割的度量准则不是唯一的,它与应用场景图像及应用目的有关,用于图像分割的场景图像特征信息有亮度、色彩、纹理、结构、温度、频谱、运动、形状、位置、梯度和模型等。由于图像的多义性和复杂性,许多分割的工作无法依靠计算机自动完成,而手工分割又存在工

3、作量大,定位不准确的难题,因此,人们提出了一些人工交互和计算机自动定位相结合的方法,利用各自的优势,实现目标轮廓的快速定位。图像分割的方法有多种,依据工作对像来分,可分为点相关分割和区域相关分割;按算法分类,可分为阀值法,界限检测法,匹配法,跟踪法等。近年来出现了一些新的算法和设想。如先使用经典的边缘检测算子对图像做初步的边缘检测,然后再利用边缘之间空间结构关系来协调,增强初始检测结果。经典的边缘检测方法是构造对像素灰度级阶跃变化敏感的微分算子,一些能有效抑制噪声的边缘提取算法通过首先对原图像进行平滑,再进行边缘检测能较成功的检测出真正的边缘。在第六章介绍了各种边缘检测的方法,边缘检测器的输出

4、一般都为灰度图像,称边缘图像,该图像包含有边缘幅值信息。如果边缘检测器输出值较大,则对应于局部边缘;如果输出值较小,则对应于无边缘的区域。在边缘检测之后,找出目标物体的轮廓,进行目标物体的分析、识别、测量等。这些内容在数字图像处理应用中,如跟踪、制导等方面扮演重要角色,有着广泛的用途。本章介绍了图像分割的基本方法、轮廓提取的方法、目标区的标识、面积测量和周长测量。72 图像阈值分割阈值处理是一种区域分割技术,将灰度根据主观愿望分成两个或多个等间隔或不等间隔灰度区间,它主要是利用图像中要提取的目标物体和背景在灰度上的差异,选择一个合133适的阈值,通过判断图像中的每一个像素点的特征属性是否满足阈

5、值的要求来确定图像中该像素点属于目标区还是应该属于背景区域,从而产生二值图像,它对物体与背景有较强对比景物的分割特别有用。它计算简单,而且总能用封闭而且连通的边界定义不交叠的区域。在使用阈值法进行分割技术时,阈值的选取成为能否正确分割的关键,若将所有灰度值大于或等于某阈值的像素都被判属于物体,则将所有灰度值小于该阈值的像素被排除在物体之外,如果阈值选取的过高,则过多的目标区域将被划分为背景,相反如果阈值选取的过低,则过多的背景将被划分到目标区。因此,边界就由这样一些内部点的集合组成,这些点都至少有一个邻点不属于该物体。由于物体和背景以及不同物体之间的灰度级有明显的差别,因此,在图像的灰度级直方

6、图中会呈现明显的峰值。当图像灰度直方图峰型分布明显时,常以谷底作为门限候选值。所以只要适当地选择阈值,即可对图像进行分割,因而成为一种简单而广泛应用的方法。本节介绍选择合适的阈值方法有: 直方图门限选择 半阈值选择图像分割 迭代阈值图像分割7.2.1 直方图门限选择1理论基础阈值 T 可通过分析边缘检测输出的直方图来确定。假设,一幅图像只有物体和背景两部分组成,其灰度级直方图成明显的双峰值,如图 7-1。在此情况下,选取双峰间的谷底处的灰度值 T 作为阈值,即可将物体和背景很好地分割开。阈值分割法可用数学表达式来描述。设图像为 f(i,j) ,其灰度级范围为z1,z2,设 T 为阈值,是 z1

7、 和 z2 内任一值,可得一幅二值图像,其数学表达式为f(i,j)0 T 255图 7-1 双峰灰度级直方图255 如果 f(i,j )T (7-1)f(i,j)=0 如果 f(i,j)GetWidth ();height=this-GetHeight ();int width= (wide*24) + 31) / 32 * 4) ;BYTE* p_temp1=new BYTEwide*height+1024; /新图像缓冲区/拷贝原图像到缓存图像memcpy(p_temp1,m_pData,wide*height );/ 对各像素进行灰度统计for (i = 0; i GetWidth();

8、/ DIB 的高度LONG height = this-GetHeight();/ 迭代阀值int T1, T2;T1 = 127;T2 = 0;/ 临时变量int Temp0, Temp1, Temp2, Temp3;Temp0 = Temp1 = Temp2 = Temp3 = 0;while (true)/ 计算下一个迭代阀值for (i = 0; i GetData();p_data=lpSrc;wide=this-GetWidth ();height=this-GetHeight ();for(j=0;j128)*p_data=255;else*p_data=0; p_data+;

9、p_data=lpSrc; LPBYTE temp=new BYTEwide*height; /新图像缓冲区/初始化新分配的内存为 255memset( temp,255,sizeof( temp);for(j=1;j127)*lpSrc=255;else*lpSrc=0;/ 暂时分配内存,以保存新图像temp = new BYTEwide*height;/ 初始化新分配的内存,设定初始值为 255lpDst = temp;memset(lpDst, (BYTE)255, wide * height); /先找到最左上方的边界点FindStartPoint = false;for (j = 0

10、;j GetData (); /取得原图的数据区指针wide=this-GetWidth (); /取得原图的数据区宽度height=this-GetHeight (); /取得原图的数据区高度p_temp=new BYTEwide*height;/开辟一个临时内存区memset(p_temp,255,wide*height);/从左到右标号for(int j=1;jheight-1;j+) / 每行for(int i=1;iwide-1;i+) / 每列if(*(p_data+(height-j-1)*wide+i)=0)/若当前点为黑点if(*(p_data+(height-j-1+1)*

11、wide+i+1)=0)/右上154*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+i+1);x_temp=*(p_temp+(height-j-1+1)*wide+i+1);flagx_temp+=1;if(*(p_data+(height-j-1)*wide+i-1)=0for(int m=1;m=height-1;m+)for(int n=1;n=wide-1;n+)if(*(p_temp+(height-m-1)*wide+n)=y_temp)flagy_temp=0;*(p_temp+(height-m-1)*wi

12、de+n)=x_temp;flagx_temp+=1;/end/左前if(*(p_data+(height-j-1+1)*wide+i-1)=0for(int m=1;m=height-1;m+)for(int n=1;n=wide-1;n+)if(*(p_temp+(height-m-1)*wide+n)=y_temp)flagy_temp=0;*(p_temp+(height-m-1)*wide+n)=x_temp;flagx_temp+=1;/end/左上elseif(*(p_data+(height-j-1+1)*wide+i)=0)/正上*(p_temp+(height-j-1)*w

13、ide+i)=*(p_temp+(height-j-1+1)*wide+i);x_temp=*(p_temp+(height-j-1+1)*wide+i);flagx_temp+=1;else if(*(p_data+(height-j-1+1)*wide+i-1)=0)/左上*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+i-1);155x_temp=*(p_temp+(height-j-1+1)*wide+i-1);flagx_temp+=1;else if(*(p_data+(height-j-1)*wide+i-1)

14、=0)/左前*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1)*wide+i-1);x_temp=*(p_temp+(height-j-1)*wide+i-1);flagx_temp+=1;else/没有+x_sign;m_temp=x_sign;*(p_temp+(height-j-1)*wide+i)=m_temp;flagm_temp=1;/end if/end for4效果图156(a)原图 (b)对物体加标记图图 7-18 二值图像区域标记从上图 7-18 可知,不同的物体标记不同,由于在判断连通性时,对已标记的物体标号进行了改动,

15、导致物体的标号不连续。当然可以想办法使标号连续,但这不是本书的重点,不做介绍,以免算法混淆。在图(b)上,每一个物体的像素值就是该物体的标号,为计算面积和周长打下基础。7.4.2 二值图像的区域面积测量1. 理论基础在二值图像 f 中,相互连接的黑像素的集合成为一个 (黑)区域。在上一节的基础上,通过对图像 f 内每个像素进行标记操作,将物体的像素值改为标号,求各种标号的总和,即求得不同区域的面积数目。2 .实现步骤(1)调用标记统计函数,对图像进行标记,划分成不同的连通区域。(2)循环取得各点像素值,像素值就是标号。(3)根据不同的标号,加到对应的数组。(4)弹出对话框,输出各个连通区域的面

16、积(像素个数) 。3 .编程代码/*函数名称:LianTong() *函数类型:void *功能:对连通区调整,输出每个连通区的面积。 */void JisuanProcessDib:LianTong()biaoji(); /调用标记函数int fg255=0;/定义一个数组memset(fg,0,255);/初始化赋值都为 0int y_sign=0;int m_Area=0;/定义一个面积for(int i=1;i=x_sign;i+)157if(flagi!=0)if(fgy_sign=0)fgy_sign=flagi;+y_sign;m_Area+=flagi;SquareDlg dl

17、g;/输出对话框dlg.m_number=y_sign;/输出连通区域个数dlg.m_squareALL=m_Area;/输出连通区域的总积CString ss20;/在对话框里输出每个连通区的面积(区域像素个数)for(i=0;iy_sign;i+)ssi.Format(“连通区: %3d 该区面积:%10.0d“,i+1,fgi);dlg.m_ShuChu+=ssi;dlg.DoModal();4效果图图 7-19 面积测量效果图7.4.3 二值图像的周长测量1. 理论基础在二值图形 f 中,相互连接的黑像素的集合成为一个 (黑)区域。在上一节二值图像区域标记的基础上,通过对图像 f 内每

18、个像素进行标记操作,将物体的像素值改为标号,再采用边界跟踪法,跟踪各封闭区域边界线(轮廓线) 的每个黑像素的标号,记录二值图像物体边界的坐标值序列。边界线跟踪采用左手和搜索法,它是将白区域视为平面,黑区域视为建筑物,然后一边让左手接触建筑物的壁面一边前进,最后返回出发点的一种跟踪方法。输出黑区域边界的环数。1582. 实现步骤(1)调用 biaoji()函数,对图像进行标记 ,划分成不同的连通区域。(2) )根据不同的像素值,即不同的连通区,循环取得各点像素值的标号,搜索出一个发点,利用 7.3.2 节介绍的边界跟踪法,采用 Lunkuogenzong()函数,找到出发点后,记录其坐标,再跟踪

19、下一像素。保留循环得到的边界点,其余都置 255(白点) 。(3)根据不同的像素值,即不同的连通区,依次执行第 2 步。(4)把缓冲区的数据返回到原数据区。(5)调整连通边界区,计算每个连通边界区的周长(像素个数) 。(6)弹出对话框,输出各个边界连通区域的像素个数。3. 编程代码/*函数名称:Borderline() *函数类型:void *功能:对每个连通区进行边界跟踪,提取边界,输出周长。 */void JisuanProcessDib:Borderline()biaoji(); /调用标记函数LPBYTE lpSrc; / 指向源图像的指针LPBYTE lpDst; / 指向缓存图像的

20、指针LPBYTE temp; / 指向缓存 DIB 图像的指针long pixel; /像素值bool bFindStartPoint; /是否找到起始点及回到起始点bool bFindPoint; /是否扫描到一个边界点Point StartPoint,CurrentPoint; /起始边界点与当前边界点/八个方向和起始扫描方向int Direction82=-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0;int BeginDirect;temp = new BYTEwide*height; / 暂时分配内存,以保存新图像lpDst = temp; / 初始化新分

21、配的内存,设定初始值为 255memset(lpDst, (BYTE)255, wide * height);/先找到最左上方的边界点for(int t=1;t=x_sign;t+) / x_sign 为物体的标识总数if(flagt!=0)bFindStartPoint = false;for (int j = 0;j height j+)for(int i = 0;i wide i+)/ 指向源图像倒数第 j 行,第 i 个像素的指针lpSrc = (LPBYTE)(p_temp + wide * j + i);159/取得当前指针处的像素值,注意要转换为 unsigned char 型p

22、ixel = *lpSrc;if(pixel =t)bFindStartPoint = true;StartPoint.Height = j;StartPoint.Width = i;/ 指向目标图像倒数第 j 行,第 i 个像素的指针lpDst = (LPBYTE)(temp + wide * j + i);*lpDst = t;/由于起始点是在左下方,故起始扫描沿左上方向BeginDirect = 0;/跟踪边界bFindStartPoint = false;/从初始点开始扫描CurrentPoint.Height = StartPoint.Height;CurrentPoint.Widt

23、h = StartPoint.Width;while(!bFindStartPoint)bFindPoint = false;while(!bFindPoint)/沿扫描方向查看一个像素lpSrc = (LPBYTE)(p_temp + wide * ( CurrentPoint.Height + DirectionBeginDirect1)+ (CurrentPoint.Width + DirectionBeginDirect0);pixel = *lpSrc;if(pixel = t)bFindPoint = true;CurrentPoint.Height = CurrentPoint.

24、Height + DirectionBeginDirect1;CurrentPoint.Width = CurrentPoint.Width + DirectionBeginDirect0;if(CurrentPoint.Height = StartPoint.HeightlpDst = (LPBYTE)(temp + wide * CurrentPoint.Height+ CurrentPoint.Width);*lpDst = t;/扫描的方向逆时针旋转两格BeginDirect-;160if(BeginDirect = -1)BeginDirect = 7;BeginDirect-;if

25、(BeginDirect = -1)BeginDirect = 7;else/扫描方向顺时针旋转一格BeginDirect+;if(BeginDirect = 8)BeginDirect = 0; /endwhile(!bFindPoint) /endwhile(!bFindStartPoint) /endif(flagt!=0) /endfor(int t=1;t=x_sign;t+)memcpy(p_data, temp, wide * height);/ 复制到原数据区delete temp; / 释放内存int x_line=0;int fm255=0;/定义一个数组memset(fm

26、,0,255);/初始化赋值都为 0/统计每个边界的像素个数for(int j=0;jheight;j+)for(int i=0;iwide;i+)if(*(p_data+(height-j-1)*wide+i)!=0)x_line=*(p_data+(height-j-1)*wide+i);+fmx_line;int fn255=0;/定义一个数组memset(fn,0,255);/初始化赋值都为 0int y_line=0;int m_line=0;/定义一个总面积for(int i=0;ix_line;i+)if(fmi!=0)if(fny_line=0)fny_line=fmi;+y_line;161m_line+=fmi;LINEDLG dlg;/输出对话框dlg.m_shumu=y_line;/输出连通区域个数dlg.m_zongshu=m_line;/输出连通区域的总积CString ss20;/在对话框里输出每个连通区的周长(边界像素个数)for(i=0;iy_line;i+)ssi.Format(“连通区: %3d 该区周长:%10.0d“,i+1,fni);dlg.m_line+=ssi;dlg.DoModal();4效果图图 7-20 周长计算效果图综合二值图像物体的标识及测量如图 7-21 所示。(a)原图 (b)对不同区域体标识图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报