Opencv(C++)学习之cv::calcHist 任意bin数量进行直方图计算

**背景:**当前网上常见的直方图使用方法都是默认使用256的范围,而对于使用特定范围的直方图方法讲的不够清楚。仔细研究后总结如下:

1、常见使用方法,直接对灰度图按256个Bin进行计算。

Mat mHistUn;
int channels[1] = { 0 };
{bool uniform = true;//使用标准方法-也就是每个bin长度为1int histSize[1] = { 256 };float range[2] = { 0, 255 };const float* ranges[] = { range }; // 指定单个bin的取值范围cv::calcHist(&src, 1, channels, cv::Mat(), mHistUn, 1, histSize, ranges, uniform);
}

2、使用128个Bin进行计算

Mat mHist;
int channels[1] = { 0 };
{bool uniform = false;int histSize[1] = { 128 };float range[129] = { 0 };for (size_t i = 0, j = 0; i < 129; i++, j += 2)range[i] = j;const float* ranges[] = { range }; // 指定单个bin的取值范围cv::calcHist(&src, 1, channels, cv::Mat(), mHist, 1, histSize, ranges, uniform);
}

在该方法中,channels为0 ,表示单通道。先将uniform 标志位置为false,表示单个bin不再使用默认的距离1。
再构建每个bin的取值范围ranges,这里bin的宽度按2进行配置 ,那么所有的bin就是[0,2],[2,4],[4,6]…[254,255],总共128个bin。
其中需要注意的是,128个bin,但ranges的大小是129.这和opencv对这块的数据处理相关。

3、观察效果

void showCvHist(Mat srchist, int histSize)
{int hist_w = 511;int hist_h = 400;int bin_w = cvRound((double)hist_w / histSize);Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0, 0, 0));Mat hist = srchist.clone();normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1, Mat());for (int i = 1; i < histSize; i++){line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),Point(bin_w * i, hist_h - cvRound(hist.at<float>(i))),Scalar(255, 0, 0), 2, 8, 0);}imshow("tt", histImage);cv::waitKey(0);
}

使用该函数对结果进行显示
256方法:
256bin的直方图
128的方法
128bin的直方图

可以看到,直方图的趋势基本类似。我们再看下直方图统计的具体数据。可以看到,在128bin方法中,每个数据正好对应256方法中2个数据之和。说明bin宽度为2正好生效。
256bin与128bin的数据对比1
4、一点统计的疑问:数据的最尾端,[254,255]合并成[127]时,数据存在3000的差异,不知从何引入的。
有知道的朋友可以帮忙看下

256bin与128bin的数据对比2

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 应用开发学习笔记 状态管理概述

移动端开发&#xff0c;最重要的一点就是数据的处理&#xff0c;并且正确的显示渲染UI。 变量在页面和组件、组件和组件之间有时候并不能实时共享&#xff0c;而有时候&#xff0c;又不需要太多的作用域&#xff08;节省资源&#xff09;&#xff0c;作用就需要根据不同场景&am…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

​三子棋(c语言)

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

STM32 JLINK SWD调试器手动复位才能烧写的问题

STM32 JLINK SWD调试器手动复位才能烧写的问题 Chapter1 STM32 JLINK SWD调试器手动复位才能烧写的问题 Chapter1 STM32 JLINK SWD调试器手动复位才能烧写的问题 原文链接&#xff1a;https://blog.csdn.net/denghuajing/article/details/121649667 问题 只有手动复位的情况下…

github 好项目 之 reference

github项目地址 网页网址 点进去以后你可以看到很多关于技术前沿的东西的简单笔记&#xff0c;一些实践的代码&#xff0c;或者是一些快捷键的命令 我个人比较喜欢 latex 的数学公式笔记 以及关于 vim 的一些命令 还有我最喜欢的git命令

安徽省暨合肥市“希望工程·梦想计划”小盖茨机器人捐赠启动仪式举行

1月5日&#xff0c;安徽省暨合肥市“希望工程梦想计划”小盖茨机器人捐赠启动仪式在合肥市一六八玫瑰园学校东校区举行。共青团安徽省委副书记叶征&#xff0c;北京儒布特教育科技有限公司董事牛俊明&#xff0c;北京儒布特教育科技有限公司市场总监高进&#xff0c;安徽省青基…

vue3.x 的生命周期和钩子函数

什么是生命周期 Vue 是组件化编程&#xff0c;从一个组件诞生到消亡&#xff0c;会经历很多过程&#xff0c;这些过程就叫做生命周期。 你理解了什么是生命周期&#xff0c;你还了解一个概念“钩子函数”。 钩子函数&#xff1a; 伴随着生命周期&#xff0c;给用户使用的函数&…

CMU15-445-Spring-2023-Project #1 - 前置知识(lec01-04)

Lecture #01_ Relational Model & Relational Algebra Databases 数据库是相互关联的数据的有组织集合&#xff0c;对现实世界的某些方面进行建模。区别于DBMS&#xff08;MySQL、Oracle&#xff09;。 Flat File Strawman 数据库以CSV文件的形式存储&#xff0c;并由D…

half-angle slicing半角切片技术

首先理解阴影的本质&#xff0c;光照被其他体素遮挡了。 Adding shadows to the volume lighting model means that light gets attenuated through the volume before being reflected back to the eye. 体渲染&#xff08;volume rendering&#xff09;算法包括ray casting、…

leecode-代码随想录-学习笔记1

编程语言基础课&#xff0c;重新学习 kamacoder.com 基础语法&#xff1b;ACM输入输出通用模板&#xff1b;之前Java狂神说的学习笔记&#xff08;但是还是按照编程习惯用了C&#xff0c;感觉更底层好写代码&#xff09;。 正式开始&#xff1a; 下面按照题目-我的解答思路和…

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…

MybatisPlus—快速入门

目录 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 1.2 定义Mapper 2.MybatisPlus常用注解 2.1 TableName 2.2 TableId 2.3 TableField 2.4 小结 3. 常用配置 4. 总结 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 MyBatisPlus官方提…