基于c++的ostu算法的实现
图像二值化算法是图像处理的基础。一般来说,二值化算法可以分为两个类别:全局二值化和局部二值化。全局二值化是指通过某种算法找到一个全局的阈值T,对图像中坐标为(x,y)的像素值做如下处理:
Ostu就是这样一种全局二值化算法,又叫最大类间方差。因为该算法会遍历图像中任意一个像素值i,计算当其为阈值时,图像的前景和背景图像(并不一定是真正的前景和背景,只是我们把当前小于i的记做背景,大于i的记做前景)的方差值。当方差值达到最大时,我们认为此时的i是该图像的全局阈值。
符号说明:
前景点数占图像比例:w0;平均灰度:u0
背景点数占图像比例:w1,平局灰度:u1
图像平均灰度:
前景和背景图像方差:
C++代码:
int ostu(Mat image)
{
cvtColor(image.clone(),image,CV_RGB2GRAY);
int width = image.cols;
int height = image.rows;
int x=,y=;
float ip1,ip2,is1,is2,w0,w1,mean1,mean2,mean,deltaTmp,deltaMax;
int pixelCount[];
int i, j, pixelSum = width * height, thres = ;
for(i = ; i < ; i++)
{
pixelCount[i] = ;
}
int pixel=;
for(i = ; i < height; i++)
{
for(j = ;j <width;j++)
{
pixel=image.at<uchar>(i,j);
pixelCount[pixel]++; }
}
//经典ostu算法,得到前景和背景的分割
//遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值
deltaMax=;
for(i = ; i < ; i++)
{
ip1=ip2=is1=is2=w0=w1=mean1=mean2=mean=deltaTmp=;
for(j = ; j < ; j++)
{
if(j <= i) //背景部分
{
ip1+=pixelCount[j]*j;
is1+=pixelCount[j];
} else
{
ip2+=pixelCount[j]*j;
is2+=pixelCount[j];
} } mean1=ip1/is1; //第一类像素平均灰度值
w0=(float)is1/(float)pixelSum;//第一类像素占整个图像比例
mean2=ip2/is2;
w1=-w0;
mean=w0*mean1+w1*mean2;
deltaTmp=w0*w1*(mean1-mean2)*(mean1-mean2);//灰度值为i的阈值的类间方差
if (deltaTmp>deltaMax)
{
deltaMax=deltaTmp;
thres=i;
}
}
return thres;
}
基于c++的ostu算法的实现的更多相关文章
- 基于 MPI 的快速排序算法的实现
完整代码: #include <iostream> #include <cstdlib> #include <ctime> #include <algorit ...
- 基于思岚A1激光雷达+OpenGL+VS2017的Ramer-Douglas-Peucker算法的实现
时隔两年 又借到了之前的那个激光雷达,最老版本的思岚A1,甚至不支持新的固件,并且转接板也不见了,看了下淘宝店卖¥80,但是官方提供了一个基于STM32的实现方式,于是我估摸着这个转接板只是一个普通的 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
- Alink漫谈(六) : TF-IDF算法的实现
Alink漫谈(六) : TF-IDF算法的实现 目录 Alink漫谈(六) : TF-IDF算法的实现 0x00 摘要 0x01 TF-IDF 1.1 原理 1.2 计算方法 0x02 Alink示 ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
- 图像数据到网格数据-2——改进的SMC算法的实现
概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...
- JavaScript与C#互通的DES加解密算法的实现(转)
本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
随机推荐
- 在线升级python3.3版本
1.sudo su 2.wget -P /usr/local http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz #指定下载到目录/ ...
- Shell--cut用法
cut是以每一行为一个处理对象的,这种机制和sed一样. cut接受三个定位方法: 1)byte: -b 2)characters: -c 3)fields: -d eg:提取第3,4,5,9的字节: ...
- SQL 注入、XSS 攻击、CSRF 攻击
SQL 注入.XSS 攻击.CSRF 攻击 SQL 注入 什么是 SQL 注入 SQL 注入,顾名思义就是通过注入 SQL 命令来进行攻击,更确切地说攻击者把 SQL 命令插入到 web 表单或请求参 ...
- 【LG1527】[国家集训队]矩阵乘法
[LG1527][国家集训队]矩阵乘法 题面 洛谷 题解 我也不知道为什么取个这样的名字... 其实就是区间\(kth\)扩展到二维 还是用整体二分搞啦,把树状数组换成二维的 其他的基本没有什么差别 ...
- Hadoop: Text类和String类的比较
一般认为Text类和String类是等价的,但二者之间其实存在着不小差别: 以<Hadoop权威指南>中的案例为例,给定字符串 String s = "\u0041\u00DF ...
- 3D Touch初探
伴着6S的发布,iOS 9.0开始支持3D Touch功能.使用场景来分一共有三种情况. 一.基于UIViewController的扩展 1. 首先要注册需要监听重按手势的 source view: ...
- hive 更改列的位置时遇到的问题
hive > desc formatted tb_fq; OK col_name data_type comment # col_name data_type comment name stri ...
- iOS 开发库相关(持续更新)
01-给任意view添加毛玻璃效果 https://github.com/JagCesar/iOS-blur 02-浮动式的textfield输入框(可用于登录界面) https://github ...
- Python零基础入门必知
Python自学知识点总结 //2018.10.09 1. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido ...
- MaxScript代码补全插件
MaxScript代码补全插件 作者Nik,原文发布于ScriptSpot 安装后max自带脚本编辑器会有自动补全,效果如下: