版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual C+ 实现数字图像的分割一、前言用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论是为了何种目的,图像处理的关键一步是对包含有大量各式各样景物信息的图像进行分解。分解的最终结果就是图像被分成一些具有各种特征的最小成分,这些成分就称为图像的基元。产生这些基元的过程就是图像分割的过程。图像分割作为图像处理领域中极为重要的内容之一,是实现图像分析与理解的基础。从概念上来说,所谓图像分割就是按照一定的原则将一幅图像或景物分为若干个部分或子集的过程。目前图像处理系统中我们只能得到二维图像信息,因此只能进行图像分割而不
2、是景物分割(景物是三维信息);图像分割也可以理解为将图像中有意义的特征区域或者需要应用的特征区域提取出来,这些特征区域可以是像素的灰度值、物体轮廓曲线、纹理特性等,也可以是空间频谱或直方图特征等。在图像中用来表示某一物体的区域,其特征都是相近或相同的,但是不同物体的区域之间,特征就会急剧变化。目前已经提出的图像分割方法很多,从分割依据的角度来看,图像的分割方法可以分为相似性分割和非连续性分割。相似性分割就是将具有同一灰度级或相同组织结构的像素聚集在一起,形成图像的不同区域;非连续性分割就是首先检测局部不连续性,然后将它们连接在一起形成边界,这些边界将图像分成不同的区域。由于不同种类的图像,不同
3、的应用场合,需要提取的图像特征是不同的,当然对应的图像特征提取方法也就不同,因此并不存在一种普遍适应的最优方法。图像分割方法又可分为结构分割方法和非结构分割方法两大类。结构分割方法是根据图像的局部区域象素的特征来实现图像分割,如阈值分割、区域生长、边缘检测、纹理分析等,这些方法假定事先知道这些区域的特性,或者在处理过程中能够求得这些特性,从而能够寻找各种形态或研究各像素群。非结构分割法包括统计模式识别、神经网络方法或其它利用景物的先验知识实现的方法等等。这些内容由于专业性很强,就不在本文讨论内容中了,有兴趣的读者可以参考图像处理的专业书籍。总之,图像分割可以分为图像的边缘提取和图像的二值化二部
4、分内容,下面我们首先来讨论一下各种常用的图像边缘提取的方法。二、图像边缘检测数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要属性,图像理解和分析的第一步往往就是边缘检测,目前它以成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。物体的边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,例如灰度值的突变、颜色的突变、纹理结构的突变等,同时物体的边缘也是不同区域的分界处。图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向的像素灰度变换剧烈,根据灰度变化的
5、特点,可分为阶跃型、房顶型和凸缘型,如图一所示,这些变化对应图像中不同的景物。需要读者注意的是,实际分析中图像要复杂的多,图像边缘的灰度变化情况并不仅限于上述标准情况。(a)阶跃型(b) 房顶型(c) 凸缘型图一 边缘灰度变换的几种类型由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。为了
6、克服一阶导数的缺点,我们定义了图像的梯度为梯度算子为 ,它是图像处理中最常用的一阶微分算法,式子中 表示图像的灰度值,图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以放映出图像边缘上的灰度变化。图像边缘提取的常用梯度算子有Robert算子、Sobel算子、Prewitt算子、Krisch算子等。下面以边缘检测Sobel算子为例来讲述数字图像处理中边缘检测的实现:对于数字图像,可以用一阶差分代替一阶微分;xf(x,y)=f(x,y)-f(x-1,y);yf(x,y)=f(x,y)-f(x,y-1);求梯度时对于平方和运算及开方运算,可以用两个分量的绝对值之和表示,即:Sobe
7、l梯度算子是先做成加权平均,再微分,然后求梯度,即:xf(x,y)= f(x-1,y+1) + 2f(x,y+1) + f(x+1,y+1)- f(x-1,y-1) - 2f(x,y-1) - f(x+1,y-1);yf(x,y)= f(x-1,y-1) + 2f(x-1,y) + f(x-1,y+1)- f(x+1,y-1) - 2f(x+1,y) - f(x+1,y+1);Gf(x,y)=|xf(x,y)|+|yf(x,y)|;上述各式中的像素之间的关系见图二 F(x-1,y-1)F(x,y-1)F(x+1,y-1)F(x-1,y)F(x,y)F(x+1,y)F(x-1,y+1)F(x,y
8、+1)F(x+1,y+1) 图二 Sober算子中各个像素点的关系图我在视图类中定义了响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数(图像数据的获取可以参见我在天极网上发表的的相关文章):void CDibView:OnMENUSobel()CClientDC pDC(this);HDC hDC=pDC.GetSafeHdc();/获取当前设备上下文的句柄;SetStretchBltMode(hDC,COLORONCOLOR);HANDLE data1handle;LPDIBHDRTMAPINFOHEADER lpDIBHdr;CDibDoc *pDoc=GetDocument
9、();HDIB hdib;unsigned char *lpDIBBits;unsigned char *data;hdib=pDoc->m_hDIB;/得到图象数据;lpDIBHdr=(LPDIBHDRTMAPINFOHEADER)GlobalLock(HGLOBAL)hdib);lpDIBBits= lpDIBHdr +* (LPDWORD)lpDIBHdr + 256*sizeof(RGBQUAD);/得到指向位图像素值的指针;data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpDIBHdr->biWidth*8)*lpDIBHdr
10、->biHeight);/申请存放处理后的像素值的缓冲区data=(unsigned char*)GlobalLock(HGLOBAL)data1handle);AfxGetApp()->BeginWaitCursor();int i,j,buf,buf1,buf2;for( j=0; jbiHeight; j+)/以下循环求(x,y)位置的灰度值for( i=0; ibiWidth; i+)if(i-1)>=0)&&(i+1)biWidth)&&(j-1)>=0)&&(j+1)biHeight)/对于图像四周边界处的向素
11、点不处理 buf1=(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1)+2*(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j) +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1);buf1=buf1-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1)-2*(int)(int)*
12、(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j)-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1);/以上是对图像进行水平(x)方向的加权微分buf2=(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1)+2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1)+(int)(int)*
13、(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1);buf2=buf2-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1)-2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1)-(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1);/以上是对图像进行垂直(y)方向加权微分buf=a
14、bs(buf1)+abs(buf2);/求梯度if(buf>255) buf=255;if(buf<0)buf=0;*(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=(BYTE)buf;else *(data+i*lpDIBHdr->biWidth+j)=(BYTE)0;for( j=0; jbiHeight; j+)for( i=0; ibiWidth; i+)*(lpDIBBits+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpDIBHdr->b
15、iWidth*8)+j); /处理后的数据写回原缓冲区StretchDIBits (hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,lpDIBBits,(LPDIBHDRTMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);上述的数学分析读者可能看起来有些吃力,不过不要紧,对与边缘检测,大家只要知道有若干个检测模板(既边缘检测矩阵)可以直接实现检测功能就行了,现在将常用的检测实现公式列出如下(检测模版可以从相应的算法很
16、容易的得到):Roberts算子:Gi,i=|fi,j-fi+1,j+1|+|fi+1,j-fi,j+1|;Sobe算子:Gi,i=|fi-1,j+1+2fi,j+1+fi+1,j+1-fi-1,j-1-2fi,j-1-fi+1,j-1|+|fi-1,j-1+2fi-1,j+fi-1,j+1-fi+1,j-1-2fi+1,j-fi+1,j+1|;其中Gi,j表示处理后(i,j)点的灰度值,fi,j表示处理前该点的灰度值。Kirsch算子实现起来相对来说稍微麻烦一些,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值
17、作为图像的边缘输出(上述算法中用到的8个模板在下面的实现代码中给出)。为了便于读者理解该算法的实现,这里我们给出实现该算法的函数代码,读者可以稍加改动应用到自己的项目中去。BOOL Kirsch(BYTE *pData,int Width,int Height)/定义实现Kirsch算法的8个模板;int i,j,s,t,k,max,sum8;static a33=+5,+5,+5,-3,0,-3,-3,-3,-3;static a133=-3,+5,+5,-3,0,+5,-3,-3,-3;static a233=-3,-3,+5,-3,0,+5,-3,-3,+5;static a333=-3
18、,-3,-3,-3,0,+5,-3,+5,+5;static a433=-3,-3,-3,-3,0,-3,+5,+5,+5;static a533=-3,-3,-3,+5,0,-3,+5,+5,-3;static a633=+5,-3,-3,+5,0,-3,+5,-3,-3;static a733=+5,+5,-3,+5,0,-3,-3,-3,-3;BYTE *pData1;if(pData=NULL)AfxMessageBox("图像数据为空,请读取图像数据!");return FALSE;pData1=(BYTE*)new charWidth*Height;if(pDa
19、ta1=NULL)AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区!");return FALSE ;memcpy(pData1,pData, Width*8*Height);/kirsch算子处理,对每一像素点求取八个方向的导数;for(i=1;i<Height-1;i+)for(j=1;j<Width-1;j+) sum1=sum2=sum3=sum4=sum5=sum6=sum7=sum8=0;for(t=-1;t<2;t+)for(s=-1;s<2;s+) sum1+=*(pData+WIDTHBYTES(Wid
20、th*8)*(i+t)+j+s)*a1+t1+s;sum2+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a11+t1+s; sum3+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a21+t1+s; sum4+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a31+t1+s; sum5+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a41+t1+s; sum6+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a51+t1+s;
21、sum7+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a61+t1+s; sum8+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a71+t1+s;/取最大方向的导数;for(k=0;k<8;k+) max=0; if(max<sumk)max=sumk;if(max<0)max=0;if(max>255)max=255;*(pData1+ Width*8*i+j)=max;memcpy(pData,pData1, Width*8*Height);delete pData1;return TRUE;另
22、外还有一种称为拉普拉斯的算子是不依赖于边缘方向的二阶微分算子,其表示式 ,对于数字图像来说拉普拉斯算子可以简单表示为:GI,j=|fi+1,j+fi-1,j+f(i,j+1)+fi,j-1-4fi,j|;它是一个标量而不是向量,具有旋转不变,既各向同性的性质,它常常用在图像处理的过程中。梯度算子和拉普拉斯算子对噪声敏感,它们都使噪声成份加强,因此在处理含有较大噪声的图像时,常常先对图像进行平滑操作,然后再进行二阶微分,这就产生了所谓的LOG(又称为Marr方法)边缘检测方法。它先用高斯函数对图像进行平滑,然后再用拉普拉斯算子进行运算。总的来说,传统的边缘检测算子的噪声平滑能力和边缘定位能力是矛
23、盾的,为了克服这个不足,正确地得到图像的边缘信息,人们提出了很多方法,如多尺度空间滤波、Facet模型检测边缘、模板匹配、Hough变换、小波变换、人工神经网络、模糊推理等算法。但这些方法绝大多数没有经典的算法精简,要么难以获得合理的计算复杂度,要么需要人为的调节各种参数,有时甚至难以实时运行。因为传统边缘的定义为图像中灰度的突变,所以这样定义边缘既失去了边缘的部分信息,又把噪声的影响包含在了边缘中。其实,边缘往往具有以下特征:1)灰度突变;2)是不同区域的边界;3)具有方向性;根据边缘的这三个特征,可以判断所关心的区域其特征是否存在差异来判断是否存在边缘的可能性。如果特征没有差异,则认为是平
24、滑区;如果特征有差异,则判断为边缘点。算法的具体实现步骤如下:1) 设置四个3x3模板如图三所示,显而易见,四个模板分别按0、45、90、135以(x,y)点为中心将3x3的区域分成两个部分,按照这四个模板分别对图像中的每一像素点进行卷积求和操作。2)对图像中每一像素点求的四个结果求绝对值,将每个结果分别与一个阈值比较,如果其中任意一结果大于或等于阈值T,则该模板的中心点所对应的图像像素点的灰度值为255,否则为0。 图三 边缘提取模板对于有噪声的图像,由于噪声是随机分布的,因此不论(x,y)是有效边界点还是处于平坦区域内部,沿边缘方向划分的两个区域R1和R2的噪声分布和噪声强度,在
25、概率上相同。从四个模板的结构可以看出,噪声的影响基本上被相应的抵消,不会对边缘提取产生太大的影响,因此该算法具有较好的抗噪能力,克服了传统的边界提取仅考虑灰度突变的情况的局限。经实验证明该方法有较强的抗噪声性能。为了更好的对比各种算法进行边缘检测的效果,我们对一幅汽车图像进行了处理,下图中的a、b、c、d是分别通过LOG算子、Sober算子、Kirsch算子和使用上述算法检测得到的边缘。(a) 原始图像(b)LOG算子(c) Sober算子(d) Kirsch算子(e) 模板检测法 图四 图像的边缘检测从上面的处理后的效果图来说,只有最后一种算法处理后肉眼看不出有噪声点,所以从去噪和
26、提取边缘的综合效果来看,我们上述介绍的模板检测算法还是比较另人满意的。三、图像的二值化所谓二值图像,就是指图像上的所有点的灰度值只用两种可能,不为"0"就为"255",也就是整个图像呈现出明显的黑白效果。为了得到理想的二值图像,一般采用阈值分割技术,它对物体与背景有较强对比的图像的分割特别有效,它计算简单而且总能用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阈值的像素被判决为属于物体,灰度值用"255"表示,否则这些像素点被排除在物体区域以外,灰度值为"0",表示背景。这样一来物体的边界就成为这样一些内部的
27、点的集合,这些点都至少有一个邻点不属于该物体。如果感兴趣的物体在内部有均匀一致的灰度值,并且其处在一个具有另外一个灰度值的均匀背景下,使用阈值法可以得到比较好的效果。如果物体同背景的差别不在灰度值上(比如纹理不同),可以将这个性质转换为灰度的差别,然后利用阈值化技术来分割该图像。为了使分割更加鲁棒,适用性更强,系统应该可以自动选择阈值。基于物体、环境和应用域等知识的图像分割算法比基于固定阈值的算法更具有普遍性和适应性。这些知识包括:对应于物体的图像灰度特性、物体的尺寸、物体在图像中所占的比例、图像中不同类型物体的数量等。其中图像直方图就是一种灰度特性,通常被用来作为分割图像的工具。阈值分割法分
28、为全局阈值法和局部阈值分割法。所谓局部阈值分割法是将原始图像划分成较小的图像,并对每个子图像选取相应的阈值。在阈值分割后,相邻子图像之间的边界处可能产生灰度级的不连续性,因此需用平滑技术进行排除。局部阈值法常用的方法有灰度差直方图法、微分直方图法。局部阈值分割法虽然能改善分割效果,但存在几个缺点:(1)每幅子图像的尺寸不能太小,否则统计出的结果无意义。(2)每幅图像的分割是任意的,如果有一幅子图像正好落在目标区域或背景区域,而根据统计结果对其进行分割,也许会产生更差的结果。(3)局部阈值法对每一幅子图像都要进行统计,速度慢,难以适应实时性的要求。全局阈值分割方法在图像处理中应用比较多,它在整幅
29、图像内采用固定的阈值分割图像。经典的阈值选取以灰度直方图为处理对象。根据阈值选择方法的不同,可以分为模态方法、迭代式阈值选择等方法。这些方法都是以图像的直方图为研究对象来确定分割的阈值的。另外还有类间方差阈值分割法、二维最大熵分割法、模糊阈值分割法、共生矩阵分割法、区域生长法等等。对于比较简单的图像,可以假定物体和背景分别处于不同的灰度级,图像被零均值高斯噪声污染,所以图像的灰度分布曲线近似认为是由两个正态分布函数( )和( )叠加而成,图像的直方图将会出现两个分离的峰值,如图五所示。对于这样的图像,分割阈值可以选择直方图的两个波峰间的波谷所对应的灰度值作为分割的阈值。这种分割方法不可避免的会
30、出现误分割,使一部分本属于背景的像素被判决为物体,属于物体的一部分像素同样会被误认为是背景。可以证明,当物体的尺寸和背景相等时,这样选择阈值可以使误分概率达到最小。在大多数情况下,由于图像的直方图在波谷附近的像素很稀疏,因此这种方法对图像的分割影响不大。这一方法可以推广到具有不同灰度均值的多物体图像。 图五 双峰直方图迭代式阈值选择算法是对上一种方法的改进,它首先选择一个近似阈值T,将图像分割成两部分 和 ,计算区域 和 的均值 和 ,选择新的分割阈值T=( )/2,重复上述步骤直到 和不再变化为止。后来"熵"的概念被引入了图像处理技术,人们提出了许多基于熵的阈值
31、分割法。1980年,Pun提出了最大后验熵上限法,1985年,Kapur等人提出了一维最大熵阈值法,1989年Arutaleb将一维最大熵阈值法与Kirby等人的二维阈值方法相结合,提出了二维熵阈值法。对于一维最大熵分割方法,它的思想是统计图像中每一个灰度级出现的概率 ,计算该灰度级的熵 ,假设以灰度级T分割图像,图像中低于T灰度级的像素点构成目标物体(O),高于灰度级T的像素点构成背景(B),那么各个灰度级在本区的分布概率为:O区: i=1,2,t B区: i=t+1,t+2L-1 上式中的 ,这样对于数字图像中的目标和背景区域的熵分别为: 对图像中的每一个灰度级分别求取w= ,选取使w最大
32、的灰度级作为分割图像的阈值,这就是一维最大熵阈值图像分割法。我们定义了一个函数GetMaxHtoThrod()来实现该算法,它的返回值就是用来分割图像的阈值。int GetMaxHtoThrod(BYTE *pData,int Width,int Height)int i,j,t;float p256,a1,a2,num256,max,pt;if(pData=NULL)AfxMessageBox("图像数据为空,请读取图像数据!");return -1;/初始化数组p;for(i=0;i<256;i+)pi=0.0f;/统计各个灰度级出现的次数;for(i=0;i&l
33、t;Height;i+)for(j=0;j<Width;j+)p*(pData+ Width*8)*i+j+;/统计各个灰度级出现的概率;for(j=0;j<256;j+)pj=pj/(Width*Height);/对每一个灰度级进行比较;for(i=0;i<256;i+)a1=a2=0.0f;pt=0.0f;for(j=0;j<=i;j+)pt+=pj;for(j=0;j<=i;j+)a1+=(float)pj/pt*logf(pj/pt);for(j=i+1;j<256;j+)a2+=(float)pj/(1-pt)*logf(pj/(1-pt);numi=a1+a2;max=0.0f;/找到使类的熵最大的灰度
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《板带材生产概述》课件
- 《电子交易》课件
- DBJT 13-302-2018 现浇混凝土空心楼盖应用技术规程
- 第18课 从九一八事变到西安事变(解析版)
- 名著之魅 解析与启示
- 体育场馆卫生消毒流程
- 肿瘤科护士年终总结
- 2023-2024年项目部安全管理人员安全培训考试题答案典型题汇编
- 2023年-2024年生产经营单位安全教育培训试题答案往年题考
- 外贸公司实习报告合集九篇
- 水电风电项目审批核准流程课件
- 足球教练员素质和角色
- 初中八年级语文课件 桃花源记【省一等奖】
- 名校长工作总结汇报
- 商务接待礼仪流程
- 护理不良事件用药错误讲课
- 新教材人教版高中英语选择性必修第一册全册教学设计
- 2024北京大兴区初三(上)期末化学试卷及答案
- 媒体与新闻法律法规法律意识与职业素养
- 推土机-推土机构造与原理
- 九年级化学课程纲要
评论
0/150
提交评论