阈值法图像分割实验报告
阈值法图像分割实验报告 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,k12
4. 循环做第二步到第四步,当 TT,则结束,即可获得最佳阈值来对图像进行kk,1
分割。
4 程序设计
4.1 直方图法
算法流程如错误~书签自引用无效。所示。
统计直方确定波峰波输入图像确定阈值T二值化图像保存图谷
图4-1 直方图阈值法算法流程
统计直方图和阈值分割流程图如图4-所示。
输入图像
输入图像读信息头lpbit
读信息头lpbit获取位图数据文件首地址L
获取阈值T获取图像宽度W和高度H获取图像宽度W和高度Hi=0,j=0
i=0,j=0
Noi Noj Zhifangtu[*lpbit+i*w+j]++;Nod>T Yesj=j+1*(lpbit+i*width+j)=*(lpbit+i*width+j)=2550 i=i+1j=j+1 i=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; }