OpenCV calcHist()函数及其用法详解

news2024/9/20 6:40:18

        OpenCV calcHist()函数原型共有三个,如下:

        该函数计算一个或多个数组的直方图。用于递增直方图箱的元组的元素取自同一位置的相应输入数组。

函数参数:

       images  源(图像)数组。它们都应具有相同的深度、CV_8U、CV_16U 或 CV_32F 以及相同的大小。每个都可以有任意数量的通道。

       nimages 源图像数量

       channels 用于计算直方图的维度通道列表。第一个数组通道从 0 到 images[0].channels()-1 计数,第二个数组通道从 images[0].channels() 到 images[0].channels() + images[1] 计数。通道()-1,等等。

        mask 可选掩模。如果矩阵不为空,则它必须是与 images[i] 大小相同的 8 位数组。非零掩码元素标记直方图中计数的数组元素。

       hist  输出直方图,它是密集或稀疏的 dims 维数组。

       dims  直方图维数,必须为正且不大于 CV_MAX_DIMS(在当前 OpenCV 版本中等于 32)。

       histSize 每个维度的直方图数组大小

       ranges 每个维度中直方图 bin 边界的 dims 数组的数组。当直方图是均匀的 (uniform =true) 时,对于每个维度 i,足以指定第 0 个直方图 bin 的下限(包含)边界 L0 和上限(不包含)边界 UhistSize[i]−1最后一个直方图 bin histSize[i]-1 。也就是说,在均匀直方图的情况下,每个 range[i] 都是一个包含 2 个元素的数组。当直方图不均匀时(uniform=false),则每个range[i]包含histSize[i]+1个元素:L0,U0=L1,U1=L2,...,UhistSize[i]−2=LhistSize [i]−1,UhistSize[i]−1 。不在 L0 和 UhistSize[i]−1 之间的数组元素不计入直方图中。

    uniform 指示直方图是否均匀的标志

       accumulate 累积标志。如果设置了,直方图在分配时不会被清除。此功能使您能够从多组数组计算单个直方图,或及时更新直方图。

        这是一个重载成员函数,为方便起见而提供。它与上述函数的不同之处仅在于它接受的参数。 该重载函数使用 SparseMat 进行输出。

        这是一个重载成员函数,为方便起见而提供。它与上述函数的不同之处仅在于它接受的参数。 该重再函数仅支持统一直方图。 range 参数可以是空向量,也可以是 histSize.size()*2 元素(histSize.size() 元素对)的展平向量。每对的第一个和第二个元素指定下边界和上边界。

用法示例

新建一个控制台应用程序Project。在源程序中加入如下代码:

#include <iostream>
#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("1.jpeg");
    if (src.empty())
    {
        cout << "Cann't open the image!" << endl;
        return -1;
    }
    imshow("Src", src);

    vector<Mat> bgr;
    split(src, bgr);
    int numbins = 256;
    float range[] = { 0, 256 };
    const float* histRange = { range };
    Mat bhist, ghist, rhist;

    calcHist(&bgr[0], 1, 0, Mat(), bhist, 1, &numbins, &histRange);
    calcHist(&bgr[1], 1, 0, Mat(), ghist, 1, &numbins, &histRange);
    calcHist(&bgr[2], 1, 0, Mat(), rhist, 1, &numbins, &histRange);
    int width = 512;
    int height = 300;
    Mat histImage(height, width, CV_8UC3, Scalar(127, 127, 127));

    normalize(bhist, bhist, 0, height, NORM_MINMAX);
    normalize(ghist, ghist, 0, height, NORM_MINMAX);
    normalize(rhist, rhist, 0, height, NORM_MINMAX);

    int binStep = cvRound((float)width / numbins);

    for (int i = 1; i < numbins; i++)
    {
        line(histImage, Point(binStep * (i - 1), height - cvRound(bhist.at<float>(i - 1))), Point(binStep * i, height - cvRound(bhist.at<float>(i))), Scalar(255, 0, 0));
        line(histImage, Point(binStep * (i - 1), height - cvRound(ghist.at<float>(i - 1))), Point(binStep * i, height - cvRound(ghist.at<float>(i))), Scalar(0, 255, 0));
        line(histImage, Point(binStep * (i - 1), height - cvRound(rhist.at<float>(i - 1))), Point(binStep * i, height - cvRound(rhist.at<float>(i))), Scalar(0, 0, 255));
    }
    imshow("HistImage", histImage);

    waitKey(0);
}

