用最大方差阈值法获取灰度图像的最佳阈值
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 }
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; }