智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 7246|回复: 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
回复

使用道具 举报

0

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
433
威望
212
贡献
129
兑换币
139
注册时间
2016-3-14
在线时间
46 小时
毕业学校
中国矿业大学(北京)
26#
发表于 2016-3-18 15:57:41 | 只看该作者
点个赞
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

注册会员

Rank: 2

积分
181
威望
106
贡献
41
兑换币
29
注册时间
2016-3-12
在线时间
17 小时
毕业学校
山东科技大学
25#
发表于 2016-3-13 15:36:27 | 只看该作者
干货!!
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

高级会员

Rank: 4

积分
752
QQ
威望
379
贡献
225
兑换币
234
注册时间
2014-12-23
在线时间
74 小时
毕业学校
长春大学
24#
发表于 2016-3-10 07:43:31 | 只看该作者
赞了再说 哈哈哈
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

高级会员

Rank: 4

积分
509
威望
267
贡献
140
兑换币
168
注册时间
2015-9-10
在线时间
51 小时
毕业学校
攀枝花学院
23#
发表于 2016-1-10 11:26:32 | 只看该作者
6666666
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

注册会员

Rank: 2

积分
86
威望
45
贡献
23
兑换币
29
注册时间
2015-7-13
在线时间
9 小时
22#
发表于 2015-10-1 22:04:49 | 只看该作者
收藏一下·谢谢分享
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

注册会员

Rank: 2

积分
167
威望
83
贡献
34
兑换币
54
注册时间
2015-9-26
在线时间
25 小时
毕业学校
辽宁
21#
发表于 2015-9-26 14:41:55 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

14

主题

220

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2024
威望
1060
贡献
610
兑换币
688
注册时间
2015-8-13
在线时间
177 小时
毕业学校
中计大
20#
发表于 2015-8-31 09:23:58 | 只看该作者
虽然看不懂,但是感觉好厉害
回复 支持 反对

使用道具 举报

0

主题

356

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5251
威望
2761
贡献
1652
兑换币
1908
注册时间
2013-10-28
在线时间
419 小时
毕业学校
电大
19#
发表于 2015-8-20 09:22:22 | 只看该作者
:):):)
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

注册会员

Rank: 2

积分
125
威望
72
贡献
27
兑换币
47
注册时间
2015-5-2
在线时间
13 小时
毕业学校
南京理工大学
18#
发表于 2015-6-26 10:01:48 | 只看该作者
谢谢楼主
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 09:01 , Processed in 0.367328 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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