opencv中有多种方法进行图像的二值化,前面的3中直接设置二值化的阈值,比较粗暴无脑,而且用人眼看的话根本看不出来最佳阈值,因此人为的设置阈值是一种很不科学不严谨的方法,在opencv中ostu二值化应用很多。它是二值化中的一种高效算法,如果不了解ostu这种经典的二值化法就不能说是学习过opencv。

算法原理

首先从原理说起,这个ostu并不是完成最终的图像二值化,而是计算出二值化最合理最优化的分割阈值,从而实现完美二值化。首先需要将图片分为前景和背景,也就是将图片处理为非黑即白的二值化,白色定为前景,黑色定为背景,关键是要找出划分前景背景的分割值,因此将图像分为0~255共256个灰度级,这里可以将图像理解为一个256层像素平面叠加而成的整体,每一层代表一个灰度级即像素值。这里引入方差的概念,方差是各个数据与平均数之差的平方的平均数,反映的是数据之间的偏离程度,方差越大,偏离程度就越大,从而容易区分不会混淆,使得二值化图像黑白分明易于分析,这也是最优二值化的目的。而算法的关键就是找出方差最大时的像素值,定为二值化的分割阈值,并返回。

算法步骤

  1. 确定0~255各个像素值的数量
  2. 计算各灰度级的比例,也叫作归一化
  3. 定义一个变量th表示分割的阈值,从0开始迭代,计算0~th灰度级像素比例和,定义为u1,0~th灰度级的像素组合定为前景,计算前景像素值的平均灰度ave1,同样计算th~255(背景)的比例和u2,并计算平均灰度ave2。(比例也可以说成概率)
  4. 计算前景与背景的方差var,公式为:var=u1*u2*(ave1-ave2)^2。
  5. th从0开始遍历,th每取一个值就会产生一个方差,找到方差最大时对应的th,该th就是要返回的分割阈值。

代码如下

#include"iostream"
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;
using namespace std;
int GetThreshold(Mat img){int imgrow = img.rows;int imgcol = img.cols;int threshold = 0;int pixnum[256];float pixpro[256];//初始化为0for(int i=0;i<256;i++){pixnum[i] = 0;pixpro[i] = 0;}//计算每个像素值的数量for(int j=0;j<imgrow;j++){for(int i=0;i<imgcol;i++){pixnum[(int)img.at<uchar>(j,i)]++;}}//计算各个像素值所占的比例for(int i=0;i<256;i++){pixpro[i] = (float)pixnum[i]/(imgcol*imgrow);}//计算方差,对应步骤3,4float u1,u2,ave1,ave2,mathexp1,mathexp2,vartemp;double varmax=0;for(int th=0;th<256;th++){    //th定义为最佳分割阈值,开始遍历u1=u2=ave1=ave2=mathexp1=mathexp2=0;for(int i=0;i<256;i++){if(i<th){     //归为前景u1 += pixpro[i];  //计算前景概率之和mathexp1 += i*pixpro[i];   //数学期望}else{  u2 += pixpro[i];mathexp2 += i*pixpro[i];}}ave1 = mathexp1/u1;ave2 = mathexp2/u2;vartemp=(float)(u1*u2*(ave1-ave2)*(ave1-ave2));if(vartemp>varmax){varmax = vartemp;threshold = i;}}return threshold;
}

这里仅是返回值的函数,得到分割阈值,完整的代码需要加入另外的代码,https://blog.csdn.net/yuan123890/article/details/107238610,将该篇文章中的灰度化函数和二值化函数加入,主程序如下

void main(){Mat img = imread("ck567.jpg",IMREAD_COLOR);Mat gray = BGR2GRAY(img);Mat out = Binaryzation(gray,GetThreshold(gray));imshow("sample",out);waitKey(0);destroyAllWindows();
}

效果如下,可与上述链接中的图片进行对比,ostu的算法可以得到最佳分割阈值。

