常驻嘉宾
- 积分
- 3787
- 威望
- 1857
- 贡献
- 918
- 兑换币
- 704
- 注册时间
- 2012-3-12
- 在线时间
- 506 小时
|
/*以下是CCD图像的算法*/
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/
uchar nList[256]={0};
uchar otsu(uchar *pSrc)
{
uchar j=0,tr=0,num=0,cnt=0;
uint i=0;
u32 avfor=0,avback=0; //u32 long int
uint cnts=0;
u32 total=0,total_low=0,total_high=0,g=0,max=0;
//清空直方图
for(i=0;i<256;i++)
{
nList[i]=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[i];//当前灰度值的计数数量
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;
}
这个是没错误的 |
|