大津法优化之在飞卡智能车中的应用
此优化算法是本人前两年参加智能车比赛,在总钻风摄像头例程基础上优化的(分辨率为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;}
大津法优化之在飞卡智能车中的应用相关推荐
- 一些做“飞卡智能车”时候的总结
写在前面的话: 很有幸带队参加了11-14届的全国大学生智能车竞赛,经历了从"飞思卡尔杯"到"恩智浦杯"的转变.由最初的摄像头组,到最后的六个组别都 ...
- 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】
一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...
- 智能车阳光算法(含大津法)
** ## 智能车阳光算法 ** 谈不上真正的阳光算法,但是对于一些光干扰的场景和一些有噪点的图像还是可以进行处理. 在之前主流的摄像头主要是ov7725这个摄像头的优点就是硬件二值化,它的处理速度比 ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 最大类间方差(大津法)详解
参考: https://www.cnblogs.com/xiaomanon/p/4110006.html 一.算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫 ...
- 基于OTSU(大津法)的图像分块的阈值分割
一.开发环境: Qt版本:Qt5.12.3VS版本:VS2017opencv版本:opencv-4.5.1-vc14_vc15 二.要求:实现基于图像分块+OTSU的图像分割 1.OTSU大津法实现 ...
- 动态阈值--大津法理解
原文在这儿:点击打开链接 简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图 ...
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
最新文章
- weiphp----------图灵机器人存在的bug。
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获
- mysql模糊查询 % , _ ,[], [^] 的区别
- 实战|对某棋牌站的一次getshell
- 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构
- mysql高级之子查询,多表查询,外连接,集合操作,内部函数与数据控制_月隐学python第24课
- 微信公众号网页开发:播放视频,在列表中滑动会脱离文档流
- C#实现像微信PC版一样的扫码登录功能
- 算法科普:有趣的霍夫曼编码
- Exception in thread “main“ java.util.ConcurrentModificationException
- 地区picker 各选择器,优劣分析
- java突击面试章程
- 慕课《算法分析与设计》山东财经大学李恒武,第二章算法分析 测验题问题梳理答案
- Java使用qq邮箱发送email
- 高德地图web精准定位
- dfuse 开放其 EOSIO 堆栈的源代码
- 黄金分割法,你会了吗?
- actor 模型原理 (一)
- AS400 DDM 概述
- Danmo 的学习之路(HTML——CSS)