二值化-大津法(OTSU)
论文
Otsu N . A Threshold Selection Method from Gray-Level Histograms[J]. IEEE Transactions on Systems, Man, and Cybernetics, 1979, 9(1):62-66.
算法介绍
OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
公式
默认为白底黑字。及白色为背景,黑色为前景
图片宽为W,高为H
灰度图分级为[0 , M], 灰度等级为i的像素在整幅图中的像素个数为nin_ini
前景灰度等级范围为[0,L],背景灰度等级范围为[L+1,M]
图片中灰度等级为i的像素个数占整幅图像的比例 :p(i) = niW∗H\frac{n_i}{W*H}W∗Hni
前景像素点占整幅图像的比例:w0w_0w0 = ∑i=0i=L\sum_{i=0} ^ {i=L}∑i=0i=Lp(i)
背景景像素点占整幅图像的比例:w1w_1w1 = ∑i=L+1i=M\sum_{i=L+1} ^ {i=M}∑i=L+1i=Mp(i) = 1 - w0w_0w0
设μ\muμ(n) = ∑i=0i=L\sum_{i=0} ^ {i=L}∑i=0i=Li*p(i)
前景(w0)像素点平均灰度:u0u_0u0 = μ(L)w0\frac{\mu(L)}{w0}w0μ(L)
背景(w1)像素点平均灰度:u1u_1u1 = μ(M)−μ(L)1−w0\frac{\mu(M) - \mu(L)}{1-w_0}1−w0μ(M)−μ(L)
整张图像素点平均灰度为:uTu_TuT= ∑i=0i=M\sum_{i=0} ^ {i=M}∑i=0i=Mi*p(i) = μ\muμ(M)
类间方差公式: w0(uT−u0)2w0(u_T - u_0) ^2w0(uT−u0)2+w1(uT−u1)2w1(u_T-u_1)^2w1(uT−u1)2 推导可得 w0w_0w0*w1w_1w1*(u1−u0)2(u_1-u_0)^2(u1−u0)2
代码
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;public class OpenCVTest {static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }public static void main(String[] args) {OpenCVTest openCVTest = new OpenCVTest();//读入图片Mat src = Imgcodecs.imread("F:\\opencvPhoto\\photo\\opencv.jpg");//灰度化Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);//对比图Mat temp = src.clone();//大津法获得阈值int thresh = openCVTest.otsu(src);//采用大津法阈值二值化Imgproc.threshold(src, src, thresh, 255, Imgproc.THRESH_BINARY);//应用opencv自带的大津法进行二值化Imgproc.threshold(temp, temp, 0, 255, Imgproc.THRESH_OTSU);//自己实现的大津法与opencv大津法对比boolean flag = true;for (int row = 0; row < src.rows(); row++) {for (int col = 0; col < src.cols(); col++) {if (src.get(row, col)[0] != temp.get(row, col)[0]) {flag = false;break;}}if (!flag) {break;}}if (flag) {System.out.println("大津法实现效果与opencv的大津法相同");}else {System.out.println("大津法实现效果与opencv的大津法不同");}}/*** 大津算法* 默认为白底黑字,及白色为背景,黑色为前景* @param mat 灰度图* @return 阈值*/public int otsu(Mat mat) {int GrayScale = 256; //单通道图像总灰度256级int[] pixCount = new int[256]; //每个灰度值所占像素个数double[] pixPro = new double[256]; //每个灰度值所占总像素比例int pixSum = mat.cols() * mat.rows();//图像总像素点double w0 = 0; //前景像素点占整幅图像的比例double w1 = 0; //背景景像素点占整幅图像的比例double u0tmp;double u1tmp;double u0; //w0平均灰度double u1; //w1平均灰度double deltaTmp;double deltaMax = 0;int th = 0;for (int row = 0; row < mat.rows(); row++) {for (int col = 0; col < mat.cols(); col++) {pixCount[(int) mat.get(row, col)[0]]++; //统计每个灰度级中像素的个数}}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 = (w0 * w1 * Math.pow((u0 - u1), 2)); //类间方差公式 g = w0 * w1 * (u0 - u1) ^ 2if (deltaTmp > deltaMax) {deltaMax = deltaTmp;th = i;}}return th;}
}
结果输出
大津法实现效果与opencv的大津法相同
效果图展示
原图
结果图
二值化-大津法(OTSU)相关推荐
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
- 【智能车】图像二值化算法--大津法OTSU
图像二值化算法–大津法OTSU 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值. 大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算. 方差越大 ...
- 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...
- otsu阈值分割算法原理_大津法---OTSU算法
简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...
- 最大类间方差法(大津法OTSU)原理
算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...
- 图像分割——大津法(Otsu)
大津法又叫最大类间方差法,是于1979年由日本学者大津展之提出的一种对图像进行二值化的高效算法,是在判别与最小二乘法原理的基础上推导出来的. 算法原理 把直方图在某一阈值处分割为两组,当前分成的两组间 ...
- 算法001:大津法OTSU学习记录
OTSU算法 一.大津法主要的工作是什么? 大多数时候,我们需要获取到一幅图像中的特定目标.如果可以根据像素值将图像进行合理的分割,例如全局阈值分割那样,找到一个阈值TTT,大于阈值TTT的赋予一个像 ...
- 图像分割之大津法Otsu
中文网上大津法的介绍很多,但是大多数给出的代码不是最优的而且存在分母为零的问题. 基本概念 大津法(简称Otsu)由1979年由日本学者大津提出的,是一种自适应阈值确定的方法,相关文献链接.它是根据图 ...
- VTK修炼之道31:图像二值化_阈值法
1.阈值法实现图像二值化操作 二值图像和label图像是图像分割中经常用到的两种图像. 二值图像的每个像素只有两种可能的取值,例如0或者255.通常0代表图像的背景,而255代码图像前景.图像二值化是 ...
最新文章
- 初探 es6 promise
- 给计算机图片文件夹加密码,电脑文件夹设置密码的方法是什么【图文】
- 利用ArcGIS Python批量拼接裁剪遥感影像(arcpy batch processing)
- boost::spirit模块实现自定义嵌入式容器数据的测试程序
- python替换缺失值_python 缺失值处理(Imputation)
- 运维秘籍:防止数据丢失“六脉神剑”
- jmeter持续集成测试中mongodb版本问题
- 6月份Github上最热门的Java开源项目!
- bfv同态加密_五分钟了解同态加密及三种常见方案
- 记录 PHP 缓存区ob
- 快速入门丨篇四:如何进行运动控制器与触摸屏通讯?
- 产品经理如何写出一看就想约的简历
- python给excel排序_数据处理,Excel的排序功能,使用pandas在Python中轻松完成
- 时隙aloha协议仿真程序_石科院:芳烃吸附分离装置吸附塔控制系统的仿真培训系统开发!...
- 电网公司追求购电费用最小的调度决策(Python代码实现)
- 最新影视小程序对接苹果cms源码无授权版+详细教程
- 答题小程序为何那么火?
- Ubuntu硬盘空间不足时,添加硬盘的方法
- JUC第六讲:ThreadLocal/InheritableThreadLocal详解/TTL-MDC日志上下文实践
- 大工计算机学院博士答辩要求,大连理工大学博士毕业论文要求和发表