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)={maxval0​ifimg(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)={0maxval​ifimg(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)threshold​ifimg(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)0​ifimg(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算法——最大类间方差法(大津算法)相关推荐

  1. 图像二值化之最大类间方差法(大津法,OTSU)

    参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...

  2. 图像二值化----otsu(最大类间方差法、大津算法)(二)

    转自:http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算 ...

  3. 最大类间方差(大津法)详解

    参考: https://www.cnblogs.com/xiaomanon/p/4110006.html 一.算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫 ...

  4. OTSU(最大类间方差法、大津算法)

    OTSU是阈值分割中一种常用的算法,它可以根据图像自动生成最佳分割阈值.OTSU的核心思想是类间方差最大化. import cv2 import numpy as np from matplotlib ...

  5. CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)

    引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...

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

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

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

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

  8. 基于OTSU最大类间方差法的ROI分割、提取图像中的形状特征--面积、周长、离心率、zernike矩

    分享一下最近学习的图像分类方面知识,整体的思路如下(之前的汇报ppt里截的) 把这个过程拆分几个部分共同学习一下吧 1.Otsu法原理 最大类间方差法OTSU是一种自适应的全局阈值确定的方法,根据灰度 ...

  9. opencv与C++实现最大类间方差法(OTSU)进行图像二值化

    直接上代码,使用最大类间方差法进行二值化的函数 void threshold_otsu(Mat &mat, Mat &mat_thresh) //mat为输入图像,mat_thresh ...

  10. Ostu最大类间方差法的C++实现

    一.Ostu的原理 最大类间方差法是由日本学者大津(Nobuyuki Ostu)在1979年提出的,该方法根据计算公式自动计算分割单域值,是一种根据灰度图像自动计算阈值的方法.它按照灰度图像的灰度值等 ...

最新文章

  1. 32位地址的寻址方式
  2. scala for循环
  3. 微型计算机储存信息的基本单位是什么,16.磁盘存储器存、取信息的最基本单位是...
  4. openjdk_从CLI监视OpenJDK
  5. 那些读博的女生,怎样通过“九九八十一关”?
  6. 如何把Win11任务栏变窄
  7. 数据中心操作人员:艰难地在针对VM构建的基础设施上运行容器
  8. 特殊时期,字节跳动高效有序的远程协作办公经验,值得各企业学习!
  9. 安卓手表ADB实用工具箱
  10. 《Shell脚本学习指南》学习笔记
  11. 一张图概括淘宝直播背后的前端技术
  12. 关于新闻:西瓜3毛一斤仍滞销 被当垃圾扔掉 问题的一点看法
  13. 论文翻译:A Tutorial on Thompson Sampling
  14. java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation问题解决
  15. “蔚来杯“2022牛客暑期多校训练营5-A Don‘t Starve
  16. (E2)ENVI-met模型建立——创建项目及数据库的使用
  17. 127.0.0.1 zxt.php_shmilyzxt/
  18. matlab截取5到10秒音频,如何截取音频中的一段
  19. android 页面边框设置
  20. macos 输入法切换卡顿 macos monterey (已解决)

热门文章

  1. 头歌 Java IO 答案 增加章节java学习-Java输入输出之字节缓冲IO流之复制文件
  2. 数据结构算法之关键路径
  3. java长连接_java如何实现http长连接
  4. distpicker.js 三级联动,修改地址时设置默认值
  5. 服务器端车牌识别SDK
  6. imdisk虚拟光驱安装linux,imdisk虚拟磁盘驱动器如何加载iso文件?大白菜ImDisk加载iso文件教程...
  7. 微信小程序图片上传组件
  8. 微服务网关选型,请收下我的膝盖!
  9. Awesome-Windows
  10. 如何下载国家自然科学基金申请书的模板