由于阈值处理直观、实现简单且计算速度快,因此图像阈值处理在图像分割中处于核心地位,下面我会为大家介绍阈值处理的方法,并用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)源图直方图