常驻嘉宾
- 积分
- 3787
- 威望
- 1857
- 贡献
- 918
- 兑换币
- 704
- 注册时间
- 2012-3-12
- 在线时间
- 506 小时
|
2#
楼主 |
发表于 2013-4-6 15:07:56
|
只看该作者
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/
uchar nList[256]={0};
uchar otsu(uchar *pSrc)
{
uchar j=0,tr=0,num=0,cnt=0;
uint i=0;
int avfor=0,avback=0;
uint cnts=0;
u32 total=0,total_low=0,total_high=0,g=0,max=0;
//清空直方图
for(i=0;i<256;i++)
{
nList=0;
}
//计算直方图
for(j=0;j<128;j++)
{
num=*(pSrc+j); //获取灰度值
//nList[num]++; //直方图统计图像所有像素点
nList[num]+=1;
total+=num; //total计算图像的灰度值总和
}
for(i=0;i<256;i++)
{
cnt=nList; //当前灰度值的计数数量
if(cnt==0) continue;
total_low+=cnt*i; 计算灰度值从0到当前值的像素点灰度值的总和
cnts+=cnt; //计算灰度值从0到当前值的像素点数目的总和
if(cnts==128)
{
break; //统计完所有像素点,之后的灰度值已经没有任何像素点符合,计算完毕,退出
}
total_high=total-total_low; //背景灰度=灰度总和-前景灰度(还没有归一化)
avfor=(int)(total_low/cnts); //前景归一化
avback=(int)(total_high/(128-cnts)); //背景归一化
g=(avback-avfor)*(avback-avfor)*(cnts*128-cnts*cnts)/(128*128) ; //计算方差
if(max<g)
{
max=g;
tr=i; //方差最大的灰度值即为大津阈值
}
// if(i==80)
// i=80;
}
return tr;
}
|
|