分割算法-大津算法

分割算法-大津算法

  • 一、什么是大津算法
  • 二、算法原理
  • 三、公式推导
  • 四、代码
  • 五、算法适用性

大津算法介绍以及C++函数代码实现。

一、什么是大津算法

大津算法(Otsu)由日本学者大津展之在1979年提出,又称最大类间方差法。此法求得的阈值,使得图像的前景和背景具有最大的类间方差。

二、算法原理

阈值分割属于区域分割,目的是将图像分为前景和背景,提取出需要的前景区域,区域分分割,根据图像的灰度特性。
如下图,假设我们的前景(即目标)为黑色椭圆,背景为白色。此时前景的像素值为0-10左右,为了方便理解,假设值全部为0,背景假设全部为255。假设阈值为k,任意0-255之间的阈值,都可以将图像分为两个部分,但是只有一个阈值,可以将图像分成前景和背景两个区域。
将分成的两个区域设为A(前景)和B(背景),前景所有的像素为0,那么前景内的像素的方差为0,同理,背景的方差也为0。将两个区域的方差加权相加,得到的即是最小类内方差。
区域A和区域B对于整幅图求取方差,因为A和B的像素值具有最大的差别(在阈值的两侧),所以各自对于整幅图的方差也是最大的,加权相加即为最大类间方差。
最大类间方差和最小类内方差相加为一个定值,当一个最大,一个最小时,此时的k即为最佳阈值,将前景和背景完全分开。
差是灰度分布均匀性的一种度量,前景和背景的类间方差越大,说明两个部分的区域灰度差越大,分割出错的概率就越小

三、公式推导

在这里插入图片描述

四、代码

int thresh_otsu(Mat input)
{
    //定义像素个数统计
    int histogram[256] = { 0 };
    //定义全图均值
    float global_mean = 0;
    //计算全图均值
    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]]++;
            //计算全图像素值总和
            global_mean += data[j];
        }
    }
    //计算均值
    global_mean /= (input.rows * input.cols);

    int sum = 0;
    double p1 = 0, p2 = 0, m1 = 0, m2 = 0;
    double sg = 0;
    double temp_sg = -1;
    int k = 0;
    //阈值从0到255进行遍历
    for (int i = 0; i < 256; i++)
    {
        //遍历小于阈值的区域
        for (int j = 0; j <= i; j++)
        {
            //小于阈值的总个数
            p2 += histogram[j];
            //小于阈值的总像素值
            m2 += (histogram[j] * j);
        }
        //求取小于阈值时的均值
        m2 /= p2;
        //遍历大于阈值的区域
        for (int j = i + 1; j < 256; j++)
        {
            p1 += histogram[j];
            m1 += (histogram[j] * j);
        }
        m1 /= p1;
        //计算小于和大于阈值的个数概率
        p2 /= (input.rows * input.cols);
        p1 = 1 - p2;
        //计算最大类间方差
        sg = p1 * p2 * (m1 - m2) * (m1 - m2);
        //求取最大值,并记录此时的阈值
        if (sg > temp_sg)
        {
            temp_sg = sg;
            k = i;
        }
        //将概率和均值初始化
        p1 = 0, p2 = 0, m1 = 0, m2 = 0;
    }
    //    cout<<"k = "<<k<<endl;
    return k;
}

五、算法适用性

1、该算法通过寻找区域灰度的差别来进行确定阈值,所以不受图像的亮度和对比度的影响
2、适用于需要全局阈值的场景
3、目标和背景比例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/232674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git标签的管理与思考

git 标签管理 git 如何打标签呢&#xff1f; 标签是什么? 标签 相当于一个 版本管理的一个贴纸&#xff0c;随时 可以通过标签 切换到 这个版本的状态 &#xff0c; 有人可能有疑问 git commit 就可以知道 代码的改动了&#xff0c; 为啥还需要标签来管理呢&#xff1f; …

C++包管理利器CPM

C包管理利器CPM 一、介绍 CPM.cmake is a cross-platform CMake script that adds dependency management capabilities to CMake. It’s built as a thin wrapper around CMake’s FetchContent module that adds version control, caching, a simple API and more. CPM.cma…

四:爬虫-Cookie与Session实战

四&#xff1a;Cookie与Session实战 ​ 在浏览网站的过程中&#xff0c;我们经常会遇到需要登录的情况&#xff0c;有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站&#xff0c;但是有时候过一段时间就需要重新登录。还有一些网站&#xff0c;在打开浏览器…

Uniapp软件库全新带勋章功能(包含前后端源码)

源码介绍&#xff1a; Uniapp开发的软件库全新带勋章功能&#xff0c;搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名&#xff0c;电脑需要下载&#xff1a;HBuilderX 登录账号 没有账号就注册账号&#xff0c; 然后上传文件&#xff0c;打包选择 “…

轻量封装WebGPU渲染系统示例<43>- 材质组装流水线(MaterialPipeline)之灯光和阴影(源码)

目标: 数据化&#xff0c;模块化&#xff0c;自动化 备注: 从这个节点开始整体设计往系统规范的方向靠拢。之前的都算作是若干准备。所以会和之前的版本实现有些差异。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sa…

spring cloud 修改bootstrap文件的文件名

前言 spring boot 2.1.2.RELEASE spring cloud 默认的启动文件 spring cloud 默认的启动文件为 bootstrap.yml 修改bootstrap文件的文件名 添加参数 --spring.config.locationclasspath:bootstrap.yml或者 --spring.cloud.bootstrap.locationclasspath:bootstrap.yml还可…

