opencv-qt大津算法(Otsu)

  • 1 简介
  • 2 算法原理
  • 3 代码
  • 4 局限性
  • 5 参考

1 简介

Otsu算法,即大津算法,最大类间方差算法,由日本人大津展之提出。大津二值化法用来自动对基于聚类的图像进行二值化, 或者说,将一个灰度图像退化为二值图像。

算法假定该图像根据双模直方图(前景像素和背景像素)包含两类像素,于是它要计算能将两类分开的最佳阈值,使得它们的类内方差最小;由于两两平方距离恒定,所以即它们的类间方差最大。因此,大津二值化法粗略的来说就是一维Fisher判别分析的离散化模拟。(这段来自wikipedia)

2 算法原理

在大津算法中,我们穷举搜索能使类内方差最小的阈值,定义为两个类的方差的加权和:
σw2(t)=ω1(t)σ12(t)+ω2(t)σ22(t)\sigma _{w}^{2}(t) = \omega _{1}(t) \sigma _{1}^{2}(t)+\omega _{2}(t)\sigma _{2}^{2}(t) σw2​(t)=ω1​(t)σ12​(t)+ω2​(t)σ22​(t)
权重 ωi\omega_{i}ωi​是被阈值 ttt 分开后两个类的概率,而σi2\sigma_{i}^{2}σi2​是这两个类的方差。

大津证明了最小化类内方差和最大化类间方差是相同的,

σb2(t)=σ2−σw2(t)=ω1(t)ω2(t)[μ1(t)−μ2(t)]2\sigma _{b}^{2}(t)=\sigma ^{2}-\sigma _{w}^{2}(t)=\omega _{1}(t)\omega _{2}(t)\left[\mu _{1}(t)-\mu _{2}(t)\right]^{2}σb2​(t)=σ2−σw2​(t)=ω1​(t)ω2​(t)[μ1​(t)−μ2​(t)]2
用类概率 ωi\omega _{i}ωi​ 和类均值 μi\mu _{i}μi​来表示。

类概率 ω1(t)\omega _{1}(t)ω1​(t) 用阈值为 ttt 的直方图计算:
ω1(t)=Σ0tp(i)\omega _{1}(t)=\Sigma _{0}^{t}p(i)ω1​(t)=Σ0t​p(i)
而类均值 μ1(t)\mu _{1}(t)μ1​(t)为:
μ1(t)=[Σ0tp(i)x(i)]/ω1\mu _{1}(t)=\left[\Sigma _{0}^{t}p(i)\,x(i)\right]/\omega _{1}μ1​(t)=[Σ0t​p(i)x(i)]/ω1​
x(i)x(i)x(i)为直方图中第i个灰度值对应的binbinbin中数量。

3 代码

//获取灰度图像直方图
//src 灰度图像
//histo 直方图记录数组
void getHistogram(Mat& src,long* histo)
{if (src.data == NULL)return;int rows = src.rows;int cols = src.cols;for (int i=0;i<rows;i++){uchar* p = src.ptr<uchar>(i);for (int j=0;j<cols;j++){histo[p[j]]++;}}return;
}
//Otsu获得分割阈值
//histo直方图
//totals 总的像素数量
int getOtsuThreshold(long* histo, long totals)
{//先计算一个累计概率直方图double histoP[256] = {0};histoP[0] = histo[0]*1.0 / totals;for (int i=1;i<256;i++){histoP[i] = histoP[i-1] + histo[i]*1.0 / totals;}//再计算累计期望直方图pi*xidouble mean[256] = {0};mean[0] = histoP[0]*histo[0];for (int i=1;i<256;i++){mean[i] = mean[i-1] + histoP[i]*histo[i];}//mena[255]即为整个直方图的期望int t0 = 0; //返回的阈值//<=t为一类,>t为另一类double w1,w2,u1,u2,std2;std2 = 0;double temp;for (int t=0;t<256;t++){w1 = histoP[t];w2 = 1 - w1;u1 = mean[t] / w1;u2 = (mean[255]-w1 * u1) / w2;temp = w1 * w2 * pow((u1 - u2),2); //当前t分类的类间方差if (std2 < temp){std2 = temp;t0 = t;}}return t0;
}

