智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 7163|回复: 25
打印 上一主题 下一主题

摄像头直方图阈值算法揭秘--DEMOk

  [复制链接]

140

主题

1016

帖子

2

精华

功勋会员

智能车八届元老!武汉岱默科技创始人!

Rank: 10Rank: 10Rank: 10

积分
32723

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
4239
贡献
25778
兑换币
1456
注册时间
2009-12-9
在线时间
1353 小时
跳转到指定楼层
1#
发表于 2014-9-18 17:23:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 DEMOK 于 2014-9-18 18:59 编辑




我去年做过一届摄像头,其中对于摄像头阈值的确定方法不断变化,最终采用了直方图二值化,这种动态阈值的适应性很好,我们之后就没有再调过阈值了。
我们采用的岱默公司的OV7620摄像头,摄像头数据隔行采集完毕之后存放于数组Pix_Data1[40][320],这就是一帧图像。

  
需要定义的变量很多,看起来有点恐怖呃!不着急且听我慢慢道来。。。。。。

  
unsigned char   Num[256]={0};
//该数组用来统计一幅图像每个灰度值的点数,注释:灰度值0-255,比如Num[68]=50就是灰度值是68的像素点有50

  
unsigned char   *p_Bz;//用于指示某行首地址的指针
  
int                   p1;//普通变量  
  
unsigned char   Thr=100;//随便给阈值一个初始值
  
unsigned int    total;

  float           TotalWeight=0,ForeWeight = 0;
  float           TotalPixels = 0; //进行统计的点数和
float           sb;
  
float           fmax1=-1 ;
  
unsigned int    BackNum=0;//当前阈值遍前景图象的点数
  
unsigned int    ForeNum=0;/当前阈值遍后景图象的点数
  
float           BackAvg;//后景的平均灰度值


float           ForeAvg;//前景的平均灰度值


  1.统计所选行(二值化为了节约时间只选了几行,不过够用了)中的各灰度值的数目

   for(i=13;i<23;i=i+2)   //这里选择第13-23奇数行,一行320的像素点,  
  {
       p_Bz=&ix_Data1[0][0] + i *320;  // p_Bz这个不用猜了,就是每一行的首地址
      
       for (j = 0; j < 320; j+=2 )  //为了节约时间也是两个像素统计一个
       {
           Num[*(p_Bz + j)]++;      // p_Bz + j)为每个像素的具体地址*p_Bz + j)为灰度值
       }
  }
  Num[256]统计完毕哈哈!

2Num[256]平滑滤波处理,基本思路是:
比如Num[0]Num[1]Num[2]Num[3]Num[4]灰度值0,1,2,3,4的像素点的个数
Num[2]=Num[0]+Num[1]+Num[2]+Num[3]+Num[4]/5
然后每个点都是与他前后2个数一起平均作为最终值

     上代码了!!!
    for (i = 0;i<256;i++)      //0到第255个灰度值之间的每一个数值
  {
       total = 0;
      
       for(j = -2;j<3;j++) //某灰度值对应的个数为改灰度值上下2个(共5个)的平均值
       {
            p1=i+j;
            
            if(p1<0)                  //越界处理
              p1=0;                                
            if(p1>255)
              p1=255;             //越界处理
            
            total+=Num[p1];
        }
        Num=total/5;                                         
  }

3.数学计算,有点复杂!!;P
  for (i= 0; i< 256; i++)
  {
       TotalWeight += i * Num;  
// 质量矩,也就是每个灰度的值乘以其点数(归一化后为概率),TotalWeight为其总和

       TotalPixels +=Num;      
//256个灰度值对应的像素点的总和 total为图象总的点数,归一化后就是累积概率
  }

