最大类间方差法Ostu的C++实现

article/2025/8/7 21:57:26

① 设灰度级为L,灰度值i的像素出现的频数为。分别为所纷呈的两个像素类的面积比,即

② 分别为两个像素类的平均灰度值,即

③计算类间方差,并找出最大类间方差以及对应的阈值。

④ 求为最大值时的t,作为图像分割的最佳阈值T。

int otsu(IplImage* image)
{assert(NULL != image);int width = image->width;int height = image->height;int x = 0, y = 0;int pixelCount[256];float pixelPro[256];int i, j, pixelSum = width * height, threshold = 0;uchar* data = (uchar*)image->imageData;//初始化for (i = 0; i < 256; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//统计灰度级中每个像素在整幅图像中的个数for (i = y; i < height; i++){for (j = x; j < width; j++){pixelCount[data[i * image->widthStep + j]]++;}}//计算每个像素在整幅图像中的比例for (i = 0; i < 256; i++){pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);}//经典ostu算法,得到前景和背景的分割//遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for (i = 0; i < 256; i++){w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for (j = 0; j < 256; j++){if (j <= i) //背景部分{//以i为阈值分类,第一类总的概率w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else       //前景部分{//以i为阈值分类,第二类总的概率w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;        //第一类的平均灰度u1 = u1tmp / w1;        //第二类的平均灰度u = u0tmp + u1tmp;        //整幅图像的平均灰度//计算类间方差deltaTmp = w0 * (u0 - u) * (u0 - u) + w1 * (u1 - u) * (u1 - u);//找出最大类间方差以及对应的阈值if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}//返回最佳阈值;return threshold;
}

代码如下:(可直接运行使用)
https://download.csdn.net/download/chengxuyuanliwanwan/12601166


http://chatgpt.dhexx.cn/article/Lfkn7SIV.shtml

相关文章

图像分割 - 阈值处理 - 最大类间方差法(OTSU)

目录 1. OTSU 介绍 2. 代码实现 1. OTSU 介绍 OTSU 大津法&#xff0c;也是最大类间方差算法 OTSU 算法的思想通过不同的阈值K&#xff0c;将图像的分为两个区域&#xff0c;一个是灰度值 0 < k < K 的子区域G1&#xff1b;另一个是灰度值 K1 < k < L-1 的子区…

【零散知识】最大类间方差法(大津法,Otsu)

前言&#xff1a; { 最近特别忙&#xff08;或者说时间规划出了问题&#xff09;&#xff0c;所以更新的都是短篇。 本次的内容是最大类间方差法&#xff08;大津法&#xff0c;Otsu&#xff09;。 } 正文&#xff1a; { 根据[1]中的介绍&#xff0c;大津法的主要作用是二值…

「 Redis 」 SkipList 跳表底层实现及应用

「 Redis 」 SkipList 跳表底层实现及应用 参考&鸣谢 Redis中ZSet的底层数据结构跳跃表skiplist&#xff0c;你真的了解吗&#xff1f; RiemannChow 深入理解跳表及其在Redis中的应用 京东云开发者 Redis跳表底层实现 来年花惜 文章目录 「 Redis 」 SkipList 跳表底层实现…

Redis 中的底层数据结构:SkipList

一、SkipList 简介 SkipList(5.0) 是zset的底层实现之一&#xff0c;它的数据结构定义如下&#xff1a; /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode {sds ele; //成员对象double score; //分值struct zskiplistNode *backward; //后退…

skiplist原理与实现

今天继续介绍分布式系统当中常用的数据结构&#xff0c;今天要介绍的数据结构非常了不起&#xff0c;和之前介绍的布隆过滤器一样&#xff0c;是一个功能强大原理简单的数据结构。并且它的缺点和短板更少&#xff0c;应用更加广泛&#xff0c;比如广泛使用的Redis就有用到它。 …

【数据结构】跳表Skiplist

文章目录 跳表--skiplistskiplist的概念skilplist的原理skilplist的实现随机值函数跳表节点 跳表框架查找函数寻找前置节点添加元素删除元素打印链表 测试结果Skiplist与其他Key-Value结构的比较 跳表–skiplist skiplist的概念 skiplist本质上也是一种查找结构&#xff0c;用…

Skiplist跳表详解及其模拟实现

文章目录 跳表1.跳表的概念2.Skiplist在插入时采用随机层数的方法是如何保证效率的呢?3.跳表的模拟实现4.跳表VS平衡搜索树和哈希表 跳表 1.跳表的概念 跳表是基于有序链表扩展实现的。对于一个普通的有序链表&#xff0c;我们查找数据的时间复杂度是O(N)。而跳表的出现&…

skiplist - 跳表

