详细及易读懂的 大津法(OTSU)原理 和 算法实现
OTSU算法原理简述:
最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。
公式: 记 M = 256 单通道灰度分级 Sum = 像素总数
- 背景像素占比
- 前景像素占比
- 背景的平均灰度值
- 前景的平均灰度值
- 0~M灰度区间的灰度累计值
- 类间方差:
- 将公式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)原理 和 算法实现相关推荐
- 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...
- 【智能车】图像二值化算法--大津法OTSU
图像二值化算法–大津法OTSU 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值. 大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算. 方差越大 ...
- otsu阈值分割算法原理_大津法---OTSU算法
简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
- 最大类间方差法(大津法OTSU)原理
算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...
- 算法001:大津法OTSU学习记录
OTSU算法 一.大津法主要的工作是什么? 大多数时候,我们需要获取到一幅图像中的特定目标.如果可以根据像素值将图像进行合理的分割,例如全局阈值分割那样,找到一个阈值TTT,大于阈值TTT的赋予一个像 ...
- 图像分割之大津法Otsu
中文网上大津法的介绍很多,但是大多数给出的代码不是最优的而且存在分母为零的问题. 基本概念 大津法(简称Otsu)由1979年由日本学者大津提出的,是一种自适应阈值确定的方法,相关文献链接.它是根据图 ...
- 图像分割——大津法(Otsu)
大津法又叫最大类间方差法,是于1979年由日本学者大津展之提出的一种对图像进行二值化的高效算法,是在判别与最小二乘法原理的基础上推导出来的. 算法原理 把直方图在某一阈值处分割为两组,当前分成的两组间 ...
- K210 / Openmv实现 大津法/Otsu最大类间方差法 自适应二值化
目录 源码 效果 平台:K210 固件版本:maixpy_v0.6.2_54_g897214100_openmv_kmodel_v4_with_ide_support.bin OpenMv库自带Ots ...
最新文章
- java 常用方法_Java常用方法总结(持续更新中)
- javascript面向对象技术基础(二)
- mysql操作日志记录查询_详解mysql数据库参数log_timestamps--控制日志记录使用的时区...
- 企业级 SpringBoot 教程 (十七)上传文件
- WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
- matlab叠加定理怎么输入,自动控制原理(第2版)(余成波-张莲-胡晓倩)习题全解及MATLAB实验-----第1、2章习题解答.doc...
- hdu 5813 Elegant Construction
- 电脑word在哪_到底哪个PDF转Word最好用?
- (网页)AngularJS 参考手册
- 【转】Python学习路线
- submit text 插件安装教程
- python实现面试程序
- ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则...
- @spoj - lcs2@ Longest Common Substring II
- 移远NB-IOT BC28 模组 与自建的UDP服务器通信
- 激活Office 365移动设备管理MDM服务
- java规则计算_亲属计算规则算法--java实现(关键算法摘要)
- 传奇世界服务端WIN7简单安装教程
- 《预训练周刊》第66期:智源2022大模型创新论坛、 ChatGPT手把手debug代码、AI与物理的交融...
- 从NFA到DFA的转换
热门文章
- 华为harmonyos2.0哪里下载,华为HarmonyOS最新官方版-华为HarmonyOS2.0最新下载地址-游侠软件下载...
- 会议OA之我的会议(查询)
- 分析非结构化数据的10个步骤
- airpak模拟案例,Airpak模拟教程-体育馆通风模拟案例-CFD数值模拟教程airpak.pdf
- 基于Java+Spring的图书管理系统详细设计和实现
- win10生成https证书步骤
- EasyExcel导入和导出excel数据表格用法示例
- 用python 画一个美国队长盾牌
- unity 两种粒子系统
- python创建模式对象_【python设计模式-创建型】单例模式