阈值法图像分割实验报告阈值法图像分割实验报告 1 实验目的图像分割阈值法具有实现容易、计算量小、性能稳定等优点。
因此这种方法成为图像分割领域中应用最普遍的方法。
本文主要讨论了基于直方图法的图像分割的设计与实现,并与迭代法进行了对比实验。
2 实验环境Microsoft VC++6.0软件平台,32位Windows XP操作系统。
3 实验原理基础3.1 直方图法直方图阈值法其阈值主要通过分析图像的灰度直方图来进行确定。
假定一幅图像如图3-1所示,其中背景是灰色,物体为灰白色的,背景中的黑色像素产生了直fxy(,)方图的左锋,而物体的各灰度级产生了直方图的右峰。
由于物体边界像素数相对而言较少,从而产生两峰之间的谷,选择谷对应的灰度值作为阈值T,利用式3.1,可以得到一幅二值图像gxy(,),用于后续处理和分析。
0,(,)fxyT,, (3.1) g(,)xy,,255,(,)fxyT,,背景部分物体部分0255阈值T图3-1 利用直方图选择二值化阈值3.2 迭代法(用于对比试验)迭代法也是一种在图像分割过程中选择合适阈值的方法。
它是基于逼近的思想通过阈值迭代的方式利用程序自动计算出比较合适的分割阈值。
迭代法指在初始条件中假设一个阈值,而通过对图像的迭代运算来不断地更新这一假设阈值来得到最佳阈值。
迭代法阈值分割主要算法:RR,minmax1( 求出图像最小灰度值和最大灰度值计算初始阈值为T,RRminmax022( 根据阈值将图像分割成目标和背景两部分,求出两部分的平均灰度值RijNij(,)(,),RijNij(,)(,),,,RijT(,),RijT(,),kkR,R,0GNij(,)Nij(,),,RijT(,),RijT(,),kk为图像上点的灰度值,为点的权重系数,一般为Rij(,)(,)ijNij(,)(,)ijNij(,)的个数 T 为阈值 Rij(,)RR,0G3. 重新选择阈值,新的阈值定义为 TTT,k,1k,1,k124. 循环做第二步到第四步,当 TT,则结束,即可获得最佳阈值来对图像进行kk,1分割。
4 程序设计4.1 直方图法算法流程如错误~书签自引用无效。
所示。
统计直方确定波峰波输入图像确定阈值T二值化图像保存图谷图4-1 直方图阈值法算法流程统计直方图和阈值分割流程图如图4-所示。
输入图像输入图像读信息头lpbit读信息头lpbit获取位图数据文件首地址L获取阈值T获取图像宽度W和高度H获取图像宽度W和高度Hi=0,j=0i=0,j=0Noi<WNoi<WYesYesj=0j=0Noj<HNoj<HYesYesZhifangtu[*lpbit+i*w+j]++;Nod>TYesj=j+1*(lpbit+i*width+j)=*(lpbit+i*width+j)=2550i=i+1j=j+1i=i+1结束结束(a)统计直方图 (b)阈值分割图4-2 程序设计流程图4.2 关键程序语段unsigned i,j; // 循环变量unsigned char pixel; // 像素值long lHistogram[256]; // 直方图数组LONG lLineBytes; // 图像每行的字节数//获得直方图for (i = 0;i < 256 ;i++)//初始化数组lHistogram[i]=0;lLineBytes = WIDTHBYTES(width * 8);// 计算图像每行的字节数for (i = 0;i < width ;i++){for(j = 0;j < height ;j++){// 指向源图像倒数第j行,第i个象素的指针pixel = *(buf+lLineBytes * j + i);lHistogram[pixel]++;}}//初始化阈值unsigned char yuzhi=0;//创建阈值选择对话框CFENGE dlg1;dlg1.m_Yuzhi=0;//在对话框里输出说明文字CString ss;ss.Format("如果峰值较多,建议用迭代法");dlg1.m_ShuChu+=ss;// 显示对话框,提示用户输入阈值for (i = 0; i <256; i++)dlg1.m_fIntensity[i] = (float)lHistogram[i]; if (dlg1.DoModal() != IDOK){return; // 返回}yuzhi=(unsigned char)dlg1.m_Yuzhi;delete dlg1;// 删除对话框//根据阈值将图像二值化for ( i = 0;i < width ;i++){for(j = 0;j < height ;j++){pixel = *(buf+lLineBytes * j + i);if(pixel<= yuzhi){*(buf+lLineBytes * j + i)=(unsigned char)0; }else{*(buf+lLineBytes * j + i)=(unsigned char)255;}}}5 实验结果5.1程序界面运行程序生成可执行程序文件TT.exe,文件操作界面如图5-1所示。
图5-1 程序运行界面程序可读取、处理和保存8位灰度图像,并可对8位灰度图像进行图像分割操作,用户界面设计较人性化。
5.2示例1对所示的目标图像进行阈值分割处理,结果如图5-2所示。
(a) 目标图像 (b) 直方图统计结果图5-2 图像分割直方图由图中可以看出,图像有很多峰,这样给我们选取峰谷确定阈值带来了一定的困难,下面我们将通过试探的方法,研究直方图法的优缺点分别选择不同阈值参数,对图5-3(a)所示的图像进行图像分割,结果如下图所示。
其中(a)~(e)为直方图法的处理结果,而(f)为迭代法的处理结果,用于对比直方图法选取阈值的合理性。
(a)阈值T=30 (b)阈值T=50(c)阈值T=60 (d)阈值T=80(e)阈值T=100 (f)迭代法,阈值T=87图5-3 不同阈值的图像分割效果图中(f)图为迭代法的结果,阈值为87,可以看出处理结果较理想,而其他阈值则不太理想,因为峰值太多,给阈值选取带来了很大困难。
5.2示例2图像上半部分做了反色处理,这样可以更好地测试图像分割的目的性和作用。
(a)目标图像 (b)直方图统计图图5-4直方图统计(a)阈值T=50 (b)阈值T=100(c)阈值T=120 (d)迭代法,阈值T=128图5-5 不同阈值的图像分割效果从图中可以看出,这个示例的峰值相对较少,可以较好的选择阈值,以便于更好地分割图像,提取目标,可以看出处理后的图片比原始图片更加容易辨认目标,基本上达到了目的。
6 结论6.1 算法性能分析由实验结果可以看出,阈值法图像分割中迭代法的处理结果比较理想,可以作为一个很好的参考,对于直方图阈值法来说,虽然操作简单方便,但有以下缺点:1. 不适合处理峰值较多,灰度级分布较密的图像。
2. 无法获得最优阈值,因此无法获得最佳结果。
6.2 总结通过光学图像处理课程的学习,我们对数字图像的来源,显示,处理等过程有了初步了解。
对光学系统的成像过程,数字图像的传输,编码,复原,分割,压缩等理论知识和关键技术有了较系统的掌握,并能够得以初步应用。
通过这一段时间的图像处理实践过程,我们对BMP格式图像的数据结构有了更深入的了解,能够灵活运用C++编程语言对BMP图像进行读写,存储以及一些简单处理等操作,对阈值法图像分割操作体会尤深。
总之,光学图像处理课程的开设对我们的学习,科研等有较大帮助,虽然研究内容与之相关甚微,但老师在课程中提出的研究问题的思想与方法让我们受益匪浅。
7 附录//迭代求最佳阈值iNewThreshold = (iMin + iMax)/2;iThreshold = 0;for(iIterationTimes = 0; iThreshold != iNewThreshold &&iIterationTimes < 200;iIterationTimes ++){iThreshold = iNewThreshold;lP1 =0;lP2 =0;lS1 = 0;lS2 = 0;//求两个区域的灰度平均值for (i = iMin;i < iThreshold;i++) {lP1 += lHistogram[i]*i;lS1 += lHistogram[i];}iMean1 =(unsigned char)(lP1 / lS1); for (i = iThreshold+1;i < iMax;i++) {lP2 += lHistogram[i]*i;lS2 += lHistogram[i];}iMean2 = (unsigned char)(lP2 / lS2); iNewThreshold = (iMean1 + iMean2)/2; }。