智能车制作

标题: 大津动态阈值适用于线性CCD吗? [打印本页]

作者: bobo_12300    时间: 2013-4-6 15:05
标题: 大津动态阈值适用于线性CCD吗?
今天又试了一下大津法~~但是计算出的阈值还是很跳跃~~
以下是我的代码~我感觉没什么问题啊,怎么在线性CCD上效果不行呢。。。。还有一组摄像头的就是用的大津法,效果很好啊~~郁闷了~~这个问题困扰已久啊,大家来讨论讨论啊

作者: bobo_12300    时间: 2013-4-6 15:07
/*大津法二值化,浮动阈值
函数入口: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;
}

作者: zyj    时间: 2013-4-6 20:49
本帖最后由 zyj 于 2013-4-6 21:04 编辑

收~大津好像是最大类间方差么。是不是同一个东西啊
作者: bobo_12300    时间: 2013-4-6 21:07
zyj 发表于 2013-4-6 20:49
收~大津好像是最大类间方差么。是不是同一个东西啊

嗯~是同一个东西,这个程序是对的,只是有点小小的错误,下午调了下,可以用
作者: zyj    时间: 2013-4-6 21:15
本帖最后由 zyj 于 2013-4-6 21:17 编辑
bobo_12300 发表于 2013-4-6 21:07
嗯~是同一个东西,这个程序是对的,只是有点小小的错误,下午调了下,可以用

什么错误啊==效果怎样,多少时间

作者: 十七岁不哭    时间: 2013-4-6 22:04
我们试了一下原始的大津法时间太长,中断容易溢出,后来改了一下有效果但不明显,白天可以跑下来了,后来换了场地不分白天晚上光照强度都均匀不变,就改成静态阈值了
作者: bobo_12300    时间: 2013-4-6 22:53
十七岁不哭 发表于 2013-4-6 22:04
我们试了一下原始的大津法时间太长,中断容易溢出,后来改了一下有效果但不明显,白天可以跑下来了,后来换 ...

不要用浮点型,时间不长,不到1ms
作者: bobo_12300    时间: 2013-4-7 10:32
zyj 发表于 2013-4-6 21:15
什么错误啊==效果怎样,多少时间

一个变量的类型要改一下,时间之前测的是6、700us的样子好像,效果还行啊

作者: zyj    时间: 2013-4-7 11:48
bobo_12300 发表于 2013-4-7 10:32
一个变量的类型要改一下,时间之前测的是6、700us的样子好像,效果还行啊

时间没加串口发送的吧
作者: bobo_12300    时间: 2013-4-7 12:45
zyj 发表于 2013-4-7 11:48
时间没加串口发送的吧

没加~串口发送放在主函数的循环中了~
作者: hg31461    时间: 2013-4-9 17:14
bobo_12300 发表于 2013-4-6 21:07
嗯~是同一个东西,这个程序是对的,只是有点小小的错误,下午调了下,可以用

我怎么用不了啊,这个算法我用到1MS中断里面,不知道时间够不够?总之就是加了之后图像数据无法采集了
作者: 曾经や云迹、    时间: 2013-4-9 17:26
敢问楼主这大津法在哪里找的,还有哪些好的算法,谢谢了:'(:'(
作者: bobo_12300    时间: 2013-4-9 20:15
hg31461 发表于 2013-4-9 17:14
我怎么用不了啊,这个算法我用到1MS中断里面,不知道时间够不够?总之就是加了之后图像数据无法采集了

我用72M,时间是200us
作者: bobo_12300    时间: 2013-4-9 20:16
曾经や云迹、 发表于 2013-4-9 17:26
敢问楼主这大津法在哪里找的,还有哪些好的算法,谢谢了

额~自己写的
作者: 技术宅_维    时间: 2013-4-18 20:16
请问u32是什么类型?哪个变量要改?芯片主频40M行不行?
作者: bobo_12300    时间: 2013-4-18 22:15
技术宅_维 发表于 2013-4-18 20:16
请问u32是什么类型?哪个变量要改?芯片主频40M行不行?

u32是long int  40M可以的
作者: 技术宅_维    时间: 2013-4-18 23:58
bobo_12300 发表于 2013-4-18 22:15
u32是long int  40M可以的

谢谢哦~~

作者: 一枕清风    时间: 2013-4-20 21:53
cnt=nList;   这句有问题。。。楼主
作者: 圣徒    时间: 2013-4-21 00:05
高手啊学习了

作者: bobo_12300    时间: 2013-4-21 23:34
一枕清风 发表于 2013-4-20 21:53
cnt=nList;   这句有问题。。。楼主

怎么呢?
作者: 二百五    时间: 2013-4-22 15:50
楼主  现在你用的大动态津阈值效果怎么样    除了大津  还有 迭代和双峰   效果一样吗?

作者: bobo_12300    时间: 2013-4-22 17:31
二百五 发表于 2013-4-22 15:50
楼主  现在你用的大动态津阈值效果怎么样    除了大津  还有 迭代和双峰   效果一样吗?

大津我不知道为什么看远了就不行了~我现在没有二值化了,直接进行边缘检测了

作者: 飞云雨季    时间: 2013-5-18 21:34
bobo_12300 发表于 2013-4-6 15:07
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/

请问楼主:
cnt=nList; 这一句与 cnt=nList;   是同等意思吧。
c语言不太好。。。



补充内容 (2013-5-22 09:47):
cnt=nList【i】;
作者: zangfan    时间: 2013-5-18 22:52
借用
作者: 天狼星10000    时间: 2013-5-27 19:55
请问你是改了哪个变量的类型??
作者: zhyyy    时间: 2013-5-29 11:08
bobo_12300 发表于 2013-4-7 10:32
一个变量的类型要改一下,时间之前测的是6、700us的样子好像,效果还行啊

能问下中断里程序执行时间是怎么测量的吗

作者: zhyyy    时间: 2013-5-29 11:13
zyj 发表于 2013-4-7 11:48
时间没加串口发送的吧

用串口发送130个数据,先发个0xaa,在发128个数据,再发0xbb,为啥只收到了0xaa,三个128数据中的数据,0xbb.剩下还有那么多的数据跑哪去了

作者: 冬日暖阳style°    时间: 2013-5-29 21:50
bobo_12300 发表于 2013-4-22 17:31
大津我不知道为什么看远了就不行了~我现在没有二值化了,直接进行边缘检测了

边沿检测用的阈值吗?从中间向两边扫,跳变不是特别明显,LZ怎么解决的

作者: 最好不相误    时间: 2013-5-31 18:54
请问楼主改了哪个?为什么我用上没结果啊?
作者: 2011飞飞飞    时间: 2013-6-1 01:38
内容阿
作者: dsgthlr    时间: 2013-6-1 01:47
我用了这程序输出的阈值都好接近最大像素点的值,基本上就是最大的像素点了。好像没什么效果
作者: 2011飞飞飞    时间: 2013-6-1 09:18
顶。我也是不会呀!!!
作者: bobo_12300    时间: 2013-6-2 09:48
dsgthlr 发表于 2013-6-1 01:47
我用了这程序输出的阈值都好接近最大像素点的值,基本上就是最大的像素点了。好像没什么效果

这个程序没问题~~测试过的,只是有个变量的数据类型不对

作者: bobo_12300    时间: 2013-6-2 09:51
/*以下是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;
}


这个是没错误的
作者: dsgthlr    时间: 2013-6-3 22:05
bobo_12300 发表于 2013-6-2 09:48
这个程序没问题~~测试过的,只是有个变量的数据类型不对

{:soso_e113:}嗯嗯  有个地方我写错了 。确实可以

作者: 登高使者    时间: 2013-6-7 15:07
bobo_12300 发表于 2013-4-6 15:07
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/

楼主你好!这个算法直接用在摄像头上可以的么??

作者: 登高使者    时间: 2013-6-7 15:08
dsgthlr 发表于 2013-6-3 22:05
嗯嗯  有个地方我写错了 。确实可以

你好!请问你是用在线性ccd,还是摄像头上呢?
作者: dsgthlr    时间: 2013-6-7 18:17
登高使者 发表于 2013-6-7 15:08
你好!请问你是用在线性ccd,还是摄像头上呢?

线性CCD

作者: 登高使者    时间: 2013-6-7 18:20
dsgthlr 发表于 2013-6-7 18:17
线性CCD

线性ccd为什么还要用这个算法呢?你们不是只有一行数据的吗?

作者: dsgthlr    时间: 2013-6-8 09:45
登高使者 发表于 2013-6-7 18:20
线性ccd为什么还要用这个算法呢?你们不是只有一行数据的吗?

看了楼主说可以就拿来用用看。。你有其他算法?

作者: 登高使者    时间: 2013-6-8 10:54
dsgthlr 发表于 2013-6-8 09:45
看了楼主说可以就拿来用用看。。你有其他算法?

我只是用其他的动态阈值,效果不是很好!不知道你们这个算法怎么样呢?我苦闷呢!

作者: zyh無_煙_無_尘    时间: 2013-7-1 01:20
bobo_12300 发表于 2013-4-6 15:07
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/

    total_high=total-total_low;          //背景灰度=灰度总和-前景灰度(还没有归一化)
        avfor=(int)(total_low/cnts);             //前景归一化
        avback=(int)(total_high/(128-cnts));          //背景归一化  


求教这几句的作用   total_lowde 值在何处改变了?

作者: 褚建平    时间: 2013-7-1 09:29
谢谢楼主

作者: bobo_12300    时间: 2013-7-3 00:22
zyh無_煙_無_尘 发表于 2013-7-1 01:20
total_high=total-total_low;          //背景灰度=灰度总和-前景灰度(还没有归一化)
        avfor ...

total_low+=cnt*i;          计算灰度值从0到当前值的像素点灰度值的总和

作者: 小盐巴    时间: 2013-7-3 09:36
楼主这个运算量少了很多 原始的是256*256 能在详细讲下你现在计算量是多少吗
作者: 小盐巴    时间: 2013-7-3 09:37
楼主这个运算量少了很多 原始的是256*256 能在详细讲下你现在计算量是多少吗
作者: qq1399    时间: 2013-7-13 15:56
二值化以后不稳怎么办?
作者: zhang_zp/v    时间: 2013-11-10 19:11
bobo_12300 发表于 2013-6-2 09:51
/*以下是CCD图像的算法*/