一 前言 跳表(skiplist、跳跃表) 是一个很优秀的数据结构&#xff0c;比如用于 Redis、levelDB等出名的开源项目上。跳表在原有的有序链表上面增加了多级索引&#xff0c;通过索引来实现快速查找。 它的结构特点在名称能很好的体现出来&#xff0c;就像兔子一样&#xff0c;蹦…

Leveldb skiplist 实现及解析

skiplist 原理介绍 skiplist 由William Pugh 在论文Skip Lists: A Probabilistic Alternative to Balanced Trees 中提出的一种数据结构,skiplist 是一种随机化存储的多层线性链表结构,插入,查找,删除的都是对数级别的时间复杂度。skiplist 和平衡树有相同的时间复杂度,但…

跳表SkipList介绍与实现

目录 一.跳表介绍 二.实现思路 &#xff08;一&#xff09;.结点结构 &#xff08;二&#xff09;.检索 &#xff08;三&#xff09;.插入 &#xff08;四&#xff09;.删除 三.实现代码 一.跳表介绍 跳表是一种随机化数据结构&#xff0c;主要用于快速检索数据。实质上…

SkipList(跳表)

SkipList(跳表) 文章目录 SkipList(跳表)参考前言跳表的原理跳表的插入和删除插入操作删除操作 跳表的时间空间复杂度分析时间复杂度空间复杂度 调表的基本操作插入数据删除数据 Go 实现小结 参考 https://juejin.cn/post/6844903955831619597#heading-2https://blog.csdn.net…

每日一博 - 如何理解跳表(SkipList)

文章目录 什么是跳跃表SkipList跳表关键字Why Skip ListCode跳表-查询跳表-删除跳表-插入 小结完整Code 什么是跳跃表SkipList 跳跃表(简称跳表)由美国计算机科学家William Pugh于1989年发明 论文&#xff1a; Skip lists: a probabilistic alternative to balanced trees 跳…

Skiplist(跳表)实现

前言&#xff1a;跳表本质是一种查找结构&#xff0c;相较于AVL树、红黑树、哈希表&#xff0c;实现起来要更加简单&#xff0c;而且效率也不差。 一.Skiplist概念 跳表本质也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树&#xff08;AVL树、红…

跳表(SkipList)设计与实现(java)

微信搜一搜「bigsai」关注这个有趣的程序员&#xff0c;一起做个朋友 新人原创公众号&#xff0c;求支持一下&#xff01;你的点赞三连肯定对我至关重要&#xff01; 文章已收录在 我的Github bigsai-algorithm 欢迎star 前言 跳表是面试常问的一种数据结构&#xff0c;它在很…

SkipList和java中ConcurrentSkipListMap的实现

文章目录 简介SkipListConcurrentSkipListMapSkipList的实现concurrent的实现 总结 SkipList和java中ConcurrentSkipListMap的实现 简介 一开始听说SkipList我是一脸懵逼的&#xff0c;啥&#xff1f;还有SkipList&#xff1f;这个是什么玩意。 后面经过我的不断搜索和学习&a…

跳表(SkipList)及ConcurrentSkipListMap源码解析

二分查找和AVL树查找 二分查找要求元素可以随机访问&#xff0c;所以决定了需要把元素存储在连续内存。这样查找确实很快&#xff0c;但是插入和删除元素的时候&#xff0c;为了保证元素的有序性&#xff0c;就需要大量的移动元素了。 如果需要的是一个能够进行二分查找&#…

Redis数据结构之——跳表skiplist

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、跳表&#xff08;skiplist&#xff09; 如何理解跳表&#xff1f;在了解跳表之前&#xff0c;我们先从普通链表开始&#xff0c;一点点揭开跳表的神秘面纱~ 首先&#xff0c;普通单链表来说&#xff0c;即使链表是有序…

redis中ziplist,skiplist

ziplist压缩表 ziplist主要是为了节约内存&#xff0c;他将元素存储在一块连续的内存空间中&#xff0c;这样在查询数据的时候也可以利用CPU的缓存访问数据&#xff0c;加快查询的效率 相较于数组而言。我们知道,数组要求每个元素的大小都相同,如果我们要存储不同长度的字符串…

跳表-skiplist的简单实现

文章目录 1、什么是跳表-skiplist2、skiplist的效率如何保证&#xff1f;3、skiplist的实现4、skiplist跟平衡搜索树和哈希表的对比 1、什么是跳表-skiplist skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样…

跳表:Skiplist原理介绍和优缺点

skiplist介绍 不要求上下相邻两层链表之间的节点个数有严格的对应关系&#xff0c;而是为每个节点随机出一个层数(level)。比如&#xff0c;一个节点随机出的层数是3&#xff0c;那么就把它链入到第1层到第3层这三层链表中。为了表达清楚&#xff0c;下图展示了如何通过一步步的…