现在的位置: 首页 > 综合 > 正文

图像阈值分割—基本的全局阈值

2013年12月02日 ⁄ 综合 ⁄ 共 1327字 ⁄ 字号 评论关闭

       由于阈值处理直观、实现简单且计算速度快,因此图像阈值处理在图像分割中处于核心地位,下面我会为大家介绍阈值处理的方法,并用OpenCV给出实现的代码。

第一种:图像阈值分割---基本的全局阈值

1.  处理流程:

             1.为全局阈值选择一个初始估计值T(图像的平均灰度)。
             2.用T分割图像。产生两组像素:G1有灰度值大于T的像素组成,G2有小于等于T像素组成。
             3.计算G1和G2像素的平均灰度值m1和m2;
             4.计算一个新的阈值:T = (m1 + m2) / 2;
             5.重复步骤2和4,直到连续迭代中的T值间的差为零。

             此种方法主要适用于图像直方图有明显波谷。

2.源代码:      

/******************************************************************************* 
函数名称  : BasicGlobalThreshold 
函数描述  : 图像阈值分割---基本的全局阈值(适合图像直方图有明显波谷)
输入参数  : N/A
输出参数  : N/A
返 回 值    : int k1---------------------------------迭代得到的阈值
作     者    : N/A    2013-01-22
处理流程:1.为全局阈值选择一个初始估计值T(图像的平均灰度)。
          2.用T分割图像。产生两组像素:G1有灰度值大于T的像素组成,G2有小于等于T像素组成。
          3.计算G1和G2像素的平均灰度值m1和m2;
          4.计算一个新的阈值:T = (m1 + m2) / 2;
          5.重复步骤2和4,直到连续迭代中的T值间的差为零。
*******************************************************************************/ 
 int CThreasholdProcess::BasicGlobalThreshold(int*pg,int start,int end)
 {
	 int  i,t,t1,t2,k1,k2;
	 double u,u1,u2;    
	 t=0;     
	 u=0;

	 for (i=start;i<end;i++) 
	 {
		 t+=pg[i];        
		 u+=i*pg[i];
	 }

	 k2=(int) (u/t);                          //  计算此范围灰度的平均值    
	 do 
	 {
		 k1=k2;
		 t1=0;    
		 u1=0;
		 for (i=start;i<=k1;i++) 
		 {             //  计算低灰度组的累加和
			 t1+=pg[i];    
			 u1+=i*pg[i];
		 }

		 t2=t-t1;
		 u2=u-u1;
		 if (t1) 
			 u1=u1/t1;                     //  计算低灰度组的平均值
		 else 
			 u1=0;
		 if (t2) 
			 u2=u2/t2;                     //  计算高灰度组的平均值
		 else 
			 u2=0;
		 k2=(int) ((u1+u2)/2);                 //  得到新的阈值估计值
	 }while(k1!=k2);                           //  数据未稳定,继续

	 return k1;                              //  返回阈值
 }

3.演示结果

a).被处理的源图像                                                                                                                         b).基本的全局阈值处理后图像                                                                      c)源图直方图

  

           

抱歉!评论已关闭.