4 局限性

如果直方图可以假定为具有双峰分布,并且假定在两个峰之间具有深而尖锐的谷底,则Otsu的方法将表现出相对较好的性能。但是,如果图像被加性噪声严重破坏,或者很难区分前景和背景,则灰度直方图没有锐利谷值,Otsu方法分割效果较差。

5 参考

https://en.wikipedia.org/wiki/Otsu%27s_method

opencv-qt大津算法(Otsu)相关推荐

  1. C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码

    1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...

  2. matlab大津法,大津算法(OTSU)

    大津算法(OTSU) 在图像处理领域,我们会遇到如下需求:把图像中的目标物体和背景分开.比如背景用白色表示,目标物体用黑色表示.此时我们知道目标物体的灰度值相互接近,背景灰度值相互接近,那么用大津算法 ...

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

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

  4. OTSU算法(也称最大类间差法,有时也称之为大津算法)

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

  5. opencv 大津算法讲解与实现

    大津算法原理 在 opencv 中对图像进行二值化的过程中我们可能会使用大津算法,大津算法的主要作用是分割前景与背景部分区域,先将图像灰度化,假设图像有 [0,255] 个灰度等级,在数学中有方差这个 ...

  6. OTSU(大津算法)

    OTSU(大津算法) 确定图像二值化分割阈值 不受图像亮度和对比度的影响 用于图像分割过程中,自动计算出一个最佳全局阈值的算法 通过最大类间平方差的方法来区分图像前景及背景 缺点 对图像噪声敏感 只能 ...

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

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

  8. otsu阈值分割算法_图像分割之大津算法(OTSU)

    关注公众号,获取更多信息 引言 最近一直在看图像二值化相关的东西,一直想寻找一个好的方法,能够自适应的设定阈值.这个过程中,发现了OTSU算法,其实这也算是基本的图像处理算法,之前有过接触,但是放过了 ...

  9. 大津算法(Nobuyuki Otsu method)

    时间:2020-12-02 目的:掌握图像分割的基础算法 1. 算法原理 图像分割,顾名思义将图像中的目标和背景进行区分.通常我们使用固定的阈值进行二值化,但是阈值如何迭代筛选.这个过程可不可以使用程 ...

最新文章

  1. 【转】JavaScript事件顺序
  2. Swift中如何重新懒加载
  3. linux 下ab压力测试
  4. Java IO流学习总结二:File
  5. php视频流传输,视频流传输协议RTP/RTCP/RTSP/HTTP的区别
  6. angular上传图片_如何使用Angular轻松上传图片
  7. 骁龙855加持!OPPO Reno正面照揭晓:边框窄得吓人
  8. eclipse报错:An error has occurred. See error log for more details. java.lang.NullPointerException
  9. Android 可以输入的下拉框
  10. tsplay 打流,EasyICE测试
  11. java启动另一个程序_Java操作另一个Java程序使其重启的简单实现
  12. 今天起,上海用户可以用滴滴App免费打无人车了
  13. 机器学习_深度学习毕设题目汇总——语音
  14. 【Scratch-外观模块】像素化特效指令
  15. KRnano打开黑屏: FATAL ERROR,【解决办法】
  16. AUTOSAR开发工具DaVinci Configurator里的Modules
  17. Git自己分支合并dev分支
  18. 【锂电池容量预测】基于matlab灰狼算法优化LSTM神经网络锂电池容量预测【含Matlab源码 2004期】
  19. 是命运不济是运气不好都可以
  20. “信息科技“ 纳入义务教育,少儿编程程首选项

热门文章

  1. Java常见面试题 Java面试必看 (一)
  2. 简述你计划使用的应用开发框架,及该框架的特点
  3. 如何通过二维码下载安卓软件(.APK文件)
  4. 求解非齐次线性方程组算法
  5. 使用浏览器调试前端的必备技巧
  6. excel学习——相对引用、绝对引用、混合引用
  7. 基于uni-app开发的仿奈雪の茶小程序前端模板
  8. week9 - B - 东东学打牌
  9. 毕业设计-基于微信小程序的在线考试系统
  10. wireshark 抓 蓝牙数据_利用nRF Sniffer对蓝牙BLE通信数据进行嗅探和分析