TrustZone​之在安全状态之间切换

如果处理器处于NS.EL1,而软件想要转移到S.EL1,应该如何实现呢? 要改变安全状态,无论是向上还是向下,执行都必须经过EL3,如下图所示: 前面的图表显示了在不同安全状态之间移动涉及的步骤的示例序列。逐步进行解释: 进入较高的异常级别需要一个异常。通常,此异常…

【ScienceAI Weekly】IBM新AI芯片提效25倍;清华大学发AI辅助框架;DeepMind新工具预测220万新晶体

「ScienceAI Weekly」是 HyperAI 超神经新创建的半月更栏目&#xff0c;主要从科研成果、企业动态、工具资源、近期活动 4 个维度&#xff0c;收集呈现 ScienceAI 领域近期值得关注的最新动态&#xff0c;以期为长期关注该领域的从业者、爱好者&#xff0c;提供更有价值的圈内资…

springboot+jdbcTemplate+sqlite编程示例——以沪深300成分股数据处理为例

引言 我们在自己做一些小的项目或者小的数据处理分析的时候&#xff0c;很多时候是不需要用到mysql这样的大型数据库&#xff0c;并且也不需要用到maven这样很重的框架的&#xff0c;取而代之可以使用jdbcTemplatesqlite这样的组合。 本文就介绍一下使用springbootjdbcTempla…

千锋 Vue 详细笔记整理

视频笔记是根据B站 千锋 涛哥 - SpringBootvue前后端分离项目《锋迷商城》实战课-完结版 进行整理的 笔记可上 gitee仓库 自取 千锋 Vue 笔记整理 一、vue 的简介1.1 使用 JQuery 的复杂性问题1.2 VUE 简介1.2.1 前端框架1.2.2 MVVM 二、 vue 入门使用2.1 vue 的引入2.2 入门案…

[LeetCode周赛复盘] 第 119 场双周赛20231209

[LeetCode周赛复盘] 第 119 场双周赛20231209 一、本周周赛总结100130. 找到两个数组中的公共元素1. 题目描述2. 思路分析3. 代码实现 100152. 消除相邻近似相等字符1. 题目描述2. 思路分析3. 代码实现 100147. 最多 K 个重复元素的最长子数组1. 题目描述2. 思路分析3. 代码实…

4.8 构建onnx结构模型-Less

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Less 结点进行分析 方式 方法一&a…

Redis有序集合对象

一.编码 有序集合的编码可以是ziplist或者skiplist。 ziplist编码的有序集合对象使用压缩列表作为底层实现&#xff0c;每一个集合元素使用紧挨在一起的两个压缩列表节点来保存。第一个节点保存元素的成员(member)&#xff0c;而第二个元素则保存元素的分值(score)。 127.0.0.…

Javaweb之 依赖管理的详细解析

04. 依赖管理 4.1 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&#xff1a;在当前工程中&#xff0c;我们需要用到logback来记录日志&#xff0c;此时就可以在maven工程的pom.xml文件中&#xff0c;引入logback的依…

无参RCE [GXYCTF2019]禁止套娃1

打开题目 毫无思绪&#xff0c;先用御剑扫描一下 只能扫出index.php 我们尝试能不能用php伪协议读取flag php://filter/readconvert.base64-encode/resourceindex.php php://filter/readconvert.base64-encode/resourceflag.php 但是页面都回显了429 怀疑是不是源码泄露 用…

【GDB】

GDB 1. GDB调试器1.1 前言1.2 GDB编译程序1.3 启动GDB1.4 载入被调试程序1.5 查看源码1.6 运行程序1.7 断点设置1.7.1 通过行号设置断点1.7.2 通过函数名设置断点1.7.3 通过条件设置断点1.7.4 查看断点信息1.7.5 删除断点 1.8 单步调试1.9 2. GDB调试core文件2.1 设定core文件的…

Qt之QSlider和QProgressBar

Qt之QSlider和QProgressBar 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connect(ui->dial,&QDial::valueChanged,this,&Widget::do_val…

【Oracle】backup备份时报错ORA-19809,ORA-9804

Oracle备份数据库时报错 ORA-19809: limit exceeded for recovery files ORA-19804: cannot reclaim 10305536 bytes disk space from 4385144832 limit 1.清理过时的备份&#xff1a; 使用RMAN删除不再需要的过时备份&#xff0c;以释放空间。执行以下命令&#xff1a; DEL…

win系统一台电脑安装两个不同版本的mysql教程

文章目录 1.mysql下载zip包&#xff08;地址&#xff09;2.解压在你的电脑上&#xff08;不要再C盘和带中文的路径&#xff09;3.创建my.ini文件4.更改环境变量&#xff08;方便使用, 可选&#xff09;5.打包mysql服务6.初始化mysql的data7.启动刚刚打包的服务8.更改密码 1.mys…

普冉(PUYA)单片机开发笔记(8): ADC-DMA多路采样

概述 上一个实验完成了基于轮询的多路 ADC 采样&#xff0c;现在尝试跑一下使用 DMA 的 ADC 多路采样。厂家例程中有使用 DMA 完成单路采样的&#xff0c;根据这个例程提供的模板&#xff0c;再加上在 STM32 开发同样功能的基础&#xff0c;摸索着尝试。 经过多次修改和测试&…
最新文章