分割算法-大津算法

news2025/1/21 22:08:11

分割算法-大津算法

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

大津算法介绍以及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.coloradmin.cn/o/1290187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lidar-SLAM的历史与现状

文章&#xff1a;LiDAR-based SLAM for robotic mapping: state of the art and new frontiers 作者&#xff1a;Xiangdi Yue and Miaolei He 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF论文&#xff0c;欢迎转发朋友圈。文章仅做学术分享&#xff0c…

MOS管加三个元件就组成BUCK电路,为何说难点在于电感?

只要是电子产品就需要供电&#xff0c;就离不开电源&#xff0c;那什么是电源&#xff1a;小到手表中的电子&#xff0c;遥控器的电源&#xff0c;大到220V家庭用电&#xff0c;都可以看做是电源。然而在我们的电路设计中&#xff0c;会用到各种芯片&#xff0c;各种芯片所需要…

什么是呼叫中心的语音通道?呼叫中心语音线路有几种?

什么是呼叫中心的语音通道&#xff1f; 呼叫中心的语音通道是指在呼叫中心中使用的语音信号传输通道&#xff0c;它是呼叫中心中至关重要的一部分&#xff0c;负责将客户的语音信息传递给客服代表&#xff0c;以及将客服代表的语音信息传递给客户。在呼叫中心的运营中&#xf…

探索鸿蒙 DevEcoStudio汉化+运行报错

在下载好软件&#xff0c;摸索着成功创建了一个项目的时候&#xff0c;点击运行&#xff0c;竟然失败了。而且一大堆的英文也不知道从何入手&#xff0c;从网上搜了一下&#xff0c;找到了汉化的办法&#xff0c;并且解决了问题。我这里走的是Mac的步骤&#xff0c;微软的其实一…

软件科技成果鉴定测试需提供哪些材料?

为了有效评估科技成果的质量&#xff0c;促进科技理论向实际应用转化&#xff0c;所以需要进行科技成果鉴定测试。申请鉴定的科技成果范围是指列入国家和省、自治区、直辖市以及国务院有关部门科技计划内的应用技术成果&#xff0c;以及少数科技计划外的重大应用技术成果。   …

LIO-SAM如何存储地图

1. 需要修改配置文件config/params.yaml文件的参数&#xff1a; savePCD: true # https://github.com/TixiaoShan/LIO-SAM/issues/3 savePCDDirectory: "/zoe/ws_lio_sam/src/LIO-SAM/map" 2.保存地图&#xff1a; source deve…

重磅!苹果官方发布大模型框架:一个可以充分利用苹果统一内存的新的大模型框架MLX,你的MacBook可以一键运行LLaMA了

本文来自DataLearnerAI官方网站&#xff1a;重磅&#xff01;苹果官方发布大模型框架&#xff1a;一个可以充分利用苹果统一内存的新的大模型框架MLX&#xff0c;你的MacBook可以一键运行LLaMA了 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/105170187…

西工大计算机学院计算机系统基础实验一(函数编写11~14)

稳住心态不要慌&#xff0c;如果考试周冲突的话&#xff0c;可以直接复制这篇博客和上一篇博客西工大计算机学院计算机系统基础实验一&#xff08;函数编写1~10&#xff09;-CSDN博客最后的代码&#xff0c;然后直接提交&#xff0c;等熬过考试周之后回过头再慢慢做也可以。 第…

1.2 C语言简介

一、为什么要讲C语言 C语言是编程界的长青藤&#xff0c;可以查看语言排名发现&#xff0c;虽然现在语言很多&#xff0c;但是C语言一直占有一定地址 来源网站&#xff1a;https://www.tiobe.com/tiobe-index/ 在系统、嵌入式、底层驱动等领域存在一定的唯一性&#xff08;C语…

MIT6.5840-2023-Lab1: MapReduce

前置知识 MapReduce&#xff1a;Master 将一个 Map 任务或 Reduce 任务分配给一个空闲的 worker。 Map阶段&#xff1a;被分配了 map 任务的 worker 程序读取相关的输入数据片段&#xff0c;生成并输出中间 k/v 对&#xff0c;并缓存在内存中。 Reduce阶段&#xff1a;所有 ma…

【LeetCode刷题-链表】--92.反转链表II

92.反转链表II /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ cla…

Java第二十一章网络通信

一、网络程序设计基础 1、局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机&#xff0c;如下图所示。 2、网络协议 1.IP协议 IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。设计IP的目的…

基于NIQE算法的图像无参考质量评价算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 空域NSS特征提取 4.2 图像块选取 4.3 MVG模型 4.4 NIQE指标 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 clc; clear; close all; …

Python推导式详细讲解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;推导式是一种简洁而强大的语法特性&#xff0c;可以用来创建列表、集合、字典等数据结构。本文将深入探讨Python中的三种推导式&#xff1a;列表推导式、集合推导式和字典推导式&#xff…

pytorch中的transpose用法

注意&#xff1a;维数从0开始&#xff0c;0维 1维2维…,负数代表从右往左数&#xff0c;-1代表第一维&#xff0c;以此类推 import torch import numpy as np# 创建一个二维数组 arr torch.tensor([[[1, 2],[3, 4]],[[5, 6],[7, 8]]]) print("原始数组&#xff1a;"…

resnet 图像分类的项目

1. 项目文件 文件下载资源&#xff1a;resnet 图像分类的项目代码 本章利用reset34 作图像分类&#xff0c;包括计算训练集和测试集的loss、accuracy曲线&#xff0c;对训练好的网络在训练集测试集上求混淆矩阵 data 文件为训练集测试集&#xff0c;图像按照文件夹摆放inferenc…

电源滤波器如何检测?ATECLOUD-POWER电源自动测试软件如何助力?

电源滤波器常用来对电源中的纹波和干扰信号进行滤波&#xff0c;从而确保元器件不受损坏&#xff0c;是保证系统稳定性的重要方法。因此电源滤波器测试是非常重要的&#xff0c;通过检测来评估其质量、性能和稳定性&#xff0c;从而使电源滤波器可以稳定工作&#xff0c;进行滤…

HarmonyOS 修改App的默认加载的界面(ArkTS版本)(十七)

根据鸿蒙系统APP的应用生命周期结构&#xff08;鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期&#xff09;来看。 1、首先在roject/entry/src/main/ets/entryability/EntryAbility.ts文件中找到UI加载函数&#xff1a;onWindowStageCreate(…){…}&#xff0c;然后找到windo…

Jupyter Notebook工具

Jupyter Notebook 是一个交互式的笔记本环境&#xff0c;允许用户以网页形式编写和分享代码、文本、图像以及其它多媒体内容。它支持超过 40 种编程语言&#xff0c;最常用的是 Python。 以下是 Jupyter Notebook 工具的一些特点和用法&#xff1a; 1. 特点&#xff1a; 交互式…