用最大方差阈值法获取灰度图像的最佳阈值

1.获取灰度图像的直方图

 1 /*********************************************************************************
 2 * 函数名称: APP_CameraCalibration_GetHistogram
 3 * 功能描述: 获取灰度图像的直方图
 4 * 函数参数: p_img_buff: 图像数据地址
 5                 len:图像数据长度
 6                 p_histogram:直方图数据地址,大小为gray_level
 7                 gray_level:图像灰度等级
 8 * 函数返回  TRUE,获取成功,FALSE,获取失败
 9 * 创建日期:
10 * 作    者: 
11 **********************************************************************************
12 */
13 BOOL APP_CameraCalibration_GetHistogram(u8 *p_img_buff,s32 len,s32 *p_histogram,s32 gray_level)
14 {
15     s32 i;
16 
17     if(!p_img_buff||!p_histogram||!len||!gray_level)
18     {
19         return FALSE;
20     }
21     memset(p_histogram,0,gray_level*sizeof(s32));
22 
23     for(i=0;i<len;i++)
24     {
25                if(*(p_img_buff+i) > gray_level -1)
26               {
27                  return FALSE;
28               }
29          p_histogram[*(p_img_buff+i)]++;
30     }
31     return TRUE;
32 }
View Code

 2.用最大方差阈值法获取图像的最佳阈值

/*********************************************************************************
* 函数名称: APP_CameraCalibration_GetMaxVarianceThreshold
* 功能描述: 用最大方差阈值法获取图像的最佳阈值,以便后续将图像分割
* 函数参数:  p_histogram:直方图地址
                  gray_level:灰度等级   
                 p_threshold:输出阈值
函数返回:    TRUE,获取成功,FALSE,获取失败
* 创建日期: 
* 作    者: 
**********************************************************************************
*/
BOOL APP_CameraCalibration_GetMaxVarianceThreshold(s32 const * const p_histogram,s32 gray_level,s32 *p_threshold)
{
    //公式为δ²(T) = w0*w1*(μ1 - μ0)²,阈值T在1到gray_level-1之间变化,δ²(T)最大时即为所求
    //其中δ²(T)为方差,w0 为第0组概率,w1为第1组概率,μ0是第0组平均值,μ1是第1组平均值
    fp32 w0,Pi,w1,u0,u1,dt,max_dt;
    s32 T,i,max_pix;

    max_pix = 0;//总像素个数
    for(i=0;i<gray_level;i++)
    {
        max_pix += p_histogram[i];//把每个灰度级上的像素累积起来,就得到了总像素个数,也是图像大小
    }

    max_dt = 0.0;
    *p_threshold = 0;
    for(T=1;T<gray_level;T++)
    {
        //计算累积频率w0和w1
        w0 = 0.0;
        for(i=0;i<T-1;i++)
        {
            Pi = (fp32)((p_histogram[i]*1.0)/max_pix); //在灰度级i上,像素出现的频率
            w0 += Pi;//计算累积频率

        }
        //CAL_VTCOM_Log(E_SysLogType_Debug," w0:%f\n",w0);
        w1 = 1 - w0;
        //平均值
        u0 = 0.0;
        u1 = 0.0;
        for(i=0;i<T-1;i++)
        {
            Pi = (fp32)((p_histogram[i]*1.0)/max_pix); //在灰度级i上,像素出现的频率

            u0 += (i*Pi)/w0;
        }

        for(i=T;i<gray_level;i++)
        {
            Pi = (fp32)((p_histogram[i]*1.0)/max_pix); //在灰度级i上,像素出现的频率
            u1 += (i*Pi)/w1;
        }

        dt = w0*w1*(u1-u0)*(u1-u0);
        if(dt>max_dt)
        {
            max_dt = dt;
            *p_threshold = T;
        }
    }
    return TRUE;
}
View Code

猜你喜欢

转载自www.cnblogs.com/xuyu-blogs/p/9900786.html