一、前言

Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为:

1)  先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量

2)  归一化直方图,也即将每个bin中像素点数量除以总的像素点

3)  i表示分类的阈值,也即一个灰度级,从0开始迭代

4)  通过归一化的直方图,统计0~i 灰度级的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例w0,并统计前景像素的平均灰度u0;统计i~255灰度级的像素(假设像素值在此范围的像素叫做背景像素) 所占整幅图像的比例w1,并统计背景像素的平均灰度u1;

5)  计算前景像素和背景像素的方差 g = w0*w1*(u0-u1) (u0-u1)

6)  i++;转到4),直到i为256时结束迭代

7)将最大g相应的i值作为图像的全局阈值

二、实现代码

Ostu算法实现函数为下面中的int getOstu(const Mat& in),其实在opencv中已经在threshold中实现了,下面代码也比较了两者的结果

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;#include <iostream>int getOstu(const Mat & in);int main()
{Mat img = imread("id_card.jpg" ,0);Mat img_high_Light = imread("id_card2.jpg" ,0);Mat  dst , dst_HL;if(img.empty()  | img_high_Light.empty()){std::cout<<"Error!!";return -1;}std::cout<<"The return value of getOstu is: "<<getOstu(img);std::cout<<"\n"<<"The return value of opencv threshold is: "<<threshold(img , dst ,0,255,CV_THRESH_OTSU);//opencv已实现的大津法imshow("光照均匀的原图像" ,img);imshow("图像光照均匀的处理结果" , dst);threshold(img_high_Light , dst_HL ,0,255,CV_THRESH_OTSU);imshow("光照不均匀的原图像" ,img_high_Light );imshow("图像光照不均匀的处理结果",  dst_HL);waitKey(0);return 0;
}int getOstu(const Mat & in)
{int rows = in.rows;int cols = in.cols;long size = rows * cols;float histogram[256] = {0};  for( int i = 0; i < rows; ++i) { //获取第 i行首像素指针 const uchar * p = in.ptr<uchar>(i); //对第i 行的每个像素(byte)操作 for( int j = 0; j < cols; ++j ) {histogram[int(*p++)]++; }}int threshold;      long sum0 = 0, sum1 = 0; //存储前景的灰度总和及背景灰度总和  long cnt0 = 0, cnt1 = 0; //前景的总个数及背景的总个数  double w0 = 0, w1 = 0; //前景及背景所占整幅图像的比例  double u0 = 0, u1 = 0;  //前景及背景的平均灰度  double variance = 0; //最大类间方差  double maxVariance = 0;  for(int i = 1; i < 256; i++) //一次遍历每个像素  {    sum0 = 0;  sum1 = 0;   cnt0 = 0;  cnt1 = 0;  w0 = 0;  w1 = 0;  for(int j = 0; j < i; j++)  {  cnt0 += histogram[j];  sum0 += j * histogram[j];  }  u0 = (double)sum0 /  cnt0;   w0 = (double)cnt0 / size;  for(int j = i ; j <= 255; j++)  {  cnt1 += histogram[j];  sum1 += j * histogram[j];  }  u1 = (double)sum1 / cnt1;  w1 = 1 - w0; // (double)cnt1 / size;  variance =  w0 * w1 *  (u0 - u1) * (u0 - u1);  if(variance > maxVariance)   {    maxVariance = variance;    threshold = i;    }   }    return threshold;
}    

OSTU(大津算法)相关推荐

  1. matlab大津法函数,根据OSTU大津法使用Matlab实现数字图像处理segmentation的graythresh函数...

    OSTU大津法算法思想: 一幅有depth个灰度级,根据每个灰度级t,可以将一幅图分为前景和背景. 前景指所有灰度级低于等于t的像素点,背景指大于t的像素点. w0指前景像素个数: w1指背景像素个数 ...

  2. 图像二值化----otsu(最大类间方差法、大津算法)(二)

    转自:http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算 ...

  3. otsu阈值分割算法_图像分割之大津算法(OTSU)

    关注公众号,获取更多信息 引言 最近一直在看图像二值化相关的东西,一直想寻找一个好的方法,能够自适应的设定阈值.这个过程中,发现了OTSU算法,其实这也算是基本的图像处理算法,之前有过接触,但是放过了 ...

  4. OTSU算法(也称最大类间差法,有时也称之为大津算法)

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

  5. opencv-qt大津算法(Otsu)

    opencv-qt大津算法(Otsu) 1 简介 2 算法原理 3 代码 4 局限性 5 参考 1 简介 Otsu算法,即大津算法,最大类间方差算法,由日本人大津展之提出.大津二值化法用来自动对基于聚 ...

  6. C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码

    1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...

  7. matlab大津法,大津算法(OTSU)

    大津算法(OTSU) 在图像处理领域,我们会遇到如下需求:把图像中的目标物体和背景分开.比如背景用白色表示,目标物体用黑色表示.此时我们知道目标物体的灰度值相互接近,背景灰度值相互接近,那么用大津算法 ...

  8. 大津算法的matlab实现

    大津算法详解 一.算法功能 ​ 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤. ​ 大津算法也称最大类间差法,由大津于1979 ...

  9. 大津算法(Nobuyuki Otsu method)

    时间:2020-12-02 目的:掌握图像分割的基础算法 1. 算法原理 图像分割,顾名思义将图像中的目标和背景进行区分.通常我们使用固定的阈值进行二值化,但是阈值如何迭代筛选.这个过程可不可以使用程 ...

  10. Otsu大津算法公式推导及python实现

    目录 前言 一.类间平方差是什么? 二.公式推导及实现 1.求类间平方差 2.opencv-python编程实现 2.1 引入图像并灰度化 2.2 查看灰度值的分布情况 2.3 求全局平均阈值 2.4 ...

最新文章

  1. Windows xp/2003 中安装虚拟网卡 Microsoft Loopback Adapter
  2. 数据库中间件mycat
  3. ogr 缓冲区_GDAL的几何操作
  4. 解释性语言和汇编性语言对比
  5. laravel redis_thinkphp+redis实现秒杀,缓存等功能
  6. 【sqoop】sqoop概念,功能,架构,版本
  7. 推荐时代的内容理解技术探索.pdf(附下载链接)
  8. Vivado中的Incremental Compile增量编译技术详解
  9. python程序格式框架的描述错误的是_关于 Python 程序格式框架的描述,以下选项中错误的是(       )...
  10. linux dropbox自动同步,Linux下DropBox定时同步备份文件
  11. YOLOV5改进||YOLOV5+GSConv+Slim Neck
  12. 300ETF期权和50ETF期权的区别
  13. codeforce 417D Cunning Gena (状压DP)
  14. Eclipse中LogCat打印出错信息分析
  15. flowchart流程图编程语言下载_流程图(flowchart)
  16. SAR成像系列:【8】合成孔径雷达(SAR)成像算法-压缩感知(Compressed Sensing,CS)成像算法(附Matlab代码)
  17. 如何判断当前浏览器是IE11
  18. Rich feature hierarchies for accurate object detection and semantic segmentation
  19. 信号处理:自相关和互相关
  20. 为什么苹果手机自带的邮件服务器,如何使用iPhone自带的邮件客户端管理企业邮箱?...

热门文章

  1. 从“海底捞”的管理模式看企业标准化管理流程的意义
  2. 蓝桥试题 算法训练 除法运算 JAVA
  3. 【项目总结】:怎样做一个牛逼的Team leader?
  4. Java中的四种访问修饰符:public、default、protect和private
  5. 常见的移动端支付密码框demo
  6. Map循环的几种方法
  7. Bootstrap实战练习---Web全栈工程师简历模版
  8. 深度学习:梯度消失和梯度爆炸的解决方法
  9. 土是独体字结构吗_什么叫独体结构
  10. pymysql安装问题