注册 登录
查看: 1357|回复: 17

[智能车] 有关线性ccd的差分图像二值化的问题

[复制链接]
发表于 2014-1-10 21:21:08 | 显示全部楼层 |阅读模式
/*!
*  @brief      简单的一个二值化 算法(不稳定,仅测试)
*  @since      v5.0
*/
// diff_threshold 差分阈值 ,不同的角度,不同的环境而有所不同
//可根据 maxdif 最大差分值来配置,或者直接固定阈值
#define diff_threshold    ((maxdif> 12) ? ((maxdif*80)/100) :10)     // 差分阈值
//#define diff_threshold    10
#define safe_isolation    3
void bin(uint8 *bin,uint8 * img,uint8 * difimg,uint16 len,uint8 maxdif)
{
    uint16 tmplen = len;
    uint8  thldnum = 0;        //阈值次数
    uint8  thresholdimg;
    uint8  tmpnum;

    memset(bin,0xFF,len);  //全部当作

    while(tmplen--)
    {
        if((tmplen == 0)|| (tmplen > len))
        {
            return;
        }

        if(difimg[tmplen] > diff_threshold)                  //找到 差分阈值
        {
            thldnum++;

            //寻找最大差分阈值
            while(tmplen--)
            {
                if((tmplen == 0)|| (tmplen > len))
                {
                    return;
                }

                if(difimg[tmplen] < difimg[tmplen+1] )    //tmplen+1 为最大阈值
                {
                     break;
                }
            }

            //tmplen + 1 是 差分最大值 ,切换到 颜色扫描
            if((img[tmplen] <= img[tmplen+1]) ||(img[tmplen+1] <= img[tmplen+2]) )  // 前面 黑色 ,后面 白色
            {
                //选择 差分值最大值的前一个 作为 阈值
                thresholdimg = (img[tmplen+1] + img[tmplen+2])/2;

                //扫描下一个 高于 此阈值 (比此点更白)
                while(img[tmplen] <= thresholdimg)
                {
                    bin[tmplen] = 0;                //黑色
                    tmplen--;
                    if(tmplen == 0)      //结尾了 ,直接退出
                    {
                        if(img[tmplen] <= thresholdimg)
                        {
                             bin[tmplen] = 0;                //黑色
                        }
                        return ;
                    }
                    else if (tmplen > len)
                    {
                         return;
                    }
                }
                tmplen -= safe_isolation;
                if((tmplen == 0)|| (tmplen > len))
                {
                    return;
                }

                //等待差分值降低
                while(difimg[tmplen] > diff_threshold)
                {
                    tmplen--;
                    if((tmplen == 0)|| (tmplen > len))
                    {
                        return;
                    }
                }
            }
            else
            {
                //前白 后 黑
                if(thldnum == 1)
                {
                    //后面的 内容都是 黑色的
                    tmpnum  = tmplen + 1;
                    while(tmpnum < len)
                    {
                        bin[tmpnum] = 0;                //黑色
                        tmpnum ++;
                    }
                }
            }


        }
    }
}

        这是二值化处理的程序,对于这个有些内容没有看明白。

        #define diff_threshold    ((maxdif> 12) ? ((maxdif*80)/100) :10)     // 差分阈值
        这儿的maxdif我就没有找到哪儿定义的

        memset(bin,0xFF,len);  //全部当作  
        这个语句完全不理解,不知道干嘛的

        if(difimg[tmplen] > diff_threshold)                  //找到 差分阈值        {
            thldnum++;

            //寻找最大差分阈值
            while(tmplen--)
            {
                if((tmplen == 0)|| (tmplen > len))
                {
                    return;
                }

                if(difimg[tmplen] < difimg[tmplen+1] )    //tmplen+1 为最大阈值
                {
                     break;
                }
            }

            这儿的    if(difimg[tmplen] < difimg[tmplen+1] )    //tmplen+1 为最大阈值                {
                     break;
                }
            感觉没有用,break只是跳出这个if语句

            麻烦各位回答一下,谢谢了       我刚接触算法这一部分,见笑了
        
回复

使用道具 举报

发表于 2014-1-10 21:24:09 | 显示全部楼层
  1. #define diff_threshold    ((maxdif> 12) ? ((maxdif*80)/100) :10)     // 差分阈值
  2.         这儿的maxdif我就没有找到哪儿定义的
这个是 函数内部调用的,函数 的 形参 变量啊 ……