/*大津法二值化,浮动阈值

你好,请问你遇到过在上位机显示的二值化之后的图像很不稳定吗? 就是黑白跳动很快

作者: 风起时想你    时间: 2013-11-17 13:01
我的程序参考你的代码,设定的大于这个阈值 发0,最后串口里全部是 0 ,怎么回事? 你用的什么上位机,能看到实时的动态阈值。
作者: killer1    时间: 2013-11-20 19:54
风起时想你 发表于 2013-11-17 13:01
我的程序参考你的代码,设定的大于这个阈值 发0,最后串口里全部是 0 ,怎么回事? 你用的什么上位机,能看 ...

这个是边缘检测

作者: wpgulang    时间: 2014-1-10 14:24
楼主,可以加一个QQ吗?新手一枚,求大神指导一下。我QQ905014539
作者: 小布的梦    时间: 2014-1-10 22:59
貌似看不懂撒 哎
学习啦
作者: 锦州彪哥    时间: 2014-3-12 21:38
bobo_12300 发表于 2013-4-6 21:07
嗯~是同一个东西,这个程序是对的,只是有点小小的错误,下午调了下,可以用

我也用了这个方法,但计算时间好长啊,200多MS怎么回事吗


作者: bobo_12300    时间: 2014-3-18 00:14
锦州彪哥 发表于 2014-3-12 21:38
我也用了这个方法,但计算时间好长啊,200多MS怎么回事吗

半年多没上论坛了,忙考研了。200ms?时间不会那么长的

作者: 零度的亲吻    时间: 2014-3-18 21:42
其实和求128个平均值,再二值化的效果是一样的
作者: 无线电——    时间: 2014-3-22 10:44

作者: rain发发    时间: 2014-3-30 16:43
bobo_12300 发表于 2013-6-2 09:48
这个程序没问题~~测试过的,只是有个变量的数据类型不对

同情况,请问是哪个变量的数据类型不对。
作者: bobo_12300    时间: 2014-3-30 17:35
rain发发 发表于 2014-3-30 16:43
同情况,请问是哪个变量的数据类型不对。

这个真心记不清了~~~当时试了一下就没用了,都快一年了

作者: 仰望→辉煌    时间: 2014-3-31 22:34
不好意思,我是新手,问一下前景和背景是什么是如何确定的?谢谢了!
作者: 669475795    时间: 2014-4-5 16:53
bobo_12300 发表于 2013-4-6 15:07
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/

你有求取图像直方图,大津发的资料没,有的话发我学习下,谢谢。

作者: 554605956    时间: 2014-4-7 10:27
bobo_12300 发表于 2013-6-2 09:51
/*以下是CCD图像的算法*/

