Otsu详细算法解析

2023-10-29


前言


一、OTSU算法是什么?

        OTSU算法又名最大类间方差法,是由日本学者大津展之于1979 年提出,利用整副图像的直方图特性,选择全局阈值T。文字图片和背景通常会出现两个驼峰,确定一个灰度值作为阈值,将灰度值小于阈值的点作为目标,大于等于阈值的点作为背景。遍历整副图像灰度值,选择类间方差最大时对应的灰度值作为阈值,OTSU算法为目前比较好的确定阈值的算法。

二、算法详解

该博文由该算法的原理:
OpenCV — Otsu 算法_FlyDremever的博客-CSDN博客_opencv otsu

 2.算法实现

代码如下(示例):

//算法实现步骤
//Step1 计算灰度图像的全局期望
//Step2 遍历灰度值从0到255将灰度图像分为前景与背景
//Step2.1 求前景的期望与概率
//Step2.2 求背景的期望与概率
//Step2.3 由间类方差定义求当前阈值的间类方差
//遍历过程中,不断比较求得最大的间类方差


int thresh_otsu(Mat input)
{
    int histogram[256] = { 0 };//计算各灰度级的像素数目
    double global_mean = 0;//全局期望
    int imgSize = input.size().area();//图像的大小
    //遍历图像
    for (int i = 0; i < input.rows; i++)
    {
        uchar *data = input.ptr<uchar>(i);//当前行地址
        for (int j = 0; j < input.cols; j++)//遍历当前行
        {
            histogram[data[j]]++;//当前灰度级为data[j]的数值
            global_mean += data[j];//统计整幅图像的像素值之和
        }
    }
    //期望(平均) = 总和 / 个数 
    global_mean /= imgSize;//统计完后根据均值定义求得图像的均值

    double p1 = 0, p2 = 0, m1 = 0, m2 = 0;
    //p1 m1 分别为背景的概率与背景的期望
    //p2 m2 分别为前景的概率与前景的期望
    double sg = 0;//间类方差
    double temp_sg = -1;//用于交换的变量
    int k = 0;
    //遍历i求当前阈值i得到的间类方差,找到间类方差最大值对应的阈值i
    for (int i = 0; i < 256; i++)
    {
        //小于阈值i为前景(目标)
        for (int j = 0; j <= i; j++)
        {
            p2 += histogram[j];//统计前景的像素值 个数 总和 即小于阈值i的像素点个数之和  
            m2 += (histogram[j] * j);//统计前景的像素值 总和  即小于阈值i的像素值之和
        }
        m2 = m2 / p2;//由期望公式得到期望 (前景)

        //大于阈值i为背景
        for (int j = i + 1; j < 256; j++)
        {
            p1 += histogram[j];
            m1 += (histogram[j] * j);
        }
        m1 /= p1;//由期望公式得到期望 (背景)

        p2 /= imgSize;//求前景的概率 = 前景像素点个数 / 图像总像素个数

        p1 = 1 - p2;//求背景的概率

        sg = p1 * p2*(m1 - m2)*(m1 - m2); //计算当前阈值i的类间方差

        //找出 阈值i分割的前景与背景的最大间类方差  
        if (sg > temp_sg)
        {
            temp_sg = sg;
            k = i;
        }
        p1 = 0, p2 = 0, m1 = 0, m2 = 0;//求完后这些数据要重置为0 计算新的阈值的相应的数据
    }
    //cout<<"k = "<<k<<endl;
    return k;
}


总结

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

Otsu详细算法解析 的相关文章