opencv学习5——大律二值化(ostu)相关推荐

  1. 大津二值化算法 ( Otsu's binarization ) 自动确定二值化图像时的阈值

    大津算法,也被称作最大类间方差法,是一种自动确定二值化阈值的算法. 在这里作者不介绍算法推导的过程,算法推导过程网络上有许多介绍,这里只给出算法最终推导出的结论: 使得左侧 的值最大,就可以得到最好的 ...

  2. otsu阈值分割算法原理_大津二值化算法OTSU的理解

    otsu 大津算法介绍: OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 利用阈值将原图像分成前景,背景两个图象. 前景:用n1,csum,m1来表示在当前阈值下的 ...

  3. C++实现大津二值化算法

    文章目录 一.大津算法 二.原理 三.算法实现步骤 四.测试结果 五.完整代码 一.大津算法 大津算法(Ostu)也称最大类间方差法.顾名思义,就使两个类别之间某个属性的方差最大的方法.在图像处理中, ...

  4. java用opencv实现滤镜_opencv滤镜-二值化实现黑白滤镜

    黑白滤镜 黑白滤镜非常简单,顾名思义就是图像只有黑色与白色,这实际上就是图像的二值化.实现的原理也非常地简单,设定一个阈值,假设为128,判断每个像素点的灰度值,大于128设为255(对应白色),小于 ...

  5. 【图像处理】Qt+OpenCV自制mini软件——图像二值化器

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前段时间杂事很多,这几天突然觉得自己有段时间没有碰Qt了,手有点生了.心血来潮,花了两 ...

  6. OSTU大律法二值化原理

    介绍 Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为: 1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个 ...

  7. 大津二值化算法(Otsu)

    1. 简介 我们在最灰度图做二值化时,需要设定一个分割阈值,我们并没有一个万能的阈值.而Otsu大津算法则是根据灰度图本身的信息,自动确定最佳阈值,实现以最佳阈值对灰度图进行二值化. 需要注意的是,大 ...

  8. 数字图像处理(四)大津二值化

    题目:使用大津二值化算法进行二值化时阈值的确定. 采用国际标准测试图像Lena. 算法原理 我们在对图片进行二值化时,是希望将图片分割成两部分,称之为前景和背景.一般情况下,我们将感兴趣的部分称为前景 ...

  9. opencv 图像分割 阈值分割 图像二值化 灰度图

    # -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...

最新文章

  1. 洛谷 题解 CF910C 【Minimum Sum】
  2. 解决properties文件乱码问题(eclipse和MyEclipse)
  3. boost::mpl::for_each相关的测试程序
  4. 渐进式web应用程序_如何在渐进式Web应用程序中添加到主屏幕
  5. Python(27)-模块
  6. 分区 主分区 和 扩展分区_等和分区
  7. Jeecgboot Feign、分布式压测、分布式任务调度
  8. Find Minimum in Rotated Sorted Array leetcode java
  9. 求二叉树中某结点的父结点(左右孩子表示法)
  10. 小白如何连续两年美赛斩获M奖
  11. Ae:Roto 笔刷和调整边缘
  12. JDK动态代理原理解析
  13. 80端口为什么要备案_成都为什么要登记icp备案需要多久
  14. 将服务注册到eureka服务端
  15. 如果编程语言是一门武功绝学,那么汇编、C语言······
  16. DEFCON携手百度安全落地中国,打造国际化网络安全交流平台
  17. 围城---一段不错的观后感
  18. Scala study
  19. SCRUM项目 4.0
  20. OpenCV Mat类详解和用法

热门文章

  1. 可能这些是你想要的 H5 软键盘兼容方案
  2. 儿童护眼灯什么牌子好点?护眼灯品牌排行榜
  3. 中兴通讯与中国电信,联合发布家端新品
  4. 什么是AES加密?详解AES加密算法原理流程
  5. python 定时自动爬取_python怎么定时爬取数据及将数据以邮件发送
  6. 关于Vant Weapp中组件引入未找到的解决方案
  7. 一种增强型鲸鱼优化算法
  8. HTML 5 video 视频标签全属性详解
  9. Shell 编程 - 学习/实践
  10. Dede Cms系统提示方式修改以及ShowMsg函数说明