试运行,结果如下:

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

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

相关文章

YOLOv8改进 - 注意力篇 - 引入CBAM注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了CBAM注意力在YOLOv8中的使用。包含CBAM原理分析&#xff0c;CBAM的代码、CBAM的使用方法、以及添加以后的yaml文件及运行记录。 二、CBAM原理分析 CBAM官方论文地址&#xff1a;CBAM论文 CBAM的pytorch版代码&#xff…

Gateway网关的实现

API网关 网关路由必须支持负载均衡&#xff0c;服务列表是从注册中心拉取的客户端发出请求的URL指向的是网关&#xff0c;URL还必须要包含目标信息网关收到URL&#xff0c;通过一定的规则&#xff0c;要能识别出交给哪个实例去处理网关有能力对请求响应进行修改 引入依赖包 …

图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)

DFS 基础 BFS 基础 Leetcode 815. 公交路线 思路&#xff1a; class Solution { public:int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {// 记录经过车站x的公交车编号 hashunordered_map<int, vector<int>> …

frp内网穿透功能使用教程

frp 是一款高性能的反向代理应用&#xff0c;专注于内网穿透。它支持多种协议&#xff0c;包括 TCP、UDP、HTTP、HTTPS 等&#xff0c;并且具备 P2P 通信功能。使用 frp&#xff0c;您可以安全、便捷地将内网服务暴露到公网&#xff0c;通过拥有公网 IP 的节点进行中转。 文档地…

Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)

文章目录 一、Scrapy 框架介绍1.1 数据流1.2 项目结构1.3 Scrapy 入门 二、Selector 解析器2.1 XPath 和 CSS 选择器2.2 信息提取2.3 正则提取 三、Spider 的使用3.1 Spider 运行流程3.2 Spider 类分析3.3 Request3.4 Response 四、Download Middleware 的使用4.1 process_requ…

55.【C语言】字符函数和字符串函数(strstr函数)

11.strstr函数 *简单使用 strstr: string string cplusplus的介绍 点我跳转 翻译: 函数 strstr const char * strstr ( const char * str1, const char * str2 ); 或另一个版本char * strstr ( char * str1, const char * str2 ); 寻找子字符串 返回指向第一次出现在字…

PostMan使用变量

环境变量 使用场景 当测试过程中&#xff0c;我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器&#xff0c;那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后&#xff0c;需要大量的更改接口的url地址 全局变量 使用场景 当…

chapter2-站点首页功能实现

1. 导航功能实现 导航数据的存储&#xff0c;必须要找出导航数据的结构&#xff0c;也就是有哪些属性&#xff1f; 导航位置、导航名称、导航链接、导航序号、是否显示、是否外链、添加时间、更新时间、是否删除 E-R图&#xff0c;如下&#xff1a; 1.1 创建模型 home/model…

Ardupilot开源飞控之VTOL之旅:且败且战

Ardupilot开源飞控之VTOL之旅&#xff1a;且败且战 1. 源由2. 希望3. 打印件3.1 Back_cover_AKK_Race_Ranger_VTX_SMA3.2 CRSF-Ant_mount_TPU3.3 H743_mount 4. 其他问题5. 总结6. 参考资料 1. 源由 折腾了这么久&#xff0c;可是VTOL就是一直没有装起来&#xff0c;主要问题还…

vs2022快捷键异常解决办法

