最大类间方差法(大津法OTSU)

2023-10-27

算法介绍

最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小[1]。

记T为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1,图像的总平均灰度为u,前景和背景图象的方差g,则有:

下面方差g的计算可以参考最原始的方差公式

不难发现是Xi减去平均数,所有的概率值都是1/n,而下面的g的计算其实就是对应的概率值发生了变化,从1/n变为了对应的w0和w1。

还有一个条件那就是w0+w1=1 

 公式化简推导:

当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度T是最佳阈值。类间方差法对噪声以及目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时(例如受光照不均、反光或背景复杂等因素影响),类间方差准则函数可能呈现双峰或多峰,此时效果不好。直接用OTSU算法处理自然场景铭牌图片的部分结果实例如下:

                                                                                 图1.最大类间方差法二值化结果

代码实现

(C语言版,VS2012+opencv249)

#include "stdio.h"
#include "cv.h"
#include "highgui.h"
#include "Math.h"

int Otsu(IplImage* src);

int main()
{
    IplImage* img = cvLoadImage("lena.jpg",0); //获取灰度图像img
    IplImage* dst = cvCreateImage(cvGetSize(img), 8, 1);
    int threshold = Otsu(img); //调用大津法求出最佳阈值
    printf("otsu threshold = %d\n", threshold);
    cvThreshold(img, dst, threshold, 255, CV_THRESH_BINARY); //用otsu的阈值二值化

    cvNamedWindow( "img", 1 );
    cvNamedWindow( "dst", 1 );
    cvShowImage("img", img);
    cvShowImage("dst", dst);


    cvWaitKey(-1);

    cvReleaseImage(&img);
    cvReleaseImage(&dst);

    cvDestroyWindow( "img" );
    cvDestroyWindow( "dst" );

    return 0;
}

int Otsu(IplImage* src)  
{  
    int height=src->height;  
    int width=src->width;      

    //histogram  
    float histogram[256] = {0};  
    for(int i=0; i < height; i++)
    {  
        unsigned char* p=(unsigned char*)src->imageData + src->widthStep * i;  
        for(int j = 0; j < width; j++) 
        {  
            histogram[*p++]++;  
        }  
    }  

    //normalize histogram & average pixel value 
    int size = height * width;  
    float u =0;
    for(int i = 0; i < 256; i++)
    {  
        histogram[i] = histogram[i] / size;  
        u += i * histogram[i];  //整幅图像的平均灰度
    }  

    int threshold;    
    float maxVariance=0;  
    float w0 = 0, avgValue  = 0;
    for(int i = 0; i < 256; i++) 
    {  
        w0 += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度像素所占整幅图像的比例即前景比例
        avgValue  += i * histogram[i]; //avgValue/w0 = u0

        float t = avgValue/w0 - u;  //t=u0-u
        float variance = t * t * w0 /(1 - w0);  
        if(variance > maxVariance) 
        {  
            maxVariance = variance;  
            threshold = i;  
        }  
    }  

    return threshold;  
} 

代码运行结果: 

 

                                                                                图2.otsu程序运行结果

代码下载:http://download.csdn.net/detail/u011285477/9584189

博客链接:http://blog.csdn.net/u011285477/article/details/52004513

参考资料: 
[1]Otsu N. A threshold selection method from gray-level histograms[J]. Automatica, 1975, 11(285-296): 23-27.

[2] https://www.cnblogs.com/guopengfei/p/4759569.html

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大类间方差法(大津法OTSU) 的相关文章

