Opencv中的直方图(2)计算图像的直方图函数calcHist()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算一组数组的直方图。
函数 cv::calcHist 计算一个或多个数组的直方图。用于递增直方图bin的元组的元素是从相同位置的相应输入数组中获取的。下面的示例展示了如何为彩色图像计算一个2D色调-饱和度直方图。

#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
int main( int argc, char** argv )
{Mat src, hsv;if( argc != 2 || !(src=imread(argv[1], IMREAD_COLOR)).data )return -1;cvtColor(src, hsv, COLOR_BGR2HSV);// Quantize the hue to 30 levels// and the saturation to 32 levelsint hbins = 30, sbins = 32;int histSize[] = {hbins, sbins};// hue varies from 0 to 179, see cvtColorfloat hranges[] = { 0, 180 };// saturation varies from 0 (black-gray-white) to// 255 (pure spectrum color)float sranges[] = { 0, 256 };const float* ranges[] = { hranges, sranges };MatND hist;// we compute the histogram from the 0-th and 1-st channelsint channels[] = {0, 1};calcHist( &hsv, 1, channels, Mat(), // do not use maskhist, 2, histSize, ranges,true, // the histogram is uniformfalse );double maxVal=0;minMaxLoc(hist, 0, &maxVal, 0, 0);int scale = 10;Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);for( int h = 0; h < hbins; h++ )for( int s = 0; s < sbins; s++ ){float binVal = hist.at<float>(h, s);int intensity = cvRound(binVal*255/maxVal);rectangle( histImg, Point(h*scale, s*scale),Point( (h+1)*scale - 1, (s+1)*scale - 1),Scalar::all(intensity),-1 );}namedWindow( "Source", 1 );imshow( "Source", src );namedWindow( "H-S Histogram", 1 );imshow( "H-S Histogram", histImg );waitKey();
}

函数原型1

void cv::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 
)		

参数1

  • 参数 images 源数组。它们都应该具有相同的深度(CV_8U, CV_16U 或 CV_32F),并且具有相同的尺寸。每一个都可以有任意数量的通道。
  • 参数nimages 源图像的数量。
  • 参数channels 用于计算直方图的各维通道列表。第一个数组的通道编号从 0 到 images[0].channels()-1,第二个数组的通道编号从 images[0].channels() 到 images[0].channels() + images[1].channels()-1,依此类推。
  • 参数mask O可选掩码。如果矩阵不为空,它必须是一个与 images[i] 同尺寸的8位数组。非零的掩码元素标记了计入直方图的数组元素。
  • 参数hist 输出直方图,它是一个稠密或稀疏的多维数组。
  • 参数dims 直方图的维数,必须是正数且不大于 CV_MAX_DIMS(在当前 OpenCV 版本中等于 32)。
  • 参数histSize 直方图每个维度的大小数组。
  • 参数ranges 每个维度直方图bin边界的数组。当直方图是均匀的(uniform=true)时,对于每个维度 i,只需指定第0个直方图bin的下(包含)边界 L0 和最后一个直方图bin histSize[i]-1 的上(不包含)边界 UhistSize[i]−1。也就是说,在均匀直方图的情况下,ranges[i] 是一个包含2个元素的数组。当直方图不是均匀的(uniform=false)时,ranges[i] 包含 histSize[i]+1 个元素:L0, U0=L1, U1=L2, …, UhistSize[i]−2=LhistSize[i]−1, UhistSize[i]−1。不在 L0 和 UhistSize[i]−1 之间的数组元素不会被计入直方图。
  • 参数uniform 指示直方图是否是均匀的标志(参见上面的描述)。
  • 参数accumulate 累积标志。如果设置,那么在分配直方图开始时不将其清空。此功能使您能够从几组数组中计算单个直方图,或随时间更新直方图。

函数原型2

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

void cv::calcHist
(const Mat * 	images,int 	nimages,const int * 	channels,InputArray 	mask,SparseMat & 	hist,int 	dims,const int * 	histSize,const float ** 	ranges,bool 	uniform = true,bool 	accumulate = false 
)		

函数原型3

这是一个重载的成员函数,为了方便而提供。它与上述函数的不同之处仅在于它接受的参数。
这个变体只支持均匀直方图。
ranges 参数要么是一个空向量,要么是一个展平的向量,包含 histSize.size() * 2 个元素(即 histSize.size() 个元素对)。每对元素的第一个和第二个元素分别指定下界和上界。

