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.mzph.cn/news/601372.shtml

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

相关文章

rollup 原理解析

✨专栏介绍 Rollup专栏是一个专门介绍Rollup打包工具的系列文章。Rollup是一个现代化的JavaScript模块打包工具&#xff0c;它可以将多个模块打包成一个或多个文件&#xff0c;以提高应用程序的性能和加载速度。 在Rollup专栏中&#xff0c;您将学习到如何安装和配置Rollup&a…

Ubuntu18 安装chatglm2-6b

记了下Ubuntu18 上安装chatglm2-6遇到的问题。 环境&#xff1a;Ubuntu18.04 V100(显卡) nvcc 11.6 显卡驱动cudacudnnaniconda chatglm6b 的安装 网上有很多&#xff0c; 不记录 了。 chatglm2-6b 我从别的地方拷贝的&#xff0c; 模型也包含了。 遇到的问题&#xf…

vue简单实现滚动条

背景&#xff1a;产品提了一个需求在一个详情页&#xff0c;一个form表单元素太多了&#xff0c;需要滚动到最下面才能点击提交按钮&#xff0c;很不方便。他的方案是&#xff0c;加一个滚动条&#xff0c;这样可以直接拉到最下面。 优化&#xff1a;1、支持滚动条&#xff0c;…

Websocket实时更新商品信息

产品展示页面中第一次通过接口去获取数据库的列表数据 /// <summary> /// 获取指定的商品目录 /// </summary> /// <param name"pageSize"></param> /// <param name"pageIndex"></param> /// <param name"i…

windows服务器相关操作

windows服务器相关操作 向windows服务器传输文件 参考&#xff1a; 本机向windows服务器传输文件的三种方法 windows杀死端口进程 关于windows杀死某个端口号进程的方法 window后台启动、关闭springboot项目 参考&#xff1a; win环境后台启动、关闭springBoot的jar包配置…

阿里云2核2G3M配置的云服务器可以搭建几个网站?

阿里云2核2G3M配置的云服务器可以搭建几个网站&#xff1f;对于这个问题&#xff0c;没有一个具体的答案&#xff0c;因为这取决于您的网站的流量和复杂程度。在一般情况下&#xff0c;这个配置可以支持搭建几个中小型网站。若您的网站需要大量的资源或处理高并发请求&#xff…

java验证手机号

java验证手机号 public static boolean verifyPhonenumber(String visitedPhonenumber) {String regex "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";return verifyByStr(visitedPhonenumber, regex);}

卸载Oracle23c free版本的数据库及软件

在上一篇的文章中&#xff0c;测试验证了如何安装Oracle23c free版本的数据库。总体上来说还是比较简单的。把相关的依赖包安装好&#xff0c;rpm -ivh执行安装即可。 在这一篇文章中将验证测试如何卸载。Oracle的文档介绍就是强大&#xff0c;我们找到文档内容&#xff0c;按…

机器学习股票崩盘预测模型(企业建模_论文科研)AI model for stock crash prediction

对齐颗粒度&#xff0c;打通股票崩盘底层逻辑&#xff0c;形成一套组合拳&#xff0c;形成信用评级机制良性生态圈&#xff0c;重振股市信心&#xff01;--中国股市新展望&#xff01;By Toby&#xff01;2024.1.3 综合介绍 股票崩盘&#xff0c;是指证券市场上由于某种原因&a…

Eureka工作原理详解

摘要&#xff1a;本文将详细介绍Eureka的工作原理&#xff0c;包括服务注册、服务发现、心跳检测等关键概念。通过阅读本文&#xff0c;您将了解到Eureka如何实现高可用、可扩展的服务注册中心。 一、引言 在微服务架构中&#xff0c;服务注册与发现是一个重要的环节。为了实…

ctfshow——PHP特性

文章目录 web 89web 90web 91web 92web 93web 94web 95web 96web 97web 98web 99web 100——优先级、eval()用法web 101——RefelctionClass反射类web 102——php伪协议、hex2bin()web103web 104——sha1绕过web 105 web 89 使用人工分配 ID 键的数值型数组绕过preg_match. 两个…

Vue2 实现内容拖拽或添加 HTML 到 Tinymce 富文本编辑器的高级功能详解

在 Web 开发中&#xff0c;Tinymce 被广泛应用作为富文本编辑器。除了基础的文本编辑功能&#xff0c;Tinymce 还提供了一系列高级功能&#xff0c;使得文本编辑更加灵活和便捷。本文将介绍如何在 Tinymce 中实现一些高级功能&#xff0c;并深入了解每个工具的使用。 Tinymce …

Python中的eval和exec函数:深度解析两者的区别与使用场景

概要 Python中的eval和exec函数&#xff0c;它们都是非常强大的工具&#xff0c;用于动态执行代码。然而&#xff0c;它们在用途、用法和安全性方面存在显著的区别。在本文中&#xff0c;将深入探讨eval和exec函数的区别、用法以及示例代码&#xff0c;以帮助大家更好地理解和…

用单片机设计PLC电路图

自记&#xff1a; 以下为PMOS推挽输出及集成块光耦&#xff1a;

MediaPipeUnityPlugin Win10环境搭建(22年3月的记录,新版本已完全不同,这里只做记录)

https://github.com/homuler/MediaPipeUnityPlugin You cannot build libraries for Android with the following steps. 1、安装msys2配置系统环境变量Path添加 C:\msys64\usr\bin 执行 pacman -Su 执行 pacman -S git patch unzip 2、安装Python3.9.10 勾选系统环境变量 …

【性能测试入门】详解客户端性能测试和服务器端性能测试!

一&#xff1a;客户端性能测试和服务器端性能测试 客户端性能测试和服务器端性能测试是两个不同但相关的概念: 客户端性能测试: - 测试应用程序客户端(如Web浏览器、移动应用等)的性能,例如加载时间,响应时间等。 - 测试在不同系统配置(CPU、内存、网络等)下客户端的运行性…

QT自定义信号和槽

信号和槽 介绍实现创建文件对teacher的h和cpp文件进行处理对student的h和cpp文件进行处理对widget的h和cpp文件进行处理 介绍 Qt中的信号和槽是一种强大的机制&#xff0c;用于处理对象之间的通信。它们是Qt框架中实现事件驱动编程的核心部分。 信号&#xff08;Signal&#x…

SpringCloud微服务架构,适合接私(附源码)

一个由商业级项目升级优化而来的微服务架构&#xff0c;采用SpringBoot 2.7 、SpringCloud 等核心技术构建&#xff0c;提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。 架构图 项目介绍 用户权益 仅允许免费用于学习、毕设、公司项目、私活等。…

帮你了解广告行业是如何发展的(移动端为主),通俗易懂!!

一、背景 移动互联网发展&#xff0c;各移动设备普及 一方面&#xff0c;受欢迎的高uv、pv APP不断增多。 另一方面&#xff0c;广告主在传统媒体上拓展缓慢&#xff0c;需要产品推广途径以及发掘潜在用户。出现问题 众多APP无法变现 广告主需要更好的推广渠道 广告主直接和AP…

正则表达式RE

目录 正则表达式RE 正则表达式基本元字符 正则表达式拓展元字符 正则表达式RE 正则表达式基本元字符 正则表达式拓展元字符 用来处理文本 正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜…