opencv-qt大津算法(Otsu)
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)=Σ0tp(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)=[Σ0tp(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)相关推荐
- C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码
1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...
- matlab大津法,大津算法(OTSU)
大津算法(OTSU) 在图像处理领域,我们会遇到如下需求:把图像中的目标物体和背景分开.比如背景用白色表示,目标物体用黑色表示.此时我们知道目标物体的灰度值相互接近,背景灰度值相互接近,那么用大津算法 ...
- 图像二值化----otsu(最大类间方差法、大津算法)(二)
转自:http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算 ...
- OTSU算法(也称最大类间差法,有时也称之为大津算法)
在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...
- opencv 大津算法讲解与实现
大津算法原理 在 opencv 中对图像进行二值化的过程中我们可能会使用大津算法,大津算法的主要作用是分割前景与背景部分区域,先将图像灰度化,假设图像有 [0,255] 个灰度等级,在数学中有方差这个 ...
- OTSU(大津算法)
OTSU(大津算法) 确定图像二值化分割阈值 不受图像亮度和对比度的影响 用于图像分割过程中,自动计算出一个最佳全局阈值的算法 通过最大类间平方差的方法来区分图像前景及背景 缺点 对图像噪声敏感 只能 ...
- otsu阈值分割算法原理_大津法---OTSU算法
简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...
- otsu阈值分割算法_图像分割之大津算法(OTSU)
关注公众号,获取更多信息 引言 最近一直在看图像二值化相关的东西,一直想寻找一个好的方法,能够自适应的设定阈值.这个过程中,发现了OTSU算法,其实这也算是基本的图像处理算法,之前有过接触,但是放过了 ...
- 大津算法(Nobuyuki Otsu method)
时间:2020-12-02 目的:掌握图像分割的基础算法 1. 算法原理 图像分割,顾名思义将图像中的目标和背景进行区分.通常我们使用固定的阈值进行二值化,但是阈值如何迭代筛选.这个过程可不可以使用程 ...
最新文章
- 【转】JavaScript事件顺序
- Swift中如何重新懒加载
- linux 下ab压力测试
- Java IO流学习总结二:File
- php视频流传输,视频流传输协议RTP/RTCP/RTSP/HTTP的区别
- angular上传图片_如何使用Angular轻松上传图片
- 骁龙855加持!OPPO Reno正面照揭晓:边框窄得吓人
- eclipse报错:An error has occurred. See error log for more details. java.lang.NullPointerException
- Android 可以输入的下拉框
- tsplay 打流,EasyICE测试
- java启动另一个程序_Java操作另一个Java程序使其重启的简单实现
- 今天起,上海用户可以用滴滴App免费打无人车了
- 机器学习_深度学习毕设题目汇总——语音
- 【Scratch-外观模块】像素化特效指令
- KRnano打开黑屏: FATAL ERROR,【解决办法】
- AUTOSAR开发工具DaVinci Configurator里的Modules
- Git自己分支合并dev分支
- 【锂电池容量预测】基于matlab灰狼算法优化LSTM神经网络锂电池容量预测【含Matlab源码 2004期】
- 是命运不济是运气不好都可以
- “信息科技“ 纳入义务教育,少儿编程程首选项