/*大津法二值化,浮动阈值

256 是什么意思啊?
作者: chenxiaokai    时间: 2014-4-17 13:27
程序有点小错误,nlist应该加i吧,不能直接等于ctns
作者: NK100    时间: 2014-5-16 19:11
狂赞
作者: 夜雨寒    时间: 2014-5-17 00:02
bobo_12300 发表于 2013-4-6 15:07
/*大津法二值化,浮动阈值
函数入口:CCD采集数据数组首地址
函数出口:二值化的浮动阈值*/

敢问楼主用大津法,当图像全黑或全白时,是不是会提出很多跳变沿啊?你们是怎么处理的啊?
作者: 杨希睿    时间: 2014-5-23 16:58
pSrc什么意思,
   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到当前值的像素点数目的总和
楼主能不能详细解释一下这段程序,有点迷糊,万分感谢
作者: hcl857256004    时间: 2014-6-1 16:37
程序有一行是错的吧?

作者: 小海海    时间: 2014-6-1 21:18
本人感觉大津法不适用于CCD,过大湾的时候会有大的跳变!
作者: 小小梦想    时间: 2014-9-1 04:33
  mark
作者: 10100    时间: 2015-7-12 01:15
bobo_12300 发表于 2013-4-22 17:31
大津我不知道为什么看远了就不行了~我现在没有二值化了,直接进行边缘检测了

你的边缘检测算法是差分值吧...是的话,感觉也是很受阈值的影响, 我是中向两边扫,判断为白-—>跳变->黑这样的
你也是这样吗,感觉阈值到了边缘提不出,边缘在边界比较模糊的时候啊,有什么好的办法吗?

作者: 颩。。。    时间: 2016-4-17 08:54
666666收了
作者: 颩。。。    时间: 2016-4-17 09:10
@小海海 那你们阈值咋算的
作者: bobo_12300    时间: 2016-6-19 14:16
好久没来看了,帖子过去这么久了竟然还有回复。比赛最后没用大津法,用了差分检测边沿跳变,再做一些处理
作者: liangzhineng    时间: 2016-6-20 21:59
mark 大津动态阈值
作者: 乐萧何    时间: 2017-6-13 17:52
554605956 发表于 2014-4-7 10:27
256 是什么意思啊?

看看,多学习
作者: yhj211    时间: 2018-4-9 20:20
大佬们
这种方法解决的神魔问题




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2