回复 支持 反对

使用道具 举报

发表于 2014-1-10 21:26:24 | 显示全部楼层
这个,应该是 全部 默认是 白色 的意思
  1. memset(bin,0xFF,len);  
回复 支持 反对

使用道具 举报

发表于 2014-1-10 21:28:36 | 显示全部楼层
  1. break只是跳出这个if语句
break 是 跳出 while 循环 …… while 里 找到 最大的差分阈值,就 跳出来
回复 支持 反对

使用道具 举报

发表于 2014-1-10 21:32:14 | 显示全部楼层
这部分的代码比较长,所以很难理解。

不过你单步调试一下,很容易理解里面的规律的。

山外哥为了存储简单,用的是绝对值差分,不过直接用差分,更好处理。
回复 支持 反对

使用道具 举报

发表于 2014-1-10 21:37:58 | 显示全部楼层
戈矛 发表于 2014-1-10 21:26
这个,应该是 全部 默认是 白色 的意思

是的,只有 黑色 的地方,才用
  1. bin[tmplen] = 0;                //黑色
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-10 23:54:03 | 显示全部楼层
戈矛 发表于 2014-1-10 21:24
这个是 函数内部调用的,函数 的 形参 变量啊 ……

看到了,参数还可以直接给宏定义?
回复 支持 反对

使用道具 举报

发表于 2014-1-10 23:54:51 | 显示全部楼层
爱神风玲-★ 发表于 2014-1-10 23:54
看到了,参数还可以直接给宏定义?

宏定义 的 作用 是 替换功能!!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-10 23:55:18 | 显示全部楼层
戈矛 发表于 2014-1-10 21:26
这个,应该是 全部 默认是 白色 的意思

这个知道,但不知道这个语句怎么来的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-10 23:55:52 | 显示全部楼层
戈矛 发表于 2014-1-10 21:28
break 是 跳出 while 循环 …… while 里 找到 最大的差分阈值,就 跳出来

我错了!  谢谢你啊
回复 支持 反对

使用道具 举报

发表于 2014-1-11 00:01:25 | 显示全部楼层
爱神风玲-★ 发表于 2014-1-10 23:55
这个知道,但不知道这个语句怎么来的

这个语句就是 替换到 那个 函数 里面 那个宏定义的语句。

那个 宏定义,有在那个函数里面调用的
回复 支持 反对

使用道具 举报

发表于 2015-2-4 15:51:02 | 显示全部楼层
问下原始图像可以从野火那个上位机输出,可是二值话之后的图像储存在哪呢?怎么发送到上位机上
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-2-4 16:26:02 | 显示全部楼层
申继鹏 发表于 2015-2-4 15:51
问下原始图像可以从野火那个上位机输出,可是二值话之后的图像储存在哪呢?怎么发送到上位机上

摄像头初始化的时候,就传递采集地址
回复 支持 反对

使用道具 举报

发表于 2015-4-8 11:27:29 | 显示全部楼层
很想问下这个查分二值化之后保存两边黑色边界的地址或者数组在哪呢?我想根据它来提取中线,可是这段代码中找不到这俩边界位置?求大神告知一下 c语言学的不是很好
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-4-8 11:29:03 | 显示全部楼层
申继鹏 发表于 2015-4-8 11:27
很想问下这个查分二值化之后保存两边黑色边界的地址或者数组在哪呢?我想根据它来提取中线,可是这段代码中 ...

这个是自己写的啊,你自己二值化,都不知道二值化的数组存放在哪里?
回复 支持 反对

使用道具 举报

发表于 2015-4-8 11:31:06 | 显示全部楼层
萧曼吟 发表于 2015-4-8 11:29
这个是自己写的啊,你自己二值化,都不知道二值化的数组存放在哪里?

这个不是我写的啊,山外哥写的,有点不懂
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-4-8 21:17:29 | 显示全部楼层
山外メ雲ジ 发表于 2014-1-10 21:37
是的,只有 黑色 的地方,才用

山外哥,线性ccd的差分图像二值化的程序在哪里?用的峰值算阈值的方法有余弦效应,不好使,也想换换了
回复 支持 反对

使用道具 举报

发表于 2015-5-20 14:15:18 | 显示全部楼层
我还是用自适应变阈值来做的,查分的我也用了好久,忘记是有什么原因换的
回复 支持 反对

使用道具 举报

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

本版积分规则

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