OpenCV 直方图统计函数 cv::calcHist算是彻底弄明白了

参数说明

void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          OutputArray hist, int dims, const int* histSize,
                          const float** ranges, bool uniform = true, bool accumulate = false );
  • images 图像数组。每个图像的大小要一致,depth要一致,即数据类型要一致,但通道数可以不一致。
  • nimages 图像数组的大小,即images数组的大小
  • channels 参与计算的各个通道的索引。由于各图像的通道数并不一定一致,并且此函数也不强制要求所有通道都参与计算,因此此参数用于指定要参与计算的图像的通道索引。索引值包含了图像标识,以及图像的通道标识。具体方法为:
    第一个图像的索引标识为 [0,  images[0].channels()), 
    第二个图像的索引标识为 [mages[0].channels(),  mages[0].channels()+mages[1].channels())
    之后以此类推。
    例如:
    图像mages[0]有三个通道,其通道索引为{0, 1, 2};
    图像mages[1] 有两个通道,其通过索引为 {3, 4};
    图像mages[2] 有三个通道,其通过索引为 {5, 6, 7}
  • mask 此函数支持对图像中指定区域进行直方图统计
  • hist 直方图统计结果
  • dims 直方图维度。使用最多的也就是1维、2维,更高维应该很少吧。本文后续再详细说明。
  • histSize 指定各个通道的的直方图中分类数。此函数的设计是,多个像素取值可以划分为同个分类,例如:像素灰度值取值范围是[0, 255],但不一定要分成256类,可以为了8类,就可以通过histSize 这个参数指定。
  • ranges 指定各个通道的像素灰度值的取值范围。也就是说,此函数的设计并不要求各个通道的像素灰度值取值范围一致。例如:可以第一个通道取值是[0, 255], 第二个通道取值是[0, 127]。
    此外,此参数地用于与uniform的取值有关。
    uniform取值为true时,表示将像素取值平均分配为 histSize[i]个区域(此处的i表示,参与计算的第i个通道),此时,ranges[i]数组的大小通道是2,即ranges[i][0] 表示像素值的最小值,ranges[i][1]表示像素取值的最大值。
    uniform取值为false时,表示不平均分配区间。此时,此函数就不知道如何划分区间了,就需要调用者指定。此时,ranges[i]数组的大小为区间个数加1,即histSize[i]+1。

一维颜色直方图

如果要统计一个RGB图像,三个通道的各自的直方图,需要将dims设置为1,并调用三次calcHist函数。

{
    READ_IMG_DEF_ERR_RET(img, "img1.jpg");

    cv::imshow("原始图像", img);


    int channels[1] = { 0 }; 
    int histSize[1] = { 256 };
    float range[2] = { 0, 256 };
    const float* ranges[1] = { range}; // 指定每个通道的取值范围

    // 计算B通道的颜色直方图
    cv::Mat bHist;
    cv::calcHist(&img, 1, channels, cv::Mat(), bHist, 1, histSize, ranges);
    PRINT_IMG_INFO(bHist);
    // 计算G通道的颜色直方图
    cv::Mat gHist;
    cv::calcHist(&img, 1, channels, cv::Mat(), gHist, 1, histSize, ranges);
    PRINT_IMG_INFO(gHist);
    // 计算R通道的颜色直方图
    cv::Mat rHist;
    cv::calcHist(&img, 1, channels, cv::Mat(), rHist, 1, histSize, ranges);
    PRINT_IMG_INFO(rHist);

    cv::Mat bHistImg  = ImgTools->buildHistImg(bHist, 600, 600, cv::Scalar(255, 0, 0));
    cv::imshow("颜色直方图 B", bHistImg);
    cv::Mat gHistImg  = ImgTools->buildHistImg(gHist, 600, 600, cv::Scalar(0, 255, 0));
    cv::imshow("颜色直方图 G", gHistImg);
    cv::Mat rHistImg  = ImgTools->buildHistImg(rHist, 600, 600, cv::Scalar(0, 0, 255));
    cv::imshow("颜色直方图 R", rHistImg);

    cv::waitKey(0);
}

二维颜色直方图

此时需要将dims参数设置为2。

