OTSU算法原理简述:

最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。

公式:  记 M = 256 单通道灰度分级 Sum = 像素总数

  1. 背景像素占比 
  2. 前景像素占比
  3. 背景的平均灰度值
  4. 前景的平均灰度值
  5. 0~M灰度区间的灰度累计值
  6. 类间方差:
  7. 将公式3.4.5带入公式6 可得最终简化公式: 

代码:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <time.h>
using namespace std;
using namespace cv;int myOtsu(Mat & src)
{int th;const int GrayScale = 256; //单通道图像总灰度256级int pixCount[GrayScale] = {0};//每个灰度值所占像素个数int pixSum = src.cols * src.rows;//图像总像素点float pixPro[GrayScale] = {0};//每个灰度值所占总像素比例float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0; for(int i = 0; i < src.cols; i++){for(int j = 0; j < src.rows; j++){pixCount[src.at<uchar>(j,i)]++;//统计每个灰度级中像素的个数  }}for(int i = 0; i < GrayScale; i++){pixPro[i] = pixCount[i] * 1.0 / pixSum;//计算每个灰度级的像素数目占整幅图像的比例  }for(int i = 0; i < GrayScale; i++)//遍历所有从0到255灰度级的阈值分割条件,测试哪一个的类间方差最大{w0 = w1 = u0tmp = u1tmp = u0 = u1 = deltaTmp = 0;  for(int j = 0; j < GrayScale; j++){if(j <= i)//背景{w0 += pixPro[j];u0tmp += j * pixPro[j]; }else//前景{w1 += pixPro[j];u1tmp += j * pixPro[j];}}u0 = u0tmp / w0;u1 = u1tmp / w1;deltaTmp = (float)(w0 *w1* pow((u0 - u1), 2)); //类间方差公式 g = w1 * w2 * (u1 - u2) ^ 2if(deltaTmp > deltaMax) {deltaMax = deltaTmp;th = i;  }  }return th;
}int main()
{Mat src = imread("lena.jpg",IMREAD_GRAYSCALE);//单通道读取图像/*my_dst: 自己实现的大津法 得到的处理图像otsu_dst:opencv自带的大津法 得到的处理图像sub:两个处理图像相差图*/Mat my_dst, otsu_dst, sub;                           /*my_th: 自己实现的大津法 得到的最大类件方差 即阈值th:opencv自带的大津法 得到的最大类件方差 即阈值*/int my_th, th;/*计算开销时间,对比两个算法效率*/long my_start = clock();  //开始时间{my_th = myOtsu(src);threshold(src,my_dst,my_th,255,CV_THRESH_BINARY);}long my_finish = clock();   //结束时间long my_t = my_finish-my_start;printf("The run time is:%9.3lf\n", my_t, "ms!\n"); //输出时间cout << "myOtsu threshold >> " << my_th << endl;long otsu_start = clock();  //开始时间{th = threshold(src,otsu_dst,0,255,CV_THRESH_OTSU);}long otsu_finish = clock();   //结束时间long t = my_finish-my_start;printf("The run time is:%9.3lf\n",  (double) t / CLOCKS_PER_SEC, "ms!\n"); //输出时间cout << "Otsu threshold >> " << th << endl;subtract(otsu_dst,my_dst,sub);//两图像相减imshow("src",src);imshow("myOtsu",my_dst);imshow("Otsu",otsu_dst);imshow("Sub",sub);waitKey();system("pause");return 0;
}

原图:用的是lena

得到测试结果和图像

结论:可以看到自己实现的otsu和opencv自带的自适应阈值算法所得效果和效率相同。

最后:欢迎大家的批评,很高心与大家分享,谢谢大家。

详细及易读懂的 大津法(OTSU)原理 和 算法实现相关推荐

  1. 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)

    目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...

  2. 【智能车】图像二值化算法--大津法OTSU

    图像二值化算法–大津法OTSU 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值. 大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算. 方差越大 ...

  3. otsu阈值分割算法原理_大津法---OTSU算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

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

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

  5. 最大类间方差法(大津法OTSU)原理

    算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...

  6. 算法001:大津法OTSU学习记录

    OTSU算法 一.大津法主要的工作是什么? 大多数时候,我们需要获取到一幅图像中的特定目标.如果可以根据像素值将图像进行合理的分割,例如全局阈值分割那样,找到一个阈值TTT,大于阈值TTT的赋予一个像 ...

  7. 图像分割之大津法Otsu

    中文网上大津法的介绍很多,但是大多数给出的代码不是最优的而且存在分母为零的问题. 基本概念 大津法(简称Otsu)由1979年由日本学者大津提出的,是一种自适应阈值确定的方法,相关文献链接.它是根据图 ...

  8. 图像分割——大津法(Otsu)

    大津法又叫最大类间方差法,是于1979年由日本学者大津展之提出的一种对图像进行二值化的高效算法,是在判别与最小二乘法原理的基础上推导出来的. 算法原理 把直方图在某一阈值处分割为两组,当前分成的两组间 ...

  9. K210 / Openmv实现 大津法/Otsu最大类间方差法 自适应二值化

    目录 源码 效果 平台:K210 固件版本:maixpy_v0.6.2_54_g897214100_openmv_kmodel_v4_with_ide_support.bin OpenMv库自带Ots ...

最新文章

  1. java 常用方法_Java常用方法总结(持续更新中)
  2. javascript面向对象技术基础(二)
  3. mysql操作日志记录查询_详解mysql数据库参数log_timestamps--控制日志记录使用的时区...
  4. 企业级 SpringBoot 教程 (十七)上传文件
  5. WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
  6. matlab叠加定理怎么输入,自动控制原理(第2版)(余成波-张莲-胡晓倩)习题全解及MATLAB实验-----第1、2章习题解答.doc...
  7. hdu 5813 Elegant Construction
  8. 电脑word在哪_到底哪个PDF转Word最好用?
  9. (网页)AngularJS 参考手册
  10. 【转】Python学习路线
  11. submit text 插件安装教程
  12. python实现面试程序
  13. ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则...
  14. @spoj - lcs2@ Longest Common Substring II
  15. 移远NB-IOT BC28 模组 与自建的UDP服务器通信
  16. 激活Office 365移动设备管理MDM服务
  17. java规则计算_亲属计算规则算法--java实现(关键算法摘要)
  18. 传奇世界服务端WIN7简单安装教程
  19. 《预训练周刊》第66期:智源2022大模型创新论坛、 ChatGPT手把手debug代码、AI与物理的交融...
  20. 从NFA到DFA的转换

热门文章

  1. 华为harmonyos2.0哪里下载,华为HarmonyOS最新官方版-华为HarmonyOS2.0最新下载地址-游侠软件下载...
  2. 会议OA之我的会议(查询)
  3. 分析非结构化数据的10个步骤
  4. airpak模拟案例,Airpak模拟教程-体育馆通风模拟案例-CFD数值模拟教程airpak.pdf
  5. 基于Java+Spring的图书管理系统详细设计和实现
  6. win10生成https证书步骤
  7. EasyExcel导入和导出excel数据表格用法示例
  8. 用python 画一个美国队长盾牌
  9. unity 两种粒子系统
  10. python创建模式对象_【python设计模式-创建型】单例模式