由于阈值处理直观、实现简单且计算速度快,因此图像阈值处理在图像分割中处于核心地位,下面我会为大家介绍阈值处理的方法,并用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)源图直方图
版权声明:本文为ily6418031hwm原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。