{
    cv::Mat imgs[2];
    imgs[0] = (cv::Mat_<uchar>(2, 4) << 0, 1,  3,  3, 3,  5,  6, 7);
    imgs[1] = (cv::Mat_<uchar>(2, 4) << 8, 9, 10, 11, 11, 13, 14, 15);

    ImgTools->dumpImg(imgs[0], "imags[0]: ");
    ImgTools->dumpImg(imgs[1], "imags[1]: ");

    cv::Mat img;
    cv::merge(imgs, sizeof(imgs) / sizeof(imgs[0]), img);
    ImgTools->dumpImg(img, "imag: ");

    int channels[3] = { 0, 1  }; 
    
    int histSize[3] = { 8, 8 };  
    float rRange[2] = { 0, 8 };
    float gRange[2] = { 8, 16 };
    const float* ranges[2] = { rRange, gRange}; // 指定每个通道的取值范围

    cv::Mat hist;
    cv::calcHist(&img, 1, channels, cv::Mat(), hist, 2, histSize, ranges);
    ImgTools->dumpImg(hist, "hist info:");

}

运行结果如下图所示:

 在代码中,计算两个通道,通过参数histSize指定,每个通道都分成8个分区,因此可能有64种组合结果,因此二维直方图的大小为8*8的矩阵。

