OpenCV - 最大间方差分割
转载请注明出处,谢谢.
1. OpenCV - 区域生长算法
2. OpenCV - 均值迭代分割
3. OpenCV - 最大间方差(OTUS)分割
4. OpenCV - 最大熵分割
OpenCV中其实有对OTUS算法的实现,threhold()函数最后一个参数可以指定使用OTUS算法。
1、最大间方差(OTUS)算法的描述
和均值迭代算法相似,OTUS算法也是利用图像的直方图进行的。OTUS算法的思想是选取一个阈值T,T∈[0,m−1]T, T \in [0,m-1],mm为图像的灰度级将直方图两部分,TT值使得分成的两组间方差最大。
2、算法的步骤
待处理图像灰度值范围为[0,m−1][0, m-1], 记灰度值为ii的像素个数为nin_{i}.
1. 统计待处理图像中像素灰度总和NN:
N=\sum_{i=0}^{m-1}n_{i}
2. 计算每个灰度值i,i∈[0,m−1]i, i \in [0,m-1]所占的概率:
p_{i}=\frac{n_{i}}{N}灰度均值 μ\mu:
\mu=\sum_{i=0}^{m-1}i*p_{i}
3. 取灰度值 T=0,‘1,...m−1T = 0 ,`1,... m-1,利用 TT将所有灰度分成两组C0=0...T−1C_{0}={0 ... T-1}和 C1=T...m−1C_{1}={T ... m-1},两组的均值和概率表示为:
第一类所占的概率:
w_{0} = \sum_{i=0}^{T-1}p_{i}
第一类的均值:
\mu_{0} = \sum_{i=0}^{T-1}\frac{i*p_{i}}{w_{0}}
第二类所占的概率:
w_{1} = \sum_{i=T}^{m-1}p_{i} = 1-w_{0}
第二类的均值:
\mu_{1} = \sum_{i=T}^{m-1}\frac{i*p_{i}}{w_{1}}
4. 计算两组间的方差:
\delta^{2} = w_{0}(\mu_{0}-\mu)^{2} + w_{1}(\mu_{1}-\mu)^{2}
5. 重复过程2 - 4,找到组间方差最大的灰度值 ii,使用ii对图像进行阈值分割即可。
3、OpenCV下的实现
Mat OstuSeg(Mat src)
{int tbHist[256] = {0}; //直方图数组double average = 0.0; //平均像素值double cov = 0.0; //方差double maxcov = 0.0; //方差最大值int index = 0; //分割像素值Mat dst;int nCol = src.cols * src.channels(); //每行的像素个数for (int i = 0; i < src.rows; i++){uchar* pData = src.ptr<uchar>(i);for (int j = 0; j < nCol; ++j){tbHist[pData[j]] += 1;}}int sum = 0;for (int i=0; i<256; ++i) sum += tbHist[i];double w0=0.0, w1=0.0, u0=0.0, u1=0.0;int count0 = 0;for (int i = 0; i < 255; ++i){u0 = 0;count0 = 0;for (int j=0; j<=i; ++j){u0 += j * tbHist[j];count0 += tbHist[j];}u0 = u0/count0;w0 = (float)count0/sum;u1 = 0;for (int j=i+1; j<256; ++j)u1 += j*tbHist[j];u1 = u1/(sum - count0);w1 = 1 - w0;cov = w0*w1*(u1-u0)*(u1-u0);if (cov > maxcov){maxcov = cov;index = i;}}cv::threshold(src, dst, index, 255, 0); //进行阈值分割return dst.clone();
}
4、拓展
和上一篇所述一样,如果我们需要分割的物体并不是规则的矩形,那么任然可以采用在直方图中将我们已知的无效像素去掉。
OpenCV - 最大间方差分割相关推荐
- 基于OTSU最大类间方差法的ROI分割、提取图像中的形状特征--面积、周长、离心率、zernike矩
分享一下最近学习的图像分类方面知识,整体的思路如下(之前的汇报ppt里截的) 把这个过程拆分几个部分共同学习一下吧 1.Otsu法原理 最大类间方差法OTSU是一种自适应的全局阈值确定的方法,根据灰度 ...
- 数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
文章目录 一.实验目的 二.实验原理 (一) 阈值分割 1. 直方图法 2.OTSU法(最大类间方差法)确定阈值 3. 迭代阈值法 4. 点检测 (二)边缘检测 三.实验内容 (一)阈值分割 1. 直 ...
- opencv与C++实现最大类间方差法(OTSU)进行图像二值化
直接上代码,使用最大类间方差法进行二值化的函数 void threshold_otsu(Mat &mat, Mat &mat_thresh) //mat为输入图像,mat_thresh ...
- 图像二值化----otsu(最大类间方差法、大津算法)(二)
转自:http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算 ...
- 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 最大类间方差(大津法)详解
参考: https://www.cnblogs.com/xiaomanon/p/4110006.html 一.算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫 ...
- Ostu最大类间方差法的C++实现
一.Ostu的原理 最大类间方差法是由日本学者大津(Nobuyuki Ostu)在1979年提出的,该方法根据计算公式自动计算分割单域值,是一种根据灰度图像自动计算阈值的方法.它按照灰度图像的灰度值等 ...
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
最新文章
- mysql四-2:多表查询
- 用DFS 解决全排列问题的思想详解
- SpringBoot实现注册时头像上传与下载
- 暴力求解——最大乘积 Maximum Product,UVa 11059
- ajax 跨域请求api_【.NET Core 3.0】框架之十二 || 跨域 与 Proxy
- 【算法分析与设计】辗转相除法
- leetcode - 264. 丑数 II
- 三十分钟包会——正则表达式
- python开发之路---第二模块--OS模块
- 江湖二三事:听说你想做数据分析师?
- python读取二进制文件,转成十六进制格式
- Gson解析json数据
- 解决织梦CMS后台验证码不正确的四种方法
- 【Element-ui 踩坑记录 2022/10/31】
- Python dataframe绘制饼图_基于Python的图表绘图系统matplotlib,“饼图“”你真了解吗?...
- 迅雷磁盘缓存设置过高会影响其它网络应用软件的速度
- Tomcat 到底干了啥
- skylake服务器CPU型号芯片,Skylake与Kaby Lake顶级处理器到底有多大差别?Intel i7-7700K评测...
- 《我们应当怎样做需求分析》读书笔记
- 王道论坛《计算机网络》网课学习笔记
热门文章
- oracle 财报2017q2,唯品会发布2017Q2财报:净营收突破175亿
- HAProxy讲解及HAProxy 负载 mysql 集群
- python异常数据处理_Python 异常处理和捕获信息教程
- 基于6s模型的遥感影像大气校正方法
- 还在找游戏本推荐排行榜?这款游戏本才是你的菜!
- FSC® COC森林认证将增加ILO劳工要求标准
- 软考高项学习教程【第一阶段】:第1章-信息系统开发基础【考点笔记1】
- yolov5 从配置环境到自己训练数据集合
- 什么是人心?人心是义利的结合体
- 三洋服务器r系列和q系列区别,【经验分析】三菱Q系列和FX PLC系列的区别