void cv::calcHist
(InputArrayOfArrays 	images,const std::vector< int > & 	channels,InputArray 	mask,OutputArray 	hist,const std::vector< int > & 	histSize,const std::vector< float > & 	ranges,bool 	accumulate = false 
)		

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 加载图像cv::Mat image = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg", cv::IMREAD_COLOR );if ( image.empty() ){std::cerr << "Error: Image not found or unable to read." << std::endl;return -1;}// 将图像从BGR转换到HSV颜色空间cv::Mat hsv;cvtColor( image, hsv, cv::COLOR_BGR2HSV );// 定义直方图参数int hue_bins   = 180;  // 色调范围是从0到179int sat_bins   = 256;  // 饱和度范围是从0到255int histSize[] = { hue_bins, sat_bins };// H和S的范围float hue_range[]     = { 0, 180 };float sat_range[]     = { 0, 256 };const float* ranges[] = { hue_range, sat_range };// 指定我们要计算直方图的两个通道(Hue和Saturation)int channels[] = { 0, 1 };// 创建一个空的直方图cv::Mat hist;calcHist( &hsv, 1, channels, cv::Mat(),              // 图像,图像数量,通道,掩码hist, 2, histSize, ranges, true, false );  // 2D直方图,直方图尺寸,范围// 对直方图进行归一化,使其值在 0 到 255 之间cv::normalize( hist, hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat() );int hist_w = 512;int hist_h = 400;int bin_w  = cvRound( ( double )hist_w / hue_bins );cv::Mat histImage( hist_h, hist_w, CV_8UC3, cv::Scalar( 0, 0, 0 ) );for ( int h = 0; h < hue_bins; h++ )for ( int s = 0; s < sat_bins; s++ ){double binVal = hist.at< float >( h, s );  // 获取直方图值int val       = cvRound( binVal );         // 四舍五入cv::rectangle( histImage, cv::Point( h * bin_w, hist_h ), cv::Point( ( h + 1 ) * bin_w, hist_h - val ), cv::Scalar( 255, 0, 0 ), -1 );}cv::imshow( "original image", image );cv::imshow( "Hue-Saturation Histogram", histImage );cv::waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

vue多环境配置和打包

件名的后缀来指定它们仅在特定模式下被加载。 .env&#xff1a;所有环境下都会加载的通用配置。 .env.local&#xff1a;本地覆盖配置&#xff0c;不加入版本控制。 .env.[mode]&#xff1a;仅为指定的模式加载的配置文件&#xff0c;例如.env.development、.env.production、…

Cursor是什么?Cursor Pro Plus 如何订阅升级教程

一、Cursor是什么&#xff1f; Cursor 是一个基于 Visual Studio Code&#xff08;VS Code&#xff09;技术构建的高级代码编辑器&#xff0c;专为提高编程效率并更深度地整合 AI 功能而设计。它不仅继承了 VS Code 的强大功能和用户界面&#xff0c;还增加了专门针对 AI 支持…

Agent(智能体)和 MetaGPT,一句话实现整个需求应用代码

前面 2 篇文章&#xff0c;我们使用文生文、文生图和文生音频三个大模型共同实现了图文并茂的儿童绘本故事和绘本故事音频需求&#xff1a; 第一篇 根据主题生成儿童绘本故事&#xff1a;GLM-4-Flash 大模型 API 免费了&#xff0c;手把手构建“儿童绘本”应用实战&#xff08…

Nuxt3入门:过渡效果(第5节)

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 Nuxt 利用 Vue 的 <Transition> 组件在页面和布局之间应用过渡效果。 一、页面过渡效果 你可以启用页面过渡效果&#xff0c;以便对所有页面应用自动过渡效果。 nuxt.config.js export defaul…

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP&#xff1a; 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率&#xff08;采用顺推&#xff09; 从 初始状态推向结果&#xff0c;同一般的DP类似&#xff0c;只是经历了概率论知识的包装。 老题&#xff1a; 添加链接描述 题意&#xff1a; 袋子里有w只白鼠&am…

linux编译器——gcc/g++

1.gcc linux上先要安装&#xff0c; sudo yum install gcc gcc --version 可以查看当前的版本 &#xff0c;我们默认安装的是4.8.5的版本&#xff0c;比较低&#xff0c; gcc test.c -stdc99 可以使他支持更高版本的c标准 -o 可以殖指明生成文件的名字&#xff0c;可以自己…

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​&#xff0c;请问这个序列最长有多少长的前缀&#xff0c;满足元素的和大于或等于 00&#xff1f;如果任何长度大于 00 的前缀之和都为负数&#xff0c;则输出 00 输入格式 第一行&#xff1a;单个整数表示 nn第二行&a…

经验笔记:JSP(JavaServer Pages)

