图像分割-阈值分割
一、阈值分割
阈值分割原理:
一副图像包括目标、背景和噪声,设定某一阈值T将图像分成两部分:大于T的像素群和小于T的像素群。
在实际处理时候,为了显示需要一般用255表示背景,用0表示对象物。
由于实际得到的图像目标和背景之间不一定单纯地分布在两个灰度范围内,此时就需要两个或以上的阈值来提取目标。
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。难点在于如何选择一个合适的阈值实现较好的分割。
1.最大方差阈值
最大方差阈值的基本思想是:把直方图在某一阈值处分割成两组,当被分成的的两组之间方差最大时,决定阈值。
设图像的灰度值为0~m-1级,灰度值i的像素数为ni,此时我们得到像素总数:
然后用T将其分成两组C0={0~T-1},C1={T~m-1},各组的概率如下
平均值为:
两组间的方差用下式求出:
从1~m-1之间改变T,求上式为最大时的T,Tmax即为我们需要的阈值。所以上式称为阈值选择函数。
算法实现:
View Code
1 /*********************************************************************** 2 * 函数名称: 3 * threshOtus() 4 * 5 *函数参数: 6 * int histArray[256] -图像的统计直方图 7 * 8 * 返回值: 9 * 最佳阈值 10 * 11 *说明:大津阈值选择函数,给定直方图数组,根据方差最大原理自动选择阈值, 12 * 对于彩色图像,该函数根据亮度直方图计算阈值 13 ***********************************************************************/ 14 int ImgSegment::threshOtus(int histArray[256]) 15 { 16 //c0和c1组的均值 17 float u0,u1; 18 19 //c0和c1组产生的概率 20 float w0,w1; 21 22 //c0组的像素数 23 int count0; 24 25 //阈值t及记录方差最大时的最佳阈值maxT 26 int t, maxT; 27 28 //方差及最大方差 29 float devi, maxDevi=0; 30 31 //循环变量 32 int i; 33 34 //统计直方图中像素的个数,存放在sum中 35 int sum=0; 36 for(i=0;i<256;i++) 37 sum = sum+histArray[i]; 38 39 for(t=0;t<255;t++){ 40 //计算阈值为t时,c0组的均值和产生的概率 41 u0=0; 42 count0=0; 43 for(i=0; i<=t;i++){ 44 u0 += i*histArray[i]; 45 count0 += histArray[i]; 46 } 47 u0=u0/count0; 48 w0=(float)count0/sum; 49 50 //计算阈值为t时,c1组的均值和产生的概率 51 u1=0; 52 for(i=t+1; i<256;i++) 53 u1+=i*histArray[i]; 54 //C0组像素数与C1组像素数之和为图像总像素数。 55 u1=u1/(sum-count0); 56 w1=1-w0; 57 58 //两组间的方差 59 devi=w0*w1*(u1-u0)*(u1-u0); 60 61 //记录最大的方差及最佳阈值位置 62 if(devi>maxDevi){ 63 maxDevi=devi; 64 maxT=t; 65 } 66 67 } 68 69 //返回最佳阈值 70 return maxT; 71 72 }
然后,基于上面的阈值对图像进行二值化处理,即可得到结果。
posted on 2012-07-22 11:40 NotValid 阅读(10967) 评论(1) 编辑 收藏 举报