随机推荐

  • Docker 无法使用Vi/Vim/Gedit

    当在ubuntu下 使用docker container 时 想要编辑一些文件 但是docker登陆后 无法安装vim 无法使用apt get命令 所以可以考虑另一种方法 即在本地修改好文件 把文件拷贝覆盖到docker 使用以下命令 do
  • 记录第一篇被”华为开发者联盟鸿蒙专区 “收录的文章

    记录第一篇被 华为开发者联盟鸿蒙专区 社区收录的文章 坚持写作的动力是什么 是记录 分享 以及更好的思考
  • Qt自学笔记-自定义信号和槽(传智教育)

    一 新建项目 1 项目名称 02 SignalAndSlot 建立一个空窗口 基类 Qwidget 名称Widget 先运行一下第一个空窗口 检查一下代码 2 根据需求在项目上创建新文件 2 1 第一个文件 Teacher 不是一个控件 因
  • LeetCode(Python)——回文数(简单)

    回文数 概述 给你一个整数 x 如果 x 是一个回文整数 返回 true 否则 返回 false 回文数是指正序 从左向右 和倒序 从右向左 读都是一样的整数 输入 x 121 输出 true 输入 x 121 输出 false 输入 x
  • PAT 7 三羊献瑞(dfs)

    三羊献瑞 观察下面的加法算式 祥 瑞 生 辉 三 羊 献 瑞 三 羊 生 瑞 气 其中 相同的汉字代表相同的数字 不同的汉字代表不同的数字 请你填写 三羊献瑞 所代表的4位数字 答案唯一 不要填写任何多余内容 答案 9分 f1
  • SPSS实现Fleiss Kappa与分析(也可利用公式计算)

    1 简单介绍 机器学习中涉及新数据集发布的论文通常会描述数据集的构建过程 一份数据集往往由多位标注员共同完成 不同标注员对数据的理解很容易存在偏差 这极大程度上会影响数据集的一致性 从而限制算法的性能 因此在构建数据集的标注过程中 大多数构
  • 解决:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' execu

    在准备写个脚本去爬取网易云歌曲信息时 用selenium去戳 这里采用的是chrome浏览器 链接网页时报错 File C Python37 lib site packages selenium webdriver chrome webdr
  • python日志文件

    version 1 disable existing loggers False root level ERROR handlers console propagate False loggers infoFileLogger level
  • windows任务计划程序拒绝访问

    问题现象 在windows任务计划程序中添加脚本程序 执行相应脚本 报了拒绝访问和创建目录需要输入参数问题 问题分析 没有权限执行脚本 问题解决 除了填写相应位置的脚本之外 还需要填写起始于的脚本所在路径
  • Qt系列文章之 Qt Model Class

    Qt Model Class Qt提供了一些列相互继承的Model类体系 Qt的Model类是对用户数据进行体系化封装并提供统一操作接口的一大类模块 Qt提供的模型类十分多 大致可以分为三种 不可实例化的抽象基类 代理模型类和可实例化模型类
  • 【Python习题集5】函数的设计

    函数的设计 一 实验内容 二 实验总结 一 实验内容 1 编写两个函数分别按单利和复利计算利息 根据本金 年利率 存款年限得到本息和和利息 调用这两个函数计算1000元在银行存3年 在年利率是6 的情况下 单利和复利分别获得的本息和和利息
  • 首次使用阿里云云效拉取代码

    首先 需要公司给权限 把你加入公司项目团队 其次 使用公司给的阿里云账号 密码去登录 登录https codeup aliyun com 通过公司人员给开的权限点击加入团队 使用RAM用户登录 输入阿里云账号 点击下一步3 输入阿里云密码
  • Unity与VisualStudio关联配置

    默认已经正确安装UnityHub和VisualStudio 本文环境为Unity2020 3 4f1c1 和 VisualStudio2019 简略 VisualStudio安装VisualStudio Tools for Unity Un
  • jquery 页面刷新

    页面加载时绑定按钮点击事件 function 按钮id click function refresh 点击按钮调用的方法 function refresh window location reload 刷新当前页面 或者下方刷新方法 par
  • SpringBoot——加载测试专用属性

    简单介绍 在之前的时候我们使用过配置文件添加配置 使用过IDEA添加属性配置 使用过命令行添加临时属性配置 在测试中 也可以设置专用于测试的临时配置属性 使用方法 首先打开SpringBoot中默认创建好的测试类 打开之后会在主类上看到一个
  • 微信公众号+Vue+JS-SDK配置注册失败,显示config:fail,Error: 系统错误,错误码:63002,invalid signature等解决方法

    用vue做微信公众号调用js sdk遇到的问题 问题1 JS SDK在IOS中报签名无效invalid signature 解决办法 在VUE路由进去你要操作的页面时进行config接口注入 首先打开工程文件中的router index j
  • Vue计算属性与侦听属性的应用场景

    计算属性中不能进行异步操作 在计算属性中我们不能进行异步操作 例如 不能使用定时器 不能处理 Ajax 请求 div 姓 div
  • 史上最全计算机毕业设计题目1(10万套,大部分全国唯一)

    最新vc图书管理系统 任务书 开题 论文 源码 后缀2a附选题表 rar 最新指纹识别系统 任务书 开题 论文 源码 后缀2b附选题表 rar 原创java图书管理系统 任务书 论文 后缀2b附选题表 rar 原创毕业设计网上选题系统 任务
  • Android开发中常见的内存泄漏情况和解决办法

    什么是内存泄漏 答 在Android程序开发中 当一个对象已经不需要再使用了 本该被回收时 而另外一个正在使用的对象持有它的引用从而导致它不能被回收 这就导致本该被回收的对象不能被回收而停留在堆内存中 内存泄漏就产生了 内存泄漏的危害 答
  • 最大类间方差法(大津法OTSU)

    算法介绍 最大类间方差法是1979年由日本学者大津提出的 是一种自适应阈值确定的方法 又叫大津法 简称OTSU 是一种基于全局的二值化算法 它是根据图像的灰度特性 将图像分为前景和背景两个部分 当取最佳阈值时 两部分之间的差别应该是最大的