Otsu算法——最大类间方差法(大津算法)
Otsu算法,又被称为最大类间方差法(大津算法),是一种确定阈值的算法。
1. 算法理解
Otsu算法之所以称为最大类间方差法是因为,该方法主要是通过阈值进行前后背景分割,而该方法确定最佳阈值的方法是该值使类间方差最大,它是按图像的灰度特性,将图像分成背景和前景两部分,使类间方差最大的分割意味着错分概率最小。
2. 算法原理
以灰度图像为例,对于图像imgimgimg,我们可以将其看作一个M×NM\times NM×N大小的矩阵,即图像中的像素,每一个值即为像素值,其中像素值在(0255)(0~255)(0 255)之间。
前景(即目标)和背景的分割阈值记作optimalthresholdoptimal_{threshold}optimalthreshold,属于前景的像素点数占整幅图像的比例记为ω0ω_0ω0,前景平均灰度记为μ0μ_0μ0;背景像素点数占整幅图像的比例记为ω1ω_1ω1,其平均灰度记为μ1μ_1μ1。图像的总平均灰度记为μμμ,类间方差记为maximummaximummaximum。
假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值optimalthresholdoptimal_{threshold}optimalthreshold的像素个数记作N0N_0N0,像素灰度大于等于阈值optimalthresholdoptimal_{threshold}optimalthreshold的像素个数记作N1N_1N1,则有:
ω0=N0/(M×N)(1)ω_0=N_0/ (M×N) \tag{1} ω0=N0/(M×N) (1)
ω1=N1/(M×N)(2)ω_1=N_1/ (M×N) \tag{2} ω1=N1/(M×N) (2)
N0+N1=M×N(3)N_0 + N_1 = M×N\tag{3} N0+N1=M×N (3)
1=ω0+ω1(4)1 = ω_0 + ω_1\tag{4} 1=ω0+ω1 (4)
μ=ω0×μ0+ω1×μ1(5)μ = ω_0 \times μ_0 + ω_1 \times μ_1\tag{5} μ=ω0×μ0+ω1×μ1 (5)
maximum=ω0×(μ0−μ)2+ω1×(μ1−μ)2(6)maximum = ω_0 \times (μ_0 - μ)^2 + ω_1 \times (μ_1 - μ)^2\tag{6} maximum=ω0×(μ0−μ)2+ω1×(μ1−μ)2(6)
将式(5)代入式(6),得到等价公式(7):
maximum=ω0×ω1×(μ0−μ1)2(7)maximum = ω_0 \times ω_1 \times (μ_0 - μ_1)^2\tag{7} maximum=ω0×ω1×(μ0−μ1)2(7)
采用遍历的方法得到使类间方差maximummaximummaximum最大的阈值optimalthresholdoptimal_{threshold}optimalthreshold。
3. 分割方式
通过使用Ostu 算法对最佳阈值求解后,我们可以选择不同的分割方式进行分割,分割方式如下:
- 二值法( threshbinarythresh \;binarythreshbinary)
img(i,j)={maxvalifimg(i,j)>threshold0otherwise(8)img(i,j)=\begin{cases} maxval & if \quad img(i,j)>threshold\\ 0 & otherwise \end{cases}\tag{8} img(i,j)={maxval0ifimg(i,j)>thresholdotherwise(8)
当然,该方法也可以稍微转变,改变前后背景,即目标,如公式(9)
img(i,j)={0ifimg(i,j)>thresholdmaxvalotherwise(9)img(i,j)=\begin{cases} 0& if \quad img(i,j)>threshold\\ maxval & otherwise \end{cases}\tag{9} img(i,j)={0maxvalifimg(i,j)>thresholdotherwise(9)
公式(9)也可以被称作逆二值法( threshbinaryinvthresh \;binary\;invthreshbinaryinv)
- 截断法(threshtruncthresh \;truncthreshtrunc)
img(i,j)={thresholdifimg(i,j)>thresholdimg(i,j)otherwise(10)img(i,j)=\begin{cases} threshold& if \quad img(i,j)>threshold\\ img(i,j) & otherwise \end{cases}\tag{10} img(i,j)={thresholdimg(i,j)ifimg(i,j)>thresholdotherwise(10)
该方法能不能像上面方法一样,有一个逆截断法呢?当然也是可以的,可以根据具体需要进行相应的改变。
逆截断法(threshtruncinvthresh \;trunc\;invthreshtruncinv) 如公式(11)所示:
img(i,j)={img(i,j)ifimg(i,j)>thresholdthresholdotherwise(11)img(i,j)=\begin{cases} img(i,j)& if \quad img(i,j)>threshold\\ threshold & otherwise \end{cases}\tag{11} img(i,j)={img(i,j)thresholdifimg(i,j)>thresholdotherwise(11)
- 归零法(threshtozerothresh\;tozerothreshtozero)
img(i,j)={img(i,j)ifimg(i,j)>threshold0otherwise(12)img(i,j)=\begin{cases} img(i,j)& if \quad img(i,j)>threshold\\ 0& otherwise \end{cases}\tag{12} img(i,j)={img(i,j)0ifimg(i,j)>thresholdotherwise(12)
逆归零法(threshtozeroinvthresh\;tozero\;invthreshtozeroinv) 如公式(13)所示:
img(i,j)={0ifimg(i,j)>thresholdimg(i,j)otherwise(13)img(i,j)=\begin{cases} 0& if \quad img(i,j)>threshold\\ img(i,j)& otherwise \end{cases}\tag{13} img(i,j)={0img(i,j)ifimg(i,j)>thresholdotherwise(13)
4. 算法评价
优点:算法简单,当目标与背景的面积相差不大时,能够有效地对图像进行分割。
缺点:类间方差法对噪声以及目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时(例如受光照不均、反光或背景复杂等因素影响),类间方差准则函数可能呈现双峰或多峰,或者目标与背景的灰度有较大的重叠时,效果不不是很理想。
原因:该方法忽略了图像的空间信息,同时将图像的灰度分布作为分割图像的依据,对噪声也相当敏感。
5. 算法实现
以下方图片为例:
使用Ostu 算法进行分割的效果如下:
上图分割时使用的是归零法。
算法代码
- Ostu算法(最大类间方差代码)
function[optimal_threshold] = Maximum_between_class_variance(img)[row, col] = size(img);count_pixel = row * col;maximum = -1;for i=0:255N0 = sum(sum(img<i));N1 = count_pixel - N0;omega0 = N0 / count_pixel;omega1 = 1 - omega0;mu0 = sum(img(img<i)) / N0;mu1 = sum(img(img>=i)) / N1;g = omega0 * omega1 * (mu0 - mu1) ^ 2;if g > maximummaximum = g;optimal_threshold = i;endend
end
- 测试代码
img = imread("fig.tif");
imshow(img)
threshold = Maximum_between_class_variance(img);
img(img<=threshold) = 0;
imshow(img);
Otsu算法——最大类间方差法(大津算法)相关推荐
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
- 图像二值化----otsu(最大类间方差法、大津算法)(二)
转自:http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算 ...
- 最大类间方差(大津法)详解
参考: https://www.cnblogs.com/xiaomanon/p/4110006.html 一.算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫 ...
- OTSU(最大类间方差法、大津算法)
OTSU是阈值分割中一种常用的算法,它可以根据图像自动生成最佳分割阈值.OTSU的核心思想是类间方差最大化. import cv2 import numpy as np from matplotlib ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...
- 最大类间方差法(大津法OTSU)原理
算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...
- 基于OTSU最大类间方差法的ROI分割、提取图像中的形状特征--面积、周长、离心率、zernike矩
分享一下最近学习的图像分类方面知识,整体的思路如下(之前的汇报ppt里截的) 把这个过程拆分几个部分共同学习一下吧 1.Otsu法原理 最大类间方差法OTSU是一种自适应的全局阈值确定的方法,根据灰度 ...
- opencv与C++实现最大类间方差法(OTSU)进行图像二值化
直接上代码,使用最大类间方差法进行二值化的函数 void threshold_otsu(Mat &mat, Mat &mat_thresh) //mat为输入图像,mat_thresh ...
- Ostu最大类间方差法的C++实现
一.Ostu的原理 最大类间方差法是由日本学者大津(Nobuyuki Ostu)在1979年提出的,该方法根据计算公式自动计算分割单域值,是一种根据灰度图像自动计算阈值的方法.它按照灰度图像的灰度值等 ...
最新文章
- 32位地址的寻址方式
- scala for循环
- 微型计算机储存信息的基本单位是什么,16.磁盘存储器存、取信息的最基本单位是...
- openjdk_从CLI监视OpenJDK
- 那些读博的女生,怎样通过“九九八十一关”?
- 如何把Win11任务栏变窄
- 数据中心操作人员:艰难地在针对VM构建的基础设施上运行容器
- 特殊时期,字节跳动高效有序的远程协作办公经验,值得各企业学习!
- 安卓手表ADB实用工具箱
- 《Shell脚本学习指南》学习笔记
- 一张图概括淘宝直播背后的前端技术
- 关于新闻:西瓜3毛一斤仍滞销 被当垃圾扔掉 问题的一点看法
- 论文翻译:A Tutorial on Thompson Sampling
- java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation问题解决
- “蔚来杯“2022牛客暑期多校训练营5-A Don‘t Starve
- (E2)ENVI-met模型建立——创建项目及数据库的使用
- 127.0.0.1 zxt.php_shmilyzxt/
- matlab截取5到10秒音频,如何截取音频中的一段
- android 页面边框设置
- macos 输入法切换卡顿 macos monterey (已解决)
热门文章
- 头歌 Java IO 答案 增加章节java学习-Java输入输出之字节缓冲IO流之复制文件
- 数据结构算法之关键路径
- java长连接_java如何实现http长连接
- distpicker.js 三级联动,修改地址时设置默认值
- 服务器端车牌识别SDK
- imdisk虚拟光驱安装linux,imdisk虚拟磁盘驱动器如何加载iso文件?大白菜ImDisk加载iso文件教程...
- 微信小程序图片上传组件
- 微服务网关选型,请收下我的膝盖!
- Awesome-Windows
- 如何下载国家自然科学基金申请书的模板