4.假定将某灰度值作为阈值,小于该灰度值的称为前景,大于该灰度值的称为后景,从0-255一个个试探,计算假定灰度得出的值,比较大小,取最小的。

  for (i= 0; i< 256; i++)  //
  {
      ForeNum += Num;        //ForePixNum为在当前阈值遍前景图象的点数
      
      if (ForeNum == 0)//0作为阈值虽然肯定不对但都要给机会嘛!!!;P
        continue;                       
      
      BackNum =(int) (TotalPixels - ForeNum);  //BackPixNum为背景图象的点数   
        
      if (BackNum == 0)
        break;               
//BackPixNum0表示全部都是前景图象,与ForePixNum=0情况类似,之后的遍历不可能使前景点数增加,所以此时可以退出循环
      ForeWeight += i*Num;              //前景图像质量矩  
        
      ForeAvg = (float)(ForeWeight/ForeNum);//  
//前景对应灰度值*前景对应个数 /前景总个数 =前景平均灰度值  

      BackAvg = (float)(TotalWeight - ForeWeight)/BackNum;
//后景图像平均灰度
sb = (float)(ForeNum * BackNum * (ForeAvg- BackAvg) * (ForeAvg- BackAvg));
最后就是求一个x0(0~255)使得上述公式取得最大值,可以理解成方差最大时阈值上下的灰度值相对于阈值整体靠的更远,界限更加分明。差不多就是蓝布和赛道灰度值中间的数值。if (sb > fmax1)       //////方差 {                   ///////取方差最大时候对应的灰度值为阈值fmax1 = sb;Thr = i;      ///////for循环的作用就是取256个灰度值中方差最大时候对应的灰度值为阈值  }    }   
CCDGateVoltage=Thr;
//终于得到阈值了,好辛苦啊!!!!!!!!
有黄色标记的地方都是公式,无奈显示不了。直接上Word!!!!!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
2#
发表于 2014-9-18 18:24:02 | 只看该作者
点个赞、、
回复 支持 反对

使用道具 举报

17

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1668
威望
863
贡献
459
兑换币
545
注册时间
2014-3-2
在线时间
173 小时
3#
发表于 2014-9-18 19:23:20 | 只看该作者
点个赞
回复 支持 反对

使用道具 举报

3

主题

196

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5523
QQ
威望
2247
贡献
1614
兑换币
1507
注册时间
2013-5-23
在线时间
831 小时
4#
发表于 2014-9-18 19:41:33 | 只看该作者
顶。。。
回复 支持 反对

使用道具 举报

34

主题

452

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
14046

优秀会员奖章活跃会员奖章在线王奖章

威望
6066
贡献
2554
兑换币
4050
注册时间
2013-7-29
在线时间
2713 小时
毕业学校
南京气象学院
5#
发表于 2014-9-18 22:32:56 | 只看该作者
点个赞再保存!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
51
威望
25
贡献
20
兑换币
14
注册时间
2014-9-18
在线时间
3 小时
毕业学校
西南交通
6#
发表于 2014-9-18 22:33:29 | 只看该作者
点个赞
回复 支持 反对

使用道具 举报

56

主题

1240

帖子

4

精华

跨届大侠

https://github.com/howborn

Rank: 10Rank: 10Rank: 10

积分
7954

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章论坛骨干奖章

QQ
威望
3025
贡献
1997
兑换币
2249
注册时间
2013-2-26
在线时间
1466 小时
7#
发表于 2014-9-19 08:01:15 | 只看该作者
回复 支持 反对

使用道具 举报

28

主题

2228

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
15817

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章资源大师奖章

QQ
威望
7430
贡献
4213
兑换币
5193
注册时间
2013-12-9
在线时间
2087 小时
8#
发表于 2014-9-19 19:13:22 | 只看该作者
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1519
威望
747
贡献
488
兑换币
466
注册时间
2013-11-1
在线时间
142 小时
毕业学校
在校学生
9#
发表于 2014-9-22 20:24:41 | 只看该作者
mark
回复 支持 反对

使用道具 举报

12

主题

180

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2113
威望
998
贡献
651
兑换币
639
注册时间
2014-5-25
在线时间
232 小时
毕业学校
湖北科技学院
10#
发表于 2014-9-22 22:47:13 | 只看该作者
点个赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 18:46 , Processed in 0.388722 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表