当前位置:文档之家› 图像分割实验报告

图像分割实验报告

图像分割实验报告一、实验目的1. 掌握图像分割的基本思想,了解其分割技术及其计算策略;2. 学会从图像处理到分析的关键步骤,掌握图像分割过程;3. 了解图像分割的意义,进一步加深对图像分析和理解;4. 掌握基本分割方法:迭代分割和OTSU图像分割,并编程实现。

二、实验原理(一)迭代阈值分割选取的基本思路是:首先根据图像中物体的灰度分布情况,选取一个近似阈值作为初始阈值,一个较好的方法就是将图像的灰度均值作为初始阈值,然后通过分割图像和修改阈值的迭代过程获得认可的最佳阈值。

迭代式阈值选取过程可描述如下:1. 计算初始化阈值g0=(g max+g min);22. 根据g0,将图像分为两部分,分别计算灰度值期望,取其平均值为g1;3. 如此反复迭代,当|g n-g n−1|足够小时,停止迭代,取T=g n即为最终阈值。

(二)OTSU图像分割(最大类间方差法)是一种自适应的阈值确定的方法,是按图像的灰度特性,将图像分成背景和目标两部分。

背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大, 当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。

因此,使类间方差最大的分割意味着错分概率最小。

以最佳门限将图像灰度直方图分割成两部分,使两部分类间方差取最大值,即分离性最大。

OTSU阈值选取过程可描述如下:1.记T为目标与背景的分割阈值,目标点数占图像比例为w1,平均灰度为u1;背景点数占图像比例为w2,平均灰度为u1;2.图像的总平均灰度为:u=w1*u1+w2*u2;3.目标和背景图象的方差:g=w1*(u1-u)*(u1-u)+w1*(u2-u)*(u2-u)=w1*w2*(u1-u2)*(u1-u2);4.当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度T是最佳阈值。

二、实验内容1. 利用C++编程实现迭代阈值图像分割算法;2. 利用C++编程实现OTSU动态阈值图像分割算法。

三、实验框图四、实验结果与分析图1原图图2迭代图像分割图3OTSU图像分割实验分析:由图2可知:迭代所得的阈值分割的图象效果良好,能区分出图像的目标和背景的主要区域,但在图像的细微处还没有很好的区分度。

部分区域微小数据的变化(如机翼五角星标识下方)引起分割效果的明显改变,目标和背景的数据只是稍有变化但分割效果却反差极大。

由图3可得:对于直方图双峰不明显或图像目标和背景比例差异悬殊迭代法所选取的阈值不如最大类间方差法(OTSU)(差异不是很大,很细微)。

但是对于直方图双峰明显谷底较深的图像迭代分割可以较快地获得满意结果。

五、实验程序段(具体见实验框架)1.迭代图像分割:void CImageProcessingDoc::Onimagediedaifenge(){// TODO: Add your command handler code hereint m_Width, m_Height, m_SaveWidth;int i,j,k,T,Tmp;double ForegroundSum=0,BackgroundSum=0,u1,u2,min=255,max=0;m_Width = m_pDibInit->GetWidth();m_Height = m_pDibInit->GetHeight();m_SaveWidth = m_pDibInit->GetSaveWidth();int m,iForeground=0,iBackground=0;for(j=0;j<m_Height;j++)for(i=0;i<m_Width;i++){if ((m_pDibInit->m_pDibBits[j*m_SaveWidth + i])>=max)max=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];//求最大灰度值if ((m_pDibInit->m_pDibBits[j*m_SaveWidth + i])<=min)min=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];//求最小灰度值}T=int((max+min)/2);//T为迭代初始阈值for(k=0;k<255;k++){for(j=0;j<m_Height;j++){for(i=0;i<m_Width;i++){m=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];if(m>=T){iForeground=iForeground+1;ForegroundSum=ForegroundSum+double(m);}else{iBackground=iBackground+1;BackgroundSum=BackgroundSum+double(m);}}//根据阈值对图像目标和背景分类}u1=ForegroundSum/iForeground;u2=BackgroundSum/iBackground;Tmp=int((u1+u2)/2); //新的迭代阈值if(Tmp==T)break; //迭代结束,分割阈值为TmpelseT=Tmp;}CString msg;msg.Format("分割阈值T=%d",T);AfxMessageBox(msg);for(j=0;j<m_Height;j++){for(i=0;i<m_Width;i++){if (m_pDibInit->m_pDibBits[j*m_SaveWidth + i]>=T)m_pDibInit->m_pDibBits[j*m_SaveWidth + i]=255;elsem_pDibInit->m_pDibBits[j*m_SaveWidth + i]=0;}}UpdateAllViews(NULL);}2.OTSU图像分割:void CImageProcessingDoc::OnimageOTSU(){// TODO: Add your command handler code hereint m_Width, m_Height, m_SaveWidth;m_Width = m_pDibInit->GetWidth();m_Height = m_pDibInit->GetHeight();m_SaveWidth = m_pDibInit->GetSaveWidth();int i,j,k;double ForegroundSum[256]={0},BackgroundSum[256]={0},u1[256]={0},u2[256]={0};double w1[256]={0},w2[256]={0},iForeground[256]={0},iBackground[256]={0};double Tmp=0.0,u,T1=0.0,sum=0;int m,min=255,max=0,T=0;for(j=0;j<m_Height;j++){for(i=0;i<m_Width;i++){if ((m_pDibInit->m_pDibBits[j*m_SaveWidth + i])>=max)max=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];//求最大灰度值if ((m_pDibInit->m_pDibBits[j*m_SaveWidth + i])<=min)min=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];//求最小灰度值}}for(k=min;k<=max;k++)//遍历图像中所有灰度值{for(j=0;j<m_Height;j++){for(i=0;i<m_Width;i++){m=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];if(m>k){iForeground[k]=iForeground[k]+1; //目标点数ForegroundSum[k]=ForegroundSum[k]+m; //目标区域灰度值之和}else{iBackground[k]=iBackground[k]+1; //背景点数BackgroundSum[k]=BackgroundSum[k]+m;//背景区域灰度值之和}}}w1[k]=double(iForeground[k]/(m_Width*m_Height));//目标点数占图像比例w2[k]=double(iBackground[k]/(m_Width*m_Height));//背景点数占图像比例u1[k]=double(ForegroundSum[k]/iForeground[k]); //目标区域平均灰度u2[k]=double(BackgroundSum[k]/iBackground[k]); //背景区域平均灰度u=w1[k]*u1[k]+w2[k]*u2[k];//图像总平均灰度Tmp=w1[k]*(u1[k]-u)*(u1[k]-u)+w2[k]*(u2[k]-u)*(u2[k]-u);if(Tmp>=T1){T1=Tmp;T=k;//求出最大Tmp,找出最佳阈值T}}CString msg;msg.Format("最佳阈值T=%d",T);AfxMessageBox(msg);for(j=0;j<m_Height;j++){for(i=0;i<m_Width;i++){if (m_pDibInit->m_pDibBits[j*m_SaveWidth + i]>=T)m_pDibInit->m_pDibBits[j*m_SaveWidth + i]=255;elsem_pDibInit->m_pDibBits[j*m_SaveWidth + i]=0;}}UpdateAllViews(NULL);}。

相关主题