JSP&#xff08;JavaServer Pages&#xff09;经验笔记 JSP&#xff08;JavaServer Pages&#xff09;是一种用于创建动态网页的技术&#xff0c;它允许在HTML页面中嵌入Java代码&#xff0c;从而实现动态内容的生成。JSP与Servlet一样&#xff0c;都是Java EE平台的一部分&am…

随机森林的知识博客:原理与应用

随机森林&#xff08;Random Forest&#xff09;是一种基于决策树的集成学习算法&#xff0c;它通过组合多棵决策树的预测结果来提升模型的准确性和稳健性。随机森林具有强大的分类和回归能力&#xff0c;广泛应用于各种机器学习任务。本文将详细介绍随机森林的原理、构建方法及…

大数据系列之:Java8和java11查看进程堆内存使用情况

大数据系列之:Java8和java11查看进程堆内存使用情况 Java8查看进程堆内存java11查看进程堆内存进程堆内存使用情况评估Java8查看进程堆内存 jmap -F -heap 2723jmap -F -heap 2723是一个Java命令行工具jmap的使用示例。它用于生成Java进程2723的堆内存信息。其中,-F选项表示…

JavaSE-易错题集-001

1. AccessViolationException异常触发后&#xff0c;下列程序的输出结果为&#xff08; &#xff09; 1 2 3 4 5 6 7 8 9 10 11 12 13 static void Main(string[] args) { try { throw new AccessViolationException(); Console.Write…

OpenCV图像分割教程

OpenCV 图像分割教程 OpenCV 是一个非常强大的计算机视觉库&#xff0c;支持各种图像处理任务。图像分割是 OpenCV 支持的一个重要功能&#xff0c;它用于将图像划分为不同的区域&#xff0c;识别感兴趣的部分。我们将通过介绍 OpenCV 中的图像分割方法&#xff0c;包括基础功…

ubantu安装mysql + redis数据库并使用C/C++操作数据库

mysql 安装mysql ubuntu 安装 MySql_ubuntu安装mysql-CSDN博客 Ubuntu 安装 MySQL 密码设置_ubuntu安装mysql后设置密码-CSDN博客 service mysql restart1 C/C连接数据库 C/C 连接访问 MySQL数据库_c mysql-CSDN博客 ubuntu安装mysql的c开发环境_ubuntu 搭建mysql c开发…

测试一些概念

软件测试 软件测试流程 需求分析&#xff1a;在这个阶段&#xff0c;测试人员会审查和分析项目的需求文档&#xff0c;以确保他们理解需要测试的功能和特性。 制定测试计划&#xff1a;在这个阶段&#xff0c;测试人员会制定一个详细的测试计划&#xff0c;包括测试目标、测…

跨越技术壁垒:EasyCVR为何选择支持FMP4格式,重塑视频汇聚平台标准

随着物联网、大数据、云计算等技术的飞速发展&#xff0c;视频监控系统已经从传统的安防监控扩展到智慧城市、智能交通、工业制造等多个领域。视频流格式作为视频数据传输与存储的基础&#xff0c;其兼容性与效率直接影响到整个视频监控系统的性能。 在众多视频流格式中&#…

TCP Analysis Flags 之 TCP Port numbers reused

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

pytorch计算网络参数量和Flops

from torchsummary import summary summary(net, input_size(3, 256, 256), batch_size-1)输出的参数是除以一百万&#xff08;/1000000&#xff09;M&#xff0c; from fvcore.nn import FlopCountAnalysis inputs torch.randn(1, 3, 256, 256).cuda() flop_counter FlopCo…

停车场小程序如何实现分账功能?

智慧停车平台为什么迫切需要分账功能的原因&#xff0c;通过清结算系统提供的服务商分账功能&#xff0c;可以有效提高交易环节的分账效率。平台方只需要在后台配置好与各服务商、业主等多方分账规则&#xff0c;待交易订单形成后&#xff0c;清结算系统会自动化分账&#xff0…

十大口碑最好开放式蓝牙耳机是哪些?五款热销好用产品测评!

​开放式耳机现在超火&#xff0c;成了时尚、好看又舒服的代名词&#xff0c;迅速俘获了一大波粉丝&#xff0c;成了耳机界的新宠儿。跟那些传统的入耳式耳机比起来&#xff0c;开放式耳机戴着更稳&#xff0c;对耳朵也更友好。不过&#xff0c;也有人觉得这玩意儿不值&#xf…

系统找不到指定的文件怎么解决?

把U盘插在电脑上&#xff0c;当我打开U盘中的文件时&#xff0c;弹窗提示系统找不到指定的文件&#xff0c;这是什么情况&#xff1f;有谁遇到过吗&#xff1f;大家有没有解决办法&#xff1f; 这个问题可能大家并不陌生&#xff0c;可能也曾遇到过&#xff0c;造成问题出现的原…