Ostu最大类间方差法的C++实现
一、Ostu的原理
最大类间方差法是由日本学者大津(Nobuyuki Ostu)在1979年提出的,该方法根据计算公式自动计算分割单域值,是一种根据灰度图像自动计算阈值的方法。它按照灰度图像的灰度值等级属性,将图像256个灰度级自动划分成背景点和目标点两部分,即计算出一个合适的中间值k,将图像256个灰度级分为两部分。算法分类的原理是使背景和目标之间的类间方差最大,因为背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,错分的可能性越小。
类间方法ggg的计算公式为:
g=w1∗w−2∗(u1−u2)2g=w_1*w-2*(u_1-u_2)^2 g=w1∗w−2∗(u1−u2)2
其中:w1w_1w1为目标像素点占整幅图像的比例,u1u_1u1为其平均灰度,w2w_2w2为背景像素点占整幅图像的比例,u2u_2u2为其平均灰度。通过公式计算得到的ggg也就是类间方差最大值,即这副图像的自适应阈值。
二、基于OpenCV的C++程序
int otsu(Mat image)
{int width = image.rows, height = image.cols, threshold = 0;int pixelCount[256];float pixelPro[256];//初始化for (int i = 0; i < 256; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//统计灰度级中每个像素在整幅图像中的个数for (int i = 0; i < width; i++){for (int j = 0; j < height; j++){pixelCount[image.at<uchar>(i,j)]++;}}//计算每个像素在整幅图像中的比例for (int i = 0; i < 256; i++){pixelPro[i] = (float)(pixelCount[i]) / (float)(width*height);}//经典ostu算法,得到前景和背景的分割//遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for (int i = 0; i < 256; i++){w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for (int j = 0; j < 256; j++){if (j <= i) //背景部分{//以i为阈值分类,第一类总的概率w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else //前景部分{//以i为阈值分类,第二类总的概率w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0; //第一类的平均灰度u1 = u1tmp / w1; //第二类的平均灰度u = u0tmp + u1tmp; //整幅图像的平均灰度//计算类间方差deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);//找出最大类间方差以及对应的阈值if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}//返回最佳阈值;return threshold;
}
void main()
{cv::Mat diff_image, binary_image;diff_image = imread("..//xx", 0); //读取灰度图int threshold = otsu(diff_image); //得到阈值cv::threshold(diff_image, binary_image, threshold, 255, THRESH_BINARY); //二值化imshow("binary_image", binary_image);
}
Ostu最大类间方差法的C++实现相关推荐
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
- 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 基于OTSU最大类间方差法的ROI分割、提取图像中的形状特征--面积、周长、离心率、zernike矩
分享一下最近学习的图像分类方面知识,整体的思路如下(之前的汇报ppt里截的) 把这个过程拆分几个部分共同学习一下吧 1.Otsu法原理 最大类间方差法OTSU是一种自适应的全局阈值确定的方法,根据灰度 ...
- 最大类间方差法(大津法OTSU)原理
算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...
- opencv与C++实现最大类间方差法(OTSU)进行图像二值化
直接上代码,使用最大类间方差法进行二值化的函数 void threshold_otsu(Mat &mat, Mat &mat_thresh) //mat为输入图像,mat_thresh ...
- 基于遗传算法的二维最大类间方差法的图像分割优化
一.背景 最大类间方差阈值分割法日本大津展之在1980年提出的,其基本思路是将图像的直方图以某一灰度为阈值,将图像分成两组并计算两组的方差,当被分成的两组之间的方差最大时,就以这个灰度值为國值分割图像 ...
- 数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
文章目录 一.实验目的 二.实验原理 (一) 阈值分割 1. 直方图法 2.OTSU法(最大类间方差法)确定阈值 3. 迭代阈值法 4. 点检测 (二)边缘检测 三.实验内容 (一)阈值分割 1. 直 ...
- 最大类间方差法Ostu的C++实现
① 设灰度级为L,灰度值i的像素出现的频数为.分别为所纷呈的两个像素类的面积比,即 ② 分别为两个像素类的平均灰度值,即 ③计算类间方差,并找出最大类间方差以及对应的阈值. ④ 求为最大值时的t,作为 ...
最新文章
- 《C#与.NET 3.5高级程序设计(第4版)》有奖书评征集活动
- 单用户模式迁移home家目录
- [hdu1847]博弈,推理
- css鼠标悬停样式_利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标
- 03 渲染元素ReactDOM.render
- [luoguP4142]洞穴遇险
- Windows 系统补丁管理策略
- oracle database 11g plsql 程序设计,oracle-database-11g-plsql-编程实战笔记
- 程序设计与算法----动态规划之最长公共子序列
- html 如何实现一条竖线边上有 刻度_Android H5交互Webview实现localStorage数据存储
- 华为mate10手机听筒测试软件,华为mate 10功能说:这几个设置,让你通话体验直线上升,简直了!...
- javaweb中解决中文乱码问题
- [渝粤教育] 西南石油大学 普通地质学 参考 资料
- lucene 学习笔记之飞龙在天
- 关于2012(世界末日)
- 2021年终总结——工作第四年
- 移动硬盘位置不可用参数错误的解决方法
- 实战:Traefik 高级配置3-2022.1.23
- 浅谈在软件开发中的开发与测试 - 下
- python requests cookie处理