安装了新版本的vs2022&#xff0c;安装成功后&#xff0c;发现快捷键发生异常&#xff0c;之前常用的快捷键要么发生改变&#xff0c;要么无法使用&#xff0c;比如原来注释代码的快捷键是ctrlec&#xff0c;最新安装版本变成了ctrlkc&#xff0c;以前编译代码的快捷键是F6或者…

【delphi】正则判断windows完整合法文件名,包括路径

在 Delphi 中&#xff0c;可以使用正则表达式来检查 Windows 文件名称或路径是否合法。合法的文件名和路径要求符合以下几点&#xff1a; 禁止的字符&#xff1a;文件名和路径不能包含以下字符&#xff1a;<, >, :, ", /, \, |, ?, *。文件名不能以空格或点结束。…

一文讲懂Mac中的环境变量

你是否曾经因为环境变量配置不当而浪费了宝贵的开发时间?你是否好奇为什么有时候在终端输入命令会提示"command not found",而有时候又能正常运行?如果你是一名Mac用户,并且希望真正掌握环境变量的奥秘,那么这篇文章将为你揭开Mac中环境变量的神秘面纱,帮助你成为一…

BFS 解决边权为1的最短路问题

边权为1的最短路问题 最短路问题&#xff1a; 比如说从D->K&#xff0c;找出最短的那条&#xff0c;其中每条路都是有权值&#xff0c;此篇主要讲解的边权为1的最短路问题。 即边权都是一样的。 解法就是从起点开始&#xff0c;做一次BFS&#xff1a; 需要一个队列、一个…

深入理解IP地址分类及子网划分详解

在互联网时代&#xff0c;IP地址是网络通信的基础。无论是访问网站、发送电子邮件&#xff0c;还是进行数据传输&#xff0c;IP地址都扮演着至关重要的角色。本文将详细解析IP地址的分类及子网划分的原理&#xff0c;帮助你更好地理解网络架构及其应用。 一、什么是IP地址 IP…

通信工程学习:什么是TDMA时分多址

TDMA时分多址 TDMA&#xff08;Time Division Multiple Access&#xff0c;时分多址&#xff09;是一种在无线通信中广泛使用的多址接入技术。它通过将时间划分为不重叠的时间帧&#xff0c;并将每个时间帧进一步划分为多个时隙&#xff0c;每个时隙分配给不同的用户或通信系统…

8.JMeter+Ant(基于工具的实现接口自动化,命令行方式)

一、JMeterAnt&#xff08;基于工具的实现接口自动化&#xff09; 如果想要实现自动化&#xff0c;就必须使用命令行。 1.jmeter命令 -n 使用非界面的方式去执行脚本 -t 指定jmeter的脚本位置 -l 生成jtl报告&#xff0c;可以通过查看结果树来解析 -e 生产html格式的报告 -o …

p14 使用阿里云服务器的docker部署NGINX

拉取NGINX的镜像 这里因为之前已经配置过从阿里云的镜像仓库里面拿镜像所以这里直接就执行docker pull nginx拉取NGINX镜像就OK了 运行NGINX镜像 这里执行docker run -d --name nginx01 -p 3344:80 nginx这里3344是服务器访问的端口80是容器内部的端口&#xff0c;可以看到…

Flask-JWT-Extended登录验证, 不用自定义

"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&#xff1…

【贪心】【数据结构-小根堆,差分】力扣2406. 将区间分为最少组数

给你一个二维整数数组 intervals &#xff0c;其中 intervals[i] [lefti, righti] 表示 闭 区间 [lefti, righti] 。 你需要将 intervals 划分为一个或者多个区间 组 &#xff0c;每个区间 只 属于一个组&#xff0c;且同一个组中任意两个区间 不相交 。 请你返回 最少 需要…

vue3 ref的用法及click事件的说明

1、ref可以定义一个简单的属性&#xff0c;也可以是一个复杂的列表、数组等等。 2、为什么要使用 ref&#xff1f;简单的let个变量不行吗&#xff1f;const个变量不行吗&#xff1f; 其实这个跟vue的响应式的系统有关&#xff0c;官方的说明如下&#xff1a; 3、为 ref() 标注…