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

news2024/11/19 4:27:51

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

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

Mat mHistUn;
int channels[1] = { 0 };
{
    bool uniform = true;//使用标准方法-也就是每个bin长度为1
    int 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.coloradmin.cn/o/1351843.html

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

相关文章

Django(五)

员工管理系统 1.新建项目 2.创建app python manage.py startapp app012.1 注册app 3. 设计表结构&#xff08;django&#xff09; from django.db import modelsclass Department(models.Model):""" 部门表 """title models.CharField(verbos…

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除&#xff0c;创建LXMysql.cpp 3、项目设置 3.1、预编译头&#xff0c;不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…

【LeetCode-剑指offer】--15.找到字符串中所有字母异位词

15.找到字符串中所有字母异位词 方法&#xff1a;滑动窗口 class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans new ArrayList<>();int m s.length(),n p.length();if(n > m){return ans;}int[] cnt1 new i…

部署上传漏洞的靶场环境upload-labs

1、工具介绍 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 upload-labs靶场开源地址&#xff1a;&#xff1a;https://…

Android14之audit2allow自动生成Selinux规则(一百七十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

k8s的声明式资源管理

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都…

使用GPTs+Actions自动获取第三方数据

目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&

【Linux】set命令使用

set命令 设置所使用shell的执行方式&#xff0c;可依照不同的需求来做设置。 语法 set [参数]选项及作用 执行令 &#xff1a; man set 执行命令结果 参数 -a  标示已修改的变量&#xff0c;以供输出至环境变量。-b  使被中止的后台程序立刻回报执行状态。-C  转向所…

draw流程图工具导入云原生(CNCF)相关控件

目录 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 2、引用自己的资源链接&#xff1a; 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 导入资源图库&#xff0c;资源放在下方&#xff0c;大家可以下载&#xff1a; 2、引用自己的资源链接&#xff1a;…

全面PDF分析:创建PDF解析API,可商业用

为什么我要自己制作这个接口?需求如下: 我需要对PDF内容进行深入分析。无论是总结PDF内容,还是基于PDF内容提出问题,首先我都需要提取出文本信息。经过市场调查,我发现缺乏可靠的PDF解析API服务。即便是付费服务,也没有发现特别合适的产品,大多数都是现成的网站工具。文…

【LabVIEW FPGA入门】创建第一个LabVIEW FPGA程序

本教程仅以compactRIO&#xff08;FPGA-RT&#xff09;举例 1.系统配置 1.1软件安装 FPGA-RT 1. LabVIEW Development System (Full or Professional) 2. LabVIEW Real-Time Module 3. LabVIEW FPGA Module 4. NI-RIO drivers 1.2硬件配置 1.使用线缆连接CompactRIO至主机…

vue3(十三)-基础入门之路由配置与重定向

一、一级路由与重定向 1、创建 App.vue 在父组件中导入子组件 Navbar <template><div><navbar></navbar></div> </template><style lang"scss"></style><script> import navbar from /components/Navbarex…

[GKCTF 2020]cve版签到

[GKCTF 2020]cve版签到 wp 信息搜集 题目页面&#xff1a; 页面中有提示&#xff1a;You just view *.ctfhub.com 点一下 View CTFHub 会回弹一些信息&#xff1a; 抓包看看&#xff1a; url 传参&#xff0c;判断是 ssrf 。但是当我将其改为 http://www.baidu.com 或者是…

2024年PMP考试新考纲-【人员领域】真题解析

1前面的文章中&#xff0c;华研荟从PMBOK第七版介绍了里面的各个章节最新考纲下的PMP考试真题&#xff0c;并做了详细的解析。 从今天起&#xff0c;我们从另一个角度来看一下PMP的最新考试真题&#xff1a;从新考纲下的三个领域来看。 事实上&#xff0c;PMI官方于2019年6月…

RA-4565SA(汽车串行接口实时时钟模块)

RA-4565SA车载用 保证高温下正常工作-40C ~ 125C&#xff0c;数据保持判断功能&#xff0c;通过一个VL-bit值&#xff0c;可以判断备份后恢复的数据的有效性。32.768kHz频率输出功能&#xff0c;CLKOUT 引脚输出(开漏输出)&#xff0c;可选择输出频率为32.768kHz, 1024Hz, 32Hz…

Mars3d的BusineDataLayer应该传data格式实现聚合效果

问题&#xff1a; 1.通过【Mars3d】加载new mars3d.layer.BusineDataLayer(的如果不用url使用data的话&#xff0c;格式应该是什么样子的呢&#xff1f; 相关说明&#xff1a;实质就是就是GraphicLayer&#xff0c;自己加graphic进去。 使用data的话要否需要用onCreateGraph…

@EnableXXX注解+@Import轻松实现SpringBoot的模块装配

文章目录 前言原生手动装配模块装配概述模块装配的四种方式准备工作声明自定义注解 导入普通类导入配置类导入ImportSelector导入ImportBeanDefinitionRegistrar 总结TODO后续--条件装配 前言 最早我们开始学习或接触过 SSH 或者 SSM 的框架整合&#xff0c;大家应该还记得那些…

Python图像处理:批量添加水印的优雅实现与进阶技巧

1. 简介 在日常图像处理中&#xff0c;为图片添加水印是一项常见任务。有多种方法和工具可供选择&#xff0c;而今天我们将专注于使用Python语言结合PIL库批量添加水印。 需要注意的是&#xff0c;所选用的图片格式不应为JPG或JPEG&#xff0c;因为这两种格式的图片不支持透明…

vscode中增加参数的一个方法

1 在settings.json 文件中增加参数 2. 在参数中配置 这里也是ok的

Python爬虫系列-有道批量翻译英文单词-注音标版

爬虫系列更新-第二篇文章——《Python爬虫系列-有道批量翻译英文单词-注音标版》 之前发布计算机英文单词时研究了下,怎么把一个含有大量英文单词的txt文件翻译成如下格式&#xff1a; 如上图,左边图片是需要翻译的txt文本,右边图片是翻译后的txt文本。 运行的实际界面效果。 …