此优化算法是本人前两年参加智能车比赛,在总钻风摄像头例程基础上优化的(分辨率为188*70,工程文件:含优化算法的小车程序)。移植方便,亲测只需2ms(逐飞给的例程是很常规的,网上都能找到,需要40ms不止吧,根本无法直接使用,不知道现在优化了没,手动滑稽)。

与鹰眼摄像头的硬件二值化不同,总钻风需要软件二值化。而大津法便是最为常见的一种自适应算法,效果也不错。网上资料蛮多,简单来说就是遍历0~255的灰度值,用该灰度值将一副图像分割为前景和背景(黑和白),用类间方差所定义的算式得到类间方差(deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);详见下面程序),当其最大时,即为最佳阈值(即得到的黑白图像区分最佳)

下面先来看看常规大津法为何如此缓慢

uint8 otsuThreshold(uint8 *image, uint16 col, uint16 row)
{#define GrayScale 256uint16 width = col;uint16 height = row;int pixelCount[GrayScale];float pixelPro[GrayScale];int i, j, pixelSum = width * height;uint8 threshold = 0;uint8* data = image;  //指向像素数据的指针for (i = 0; i < GrayScale; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//统计灰度级中每个像素在整幅图像中的个数  for (i = 0; i < height; i++){for (j = 0; j < width; j++){pixelCount[(int)data[i * width + j]]++;  //将像素值作为计数数组的下标}}//计算每个像素值的点在整幅图像中的比例  float maxPro = 0.0;for (i = 0; i < GrayScale; i++){pixelPro[i] = (float)pixelCount[i] / pixelSum;if (pixelPro[i] > maxPro){maxPro = pixelPro[i];}}//遍历灰度级[0,255]  float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for (i = 0; i < GrayScale; i++)     // i作为阈值{w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for (j = 0; j < GrayScale; j++){if (j <= i)   //背景部分  {w0 += pixelPro[j];  //背景部分每个灰度值的像素点所占比例之和   即背景部分的比例u0tmp += j * pixelPro[j];  //背景部分 每个灰度值*比例  }else   //前景部分  {w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;              //背景平均灰度u1 = u1tmp / w1;              //前景平均灰度u = u0tmp + u1tmp;            //全局平均灰度deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}return threshold;
}

其中的两层for循环便为最为耗时的一部分:外循环–假设256个灰度值中的一个是最佳阈值;内循环–在对每个假设的最佳阈值进行0-255的灰度遍历算前景背景像素点所占比例,其繁琐可想而知

那么,应该从何处对大津法进行优化呢

1.去内外层的256次循环—可通过先算出每幅图像的总灰度,则接下来只用算前景,不用在算背景的多次重复遍历(背景用总的减去前景即可)
此步骤为最主要的,执行一次程序所需时间将大幅度减少!!
2.大家知道相邻两个像素点的灰度值其实是相近甚至相等的,尤其是分辨率高的时候,所以我们可以相间取点,但不可相间太远以免影响效果
3.一副图像的最佳阈值处的类间方差为最大值,那么如果以0-255的灰度值为横坐标,相应的类间方差为纵坐标,那么最佳阈值附近的灰度值所对应的类间方差又是如何变化的呢?凭着直觉,我猜测是二次的,后来也通过实验证明了这点。所以,当我们找到了最大类间方差,即类间方差有减小的趋势,便不用在继续遍历下去(对应程序末尾)

优化大津法如下,如果有不当之处望斧正,有需要完整小车程序的可在评论区留邮箱

uint8 my_adapt_threshold(uint8 *image, uint16 col, uint16 row)   //注意计算阈值的一定要是原图像
{#define GrayScale 256uint16 width = col;uint16 height = row;int pixelCount[GrayScale];float pixelPro[GrayScale];int i, j, pixelSum = width * height/4;uint8 threshold = 0;uint8* data = image;  //指向像素数据的指针for (i = 0; i < GrayScale; i++){pixelCount[i] = 0;pixelPro[i] = 0;}uint32 gray_sum=0;//统计灰度级中每个像素在整幅图像中的个数  for (i = 0; i < height; i+=2){for (j = 0; j < width; j+=2){pixelCount[(int)data[i * width + j]]++;  //将当前的点的像素值作为计数数组的下标gray_sum+=(int)data[i * width + j];       //灰度值总和}}//计算每个像素值的点在整幅图像中的比例  for (i = 0; i < GrayScale; i++){pixelPro[i] = (float)pixelCount[i] / pixelSum;}//遍历灰度级[0,255]  float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for (j = 0; j < GrayScale; j++)         {w0 += pixelPro[j];  //背景部分每个灰度值的像素点所占比例之和   即背景部分的比例u0tmp += j * pixelPro[j];  //背景部分 每个灰度值的点的比例 *灰度值 w1=1-w0;u1tmp=gray_sum/pixelSum-u0tmp;u0 = u0tmp / w0;              //背景平均灰度u1 = u1tmp / w1;              //前景平均灰度u = u0tmp + u1tmp;            //全局平均灰度deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = j;}if (deltaTmp < deltaMax){break;}}return threshold;}

大津法优化之在飞卡智能车中的应用相关推荐

  1. 一些做“飞卡智能车”时候的总结

    写在前面的话:       很有幸带队参加了11-14届的全国大学生智能车竞赛,经历了从"飞思卡尔杯"到"恩智浦杯"的转变.由最初的摄像头组,到最后的六个组别都 ...

  2. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  3. 智能车阳光算法(含大津法)

    ** ## 智能车阳光算法 ** 谈不上真正的阳光算法,但是对于一些光干扰的场景和一些有噪点的图像还是可以进行处理. 在之前主流的摄像头主要是ov7725这个摄像头的优点就是硬件二值化,它的处理速度比 ...

  4. CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)

    引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...

  5. 最大类间方差(大津法)详解

    参考: https://www.cnblogs.com/xiaomanon/p/4110006.html 一.算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫 ...

  6. 基于OTSU(大津法)的图像分块的阈值分割

    一.开发环境: Qt版本:Qt5.12.3VS版本:VS2017opencv版本:opencv-4.5.1-vc14_vc15 二.要求:实现基于图像分块+OTSU的图像分割 1.OTSU大津法实现 ...

  7. 动态阈值--大津法理解

    原文在这儿:点击打开链接 简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图 ...

  8. 图像二值化之最大类间方差法(大津法,OTSU)

    参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...

  9. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

最新文章

  1. weiphp----------图灵机器人存在的bug。
  2. 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获
  3. mysql模糊查询 % , _ ,[], [^] 的区别
  4. 实战|对某棋牌站的一次getshell
  5. 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构
  6. mysql高级之子查询,多表查询,外连接,集合操作,内部函数与数据控制_月隐学python第24课
  7. 微信公众号网页开发:播放视频,在列表中滑动会脱离文档流
  8. C#实现像微信PC版一样的扫码登录功能
  9. 算法科普:有趣的霍夫曼编码
  10. Exception in thread “main“ java.util.ConcurrentModificationException
  11. 地区picker 各选择器,优劣分析
  12. java突击面试章程
  13. 慕课《算法分析与设计》山东财经大学李恒武,第二章算法分析 测验题问题梳理答案
  14. Java使用qq邮箱发送email
  15. 高德地图web精准定位
  16. dfuse 开放其 EOSIO 堆栈的源代码
  17. 黄金分割法,你会了吗?
  18. actor 模型原理 (一)
  19. AS400 DDM 概述
  20. Danmo 的学习之路(HTML——CSS)

热门文章

  1. 对于Json前端和后端交互的数据格式设置
  2. 双绞线,水晶头,光纤等网络传输介质分类及相关知识整理
  3. 力扣1046 最后一块石头 推排序
  4. 【Vue】关闭浏览器窗口之前弹出提示
  5. .chm文件与.doc文件互相转换(一).chm转.doc
  6. UTF-8和不带BOM的UTF-8有什么区别?
  7. HTML5移动开发的基础与技巧(一)HTML5新增标签及应用场景
  8. 万一您想单车21,000英里...
  9. Mina Executor Filter执行线程模型过滤器
  10. SAP替代物料操作详解