随机推荐

  • Zookeeper应用场景和底层设计

    一 什么是zookeeper Zookeeper是一个开源的分布式协调服务框架 它是服务于其它集群式框架的框架 简言之 有一个服务A 以集群的方式提供服务 只需要A专注于它提供的服务就可以 至于它如何以多台服务器协同完成任务的事情 交给Zo
  • eventEmitter.addListener与eventEmitter.on有什么区别

    eventEmitter addListener与eventEmitter on有什么区别 在 Node js 中 eventEmitter addListener 和 eventEmitter on 是等效的方法 它们都用于为事件注册监听
  • 面试官问“为什么应聘这个岗位”,应该如何回答?

    面试的时候 我们经常会被问到一个问题 为什么要来应聘这个职位 这是很多同学 不管是在校招还是社招里面都会碰到的一个场景 出现这种问题 一般来说有两种情况 一种是大学专业 或之前的实习经验 工作经验 跟这个职位的相关度不大 第二种情况是 跨越
  • mysql 可以承受多少人_mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化 最后瓶颈发现都在数据库单点上 问DBA 给我的写入答案是在1W 机械硬盘 左右 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高 SSD硬盘 但这东西感觉从来没证实过 故一时兴起 弄台虚拟机压测起来
  • HDLBits 系列(6)——Sequential Logic(Latches and Flip-Flops)

    目录 3 2 Sequential Logic 3 2 1 Latches and Flip Flops 1 D flip flop 2 D flip flops 3 DFF with reset 4 DFF with reset valu
  • AOP常用的几种增强方式,各自的特点(代码辅助)?

    1 前置增强 又称前置通知 前置增强使用 Befor注解标识 增强方法优先于目标方法执行 前置增强方法 Before execution int mul int int 执行方法之前执行下面的方法 public void before Jo
  • vue使用vant的list组件使用

    模板代码
  • 性能测试—性能测试方案设计思路总结

    一 需求分析 1 测试目的 为什么测 目的在于测试系统相关性能能否满足业务需求 通常分以下两种情况 1 新项目上线 2 老项目优化 如果是老项目优化 可考虑是否存有历史测试方案 如果有可以参考 或许可以省事很多 2 测试对象 要测啥 测试对
  • RK开发板的USB连接(Ubuntu)

    一 安装连接工具 sudo apt get install putty 二 启动putty工具 sudo putty 三 连接usb 并查看相关的信息 查看接入的是否有usb ls dev tty 显示如下 含有usb接口 dev ttyU
  • JVM的GC ROOTS有哪些?

    jvm垃圾回收是根据可达性分析算法来判断堆里面的对象是否有用 可达性分析算法是从GC ROOTS扫描对象引用链 来筛选出有用的对象 扫面完成后 回收掉无用的对象 jvm的GC ROOTS有哪几个地方呢 1 虚拟机栈 局部变量表中引用的对象
  • 寒假训练 第三节 数据结构基础 总结

    栈 基本操作 1 判断栈空 2 判断栈满 3 进栈 4 出栈 判断栈空 操作 s gt top 1 当栈顶指向 1时说明该栈为空 判断栈满 操作 s gt top MAXEN 1 当栈顶为栈长减一时说明栈为满 进栈 s gt top s g
  • react-native之ART绘图详解

    背景 在移动应用的开发过程中 绘制基本的二维图形或动画是必不可少的 然而 考虑到Android和iOS均有一套各自的API方案 因此采用一种更普遍接受的技术方案 更有利于代码的双平台兼容 art是一个旨在多浏览器兼容的Node style
  • PF_INET AF_INET

    http blog csdn net csdn zc article details 7656445 在写网络程序的时候 建立TCP socket sock socket PF INET SOCK STREAM 0 然后再绑定本地地址或连接
  • 【C语言】简易登录注册系统(登录、注册、改密、文件操作)

    概述 本登录注册系统通过使用C语言中的结构体 函数 文件操作以及指针等 设计与实现了一个小型用户登录注册系统的登录 注册 修改密码等基本功能 本系统全部功能基本运行良好 用户界面友好 操作简单 使用方便 但系统仍然有不完善之处 例如在隐藏用
  • 【零基础学爬虫】用python爬取小说

    文章目录 前言 一 先上效果图 二 bs4学习 1 原理 2 运用 3 数据解析 4 属性定位 5 获取标签之间的文本数据 6 获取标签中的属性值 三 开始爬小说 一般步骤 1 获取url 2 UA伪装 3 获取cookie 4 请求网站
  • Python3爬虫---抓取英雄联盟的所有英雄皮肤

    usr bin env python coding utf 8 author Chris iven Python version 3 6 1 分析LOL官网行为 发现这个网页的所有数据都是经过js生成的 意思就是说 他的数据全部不在该网页里
  • 电脑如何搞副业?给大家分享五个电脑副业

    如今的电脑曾经渐渐的开端提高起来 不论我们是办公还是在家 简直每个人都是会用到这样的东西 他也是改动了我们的赚米方式 如今很多人都是在家用电脑开端赚米 那么一台电脑怎样挣米 有一台电脑怎样挣米的办法有哪些 那么接下来就给你们带来电脑挣米的办
  • my学习OC--数组对象 NSArray NSMultableArray

    数组是有序集合 只能存放对象 数组有下标 index 的概念 靠index来索引元素 下标从0开始 数组分为不可变数组 NSArray 和可变数组 NSMutableArray 不可变数组 NSArray 创建数组对象 1 创建数组对象 2
  • 求素数

    题目描述 求 100 200 之间的全部素数 输入 无 输出 100 200 之间的全部素数 一个素数占一行 样例输入 无 样例输出 101 103 107 109 113 127 131 137 139 149 151 157 163 1
  • Otsu详细算法解析

    前言 无 一 OTSU算法是什么 OTSU算法又名最大类间方差法 是由日本学者大津展之于1979 年提出 利用整副图像的直方图特性 选择全局阈值T 文字图片和背景通常会出现两个驼峰 确定一个灰度值作为阈值 将灰度值小于阈值的点作为目标 大于