在图像中(3,10)这个组合的数据只有一个,对应的分区编号是(3,2),因此二维直方图中(3,2)位置的数据值为1,即上图中绿色标记的位置。
在图像中 (3, 11)这个组合的数据有两个, (3, 11)对应的分区编号是(3,3),因此上图中的红色标记的位置的统计值为2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最强算法视频公开课!(内容硬核,完全免费!

和录友们汇报一下&#xff0c;代码随想录算法公开课已经更新完毕了。 由我亲自录制了140期算法视频&#xff0c;覆盖了 《代码随想录》纸质版上全部题目的讲解。 视频全部免费开放在B站&#xff1a;代码随想录 目录就在视频播放的右边&#xff0c;完全按照代码随想录的顺序讲…

鸿蒙Hi3861学习七-Huawei LiteOS-M(信号量)

一、简介 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中&#xff0c;各任务之间需要同步或互斥实现临界资源的保护&#xff0c;信号量功…

面对AI“龙卷风”破坏力 白宫“软着陆”欧盟“硬防御”

ChatGPT的风靡与风险将OpenAI的CEO山姆奥特曼&#xff08;Sam Altman&#xff09;送进白宫&#xff0c;他被蹲守在美国总统府邸的记者们围追&#xff0c;面对5月4日白宫发起的AI风险治理会议&#xff0c;奥特曼很官方地给出“重要也很及时”的回应&#xff0c;自信的反复强调“…

chatGPT润色中英论文软件-文章修改润色器

chatGPT可以润色英文论文吗&#xff1f; ChatGPT可以润色英文论文&#xff0c;它具备自动纠错、自动完善语法和严格全面的语法、句法和内容结构检查等功能&#xff0c;可以对英文论文进行高质量的润色和优化。此外&#xff0c;ChatGPT还支持学术翻译润色、查重及语言改写等服务…

Java入门指南:从零开始的基础语法

java语言概述 Java是一种高级编程语言&#xff0c;最初由Sun Microsystems&#xff08;现在是Oracle Corporation的一部分&#xff09;在1995年推出。Java以其简单、可移植和安全的特性而闻名&#xff0c;并广泛用于各种应用程序开发&#xff0c;从桌面应用程序到移动应用程序和…

icevision环境安装

Installation - IceVision # 1. git clone 代码# pip 换源&#xff1a; ~/.pip/pip.conf 隐藏文件[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-hostmirrors.aliyun.compip install -e .[all,dev]ImportError: cannot import name Multi…

ASEMI代理ADUM131E1BRWZ-RL原装ADI车规级ADUM131E1BRWZ-RL

编辑&#xff1a;ll ASEMI代理ADUM131E1BRWZ-RL原装ADI车规级ADUM131E1BRWZ-RL 型号&#xff1a;ADUM131E1BRWZ-RL 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOIC-16-300mil 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;16 工作温度…

WPF异常处理详解

总目录 文章目录 总目录一、WPF异常1 未捕获异常2 模拟未捕获异常场景 二、处理未捕获异常1 DispatcherUnhandledException 异常捕获2 UnhandledException异常捕获3 UnobservedTaskException异常捕获4 异常捕获的综合使用 结语 一、WPF异常 1 未捕获异常 正常情况下&#xff…

又一里程碑,alibaba首推Java技术成长笔记,业内评级“钻石级”

前言 根据数据表明&#xff0c;阿里巴巴已经连续3年获评最受欢迎的中国互联网公司&#xff0c;实际上阿里巴巴无论在科技创新力还是社会创造价值这几个方面&#xff0c;都是具有一定代表里的。在行业内&#xff0c;很多互联网企业也将阿里作为自己的标杆&#xff0c;越来越多的…

【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

iOS与Android应用开发的对比:如何选择最佳开发平台?

第一章&#xff1a;引言 在移动应用开发领域&#xff0c;iOS和Android是最为流行的操作系统。选择最佳的开发平台可以使开发人员更有效地开发和发布应用程序。本文将分析iOS和Android应用开发的优缺点&#xff0c;并提供一些有关如何选择最佳开发平台的建议。 第二章&#xf…

Kali-linux攻击WordPress和其他应用程序

今天越来越多的企业利用SAAS&#xff08;Software as a Service&#xff09;工具应用在他们的业务中。例如&#xff0c;他们经常使用WordPress作为他们网站的内容管理系统&#xff0c;或者在局域网中使用Drupal框架。从这些应用程序中找到漏洞&#xff0c;是非常有价值的。 为…

《算经》中的百钱买百鸡问题,你会做吗?试下看看(39)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 你知道我国历史上有个王朝叫北魏吗&#xff1f; 北魏&#xff08;386年—534年&#xff09;&#xff0c;南北朝时期北…

AdaSparse: 自适应稀疏网络的多场景CTR预估建模

▐ 摘要 CTR(Click-through rate)预估一直是推荐/广告领域重要技术之一。近年来&#xff0c;通过统一模型来服务多个场景的预估建模已被证明是一种有效的手段。当前多场景预估技术面临的挑战主要来自两方面&#xff1a;1&#xff09;跨场景泛化能力&#xff1a;尤其对稀疏场景&…

vscode IDE 能用的上的扩展工具功能介绍

记录分享vscode扩展&#xff0c;包括提升开发效率。必备。主题美化。ChatGPT等。 参考 vscode-extensions [Best] 记录分享方式&#xff0c;整理自己用的扩展&#xff0c;还有一键备份和还原方法。 ⭐快速下载和使用扩展 后面会介绍很多vscode扩展.这裡有一个技巧&#xff0c;…

为什么二极管具有单向导通性

大家都知道二极管具有单向导通性&#xff0c;比如一个双极性的信号通过二极管后会变成一个单极性的信号。 为了弄清这个问题先来看一下二极管的构成。 在纯净的硅晶体中掺入五价元素&#xff0c;比如磷&#xff0c;就形成了N型半导体&#xff0c;掺入的五价元素多余的电子很容…

uboot移植Linux-SD驱动代码解析

一、uboot与linux驱动 1.1、uboot本身是裸机程序 (1)狭义的驱动概念是指&#xff1a;操作系统中用来具体操控硬件的代码叫驱动 广义的驱动概念是指&#xff1a;凡是操控硬件的代码都叫驱动 (2)裸机程序中是直接使用寄存器的物理地址来操控硬件的&#xff0c;操作系统中必须通…

实时聊天如何做,让客户眼前一亮(一)

网站上的实时聊天功能应该非常有用&#xff0c;因为它允许客户支持立即帮助用户。在线实时聊天可以快速轻松地访问客户服务部门&#xff0c;而它也代表着企业的门面。 让我们讨论一下如何利用SaleSmartly&#xff08;ss客服&#xff09;在网站中的实时聊天视图如何提供出色的实…

纯前端JS实现文件上传解析渲染页面

AI真的能代替前端吗&#xff1f; 回答&#xff1a;不会完全代替 能用吗&#xff1f;复制到项目中只会报错 爆红 ……他完全不能理解你需要什么JavaScript&#xff08;简称JS&#xff09;是一种轻量级的脚本语言&#xff0c;主要用于在Web页面上添加交互行为。它由三个不同的…

项目环境配置、不知晓问题自己搜索后得到的解答

目录 Anolis OS龙蜥操作系统 Kernel Selection 4.18.0(RHCK) Compatible with RHEL (kernel-4.18.0) 4.19.91(ANCK) Support Anolis OS verified platform (kernel-4.19.91) 这两个内核选择哪个比较好呢&#xff1f; 我的C盘有些满&#xff0c;我该如何删除一些我需要的东西…