当前位置: 首页 > news >正文

探索OpenCV中直方图的神奇之处:应用与实现

文章目录

  • 导言:
  • 直方图概述:
  • 函数原型
    • 参数说明:
    • 代码示例
  • 应用场景:
  • 结语:

导言:

直方图是数字图像处理中一个强大而重要的工具,它通过可视化数据的分布情况,帮助我们更好地理解图像的特征。在本文中,我们将深入探讨使用C++和OpenCV库创建直方图的过程,并介绍一些直方图的应用场景。

直方图概述:

直方图是对数据分布的图形表示,常用于分析图像中的像素强度分布。在图像处理中,直方图可以帮助我们了解图像的亮度、对比度等信息。OpenCV提供了一个名为calcHist的函数,它用于计算图像的直方图。

函数原型

calcHist 函数是OpenCV中用于计算直方图的函数。以下是该函数的原型:


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:输入的图像数组,可以是单张图像,也可以是图像数组。如果有多张图像,它们将被视为一个整体,形成一个累积的直方图。

nimages:图像的数量,当输入图像数组只包含一张图像时,该值为1。

channels:要考虑的通道的索引,通常是[0]表示灰度图,[0, 1, 2]表示彩色图的所有通道。例如,当处理灰度图时,channels为0,对应灰度值;当处理彩色图时,channels可以为[0]、[1]、[2],分别对应蓝色、绿色和红色通道。

mask:可选的掩码图像,用于限制直方图的计算范围。只有掩码图像中对应位置为非零的像素值才会被用于计算直方图。

hist:输出的直方图。这是一个输出数组,用于保存计算得到的直方图。

dims:直方图的维度,通常是1。

histSize:每个维度的直方图尺寸,以数组形式提供。例如,对于灰度图像,histSize可能是256;对于彩色图像,通常对每个通道使用相同的直方图尺寸。

ranges:每个维度的像素值范围,以数组形式提供。对于灰度图像,范围通常是[0, 256];对于彩色图像,每个通道的范围可以是[0, 256]。

uniform:一个布尔值,用于指定直方图是否是均匀的。如果为true,则直方图的每个bin都具有相同的尺寸;如果为false,则每个bin的尺寸将根据输入像素值的范围调整。

accumulate:一个布尔值,用于指定是否累积直方图。如果为true,则在多张图像上计算直方图时,直方图将被累积;如果为false,则直方图将被重置为零。

代码示例


#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>using namespace cv;int main() {Mat image = imread("sample.jpg", IMREAD_GRAYSCALE);  // 以灰度模式读取图像if (image.empty()) {std::cerr << "Error: Could not open or find the image!\n";return -1;}// 定义直方图参数int histSize = 256;  // 灰度级别的数量float range[] = {0, 256};  // 像素值范围const float* histRange = {range};// 计算直方图Mat hist;calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange);// 绘制直方图int histWidth = 512;int histHeight = 400;int binWidth = cvRound((double) histWidth/histSize);Mat histImage(histHeight, histWidth, CV_8UC3, Scalar(255, 255, 255));// 归一化直方图数据normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());// 绘制直方图for (int i = 1; i < histSize; i++) {line(histImage, Point(binWidth * (i - 1), histHeight - cvRound(hist.at<float>(i - 1))),Point(binWidth * (i), histHeight - cvRound(hist.at<float>(i))),Scalar(0, 0, 255), 2, 8, 0);}// 显示原图和直方图imshow("Image", image);imshow("Histogram", histImage);waitKey(0);return 0;
}

应用场景:

图像增强: 通过分析图像的直方图,我们可以调整图像的对比度和亮度,使其更具有视觉吸引力。
图像分割: 直方图分析有助于确定图像中不同区域的分界线,从而实现图像分割的目的。
颜色识别: 对于彩色图像,可以分析各通道的直方图,从而实现颜色的识别与分析。
代码解析:

首先,通过imread函数读取图像,并使用IMREAD_GRAYSCALE将其转换为灰度图像。
使用calcHist函数计算图像的直方图,其中包括灰度级别的数量、像素值范围等参数。
创建一个用于绘制直方图的图像,然后通过line函数绘制直方图的线条。
最后,通过imshow函数显示原始图像和生成的直方图。

结语:

直方图是图像处理中的一个强大工具,通过OpenCV提供的calcHist函数,我们能够轻松地分析图像的像素分布。了解直方图的应用场景,能够更好地指导我们在图像处理中的决策与操作。通过这篇文章,希望读者能够深入了解直方图的魅力,进一步掌握图像处理的技能。

相关文章:

探索OpenCV中直方图的神奇之处:应用与实现

文章目录 导言&#xff1a;直方图概述&#xff1a;函数原型参数说明&#xff1a;代码示例 应用场景&#xff1a;结语&#xff1a; 导言&#xff1a; 直方图是数字图像处理中一个强大而重要的工具&#xff0c;它通过可视化数据的分布情况&#xff0c;帮助我们更好地理解图像的特…...

MapReduce编程——矩阵乘法(Python版本)

数据格式 对于矩阵元素 A i j A_{ij} Aij​&#xff0c;将其处理为 < i , j , M a t r i x N a m e , v a l u e > <i,j,MatrixName,value> <i,j,MatrixName,value>的四元组格式&#xff0c;例如矩阵[[2, 1, 3, 4], [10, -8, 7, 2], [9, 1, 6, -2]]可被转化…...

nature日报:为什么印度德里现在的空气污染如此严重?

为什么印度德里现在的空气污染如此严重&#xff1f; 后季风季节为印度大城市的空气污染积累创造了理想的条件。 本文整理扩展自2023年11月10日nature杂志的NEWS EXPLAINER——Why is Delhi’s air pollution so bad right now? (nature.com) Highlights 季风期间&#xff0…...

ChatGPT、GPT-4 Turbo接口调用

接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion 请求方式 post 请求参数 model可选值&#xff1a; “gpt-3.5-turbo-1106”、 “gpt-3.5-turbo-16k” 、 “gpt-4”、“gpt-4-1106-preview”。 默认值为&#xff1a; “gpt-3.5-turbo-1106” to…...

IDEA中常用的调试快捷键

启动调试 对于Maven项目&#xff1a;Shift F9 对于普通项目&#xff1a;Shift F10 进入调试模式 Shift F9 逐行执行 逐行跳过&#xff1a;F8 逐行步入&#xff1a;F7 逐行步出&#xff1a;Shift F8 继续执行 F9 停止调试 Ctrl F2 设置断点 在代码行号左侧双击&#x…...

需要设计易清洗的口琴

我发现口琴很容易被异物影响。然后就需要清洗。正好手头有一个合适的螺丝刀&#xff0c;还比较方便。 反之一想&#xff0c;应该设计一种口琴&#xff0c;可以方便的拆开&#xff0c;用水清洗。晾干后就能组装。设计上当然会面临一些问题&#xff0c;比如音簧容易变音等。这个可…...

贝锐蒲公英智慧运维方案:实现远程网络监控、管理、维护工业设备

为了提升运维效率&#xff0c;能够及时发现和响应设备的故障、异常和潜在问题。 越来越多的企业都在搭建“集中式”的远程智慧运维体系&#xff0c;以提高运维效率和降低成本。 但是&#xff0c;受限于网络&#xff0c;将不同地域的资源和信息进行整合&#xff0c;实现统一管理…...

Intel oneAPI笔记(4)--jupyter官方文档(Unified Shared Memory)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/03_Unified_Shared_Memory文档的学习记录&#xff0c;主要包含对统一共享内存的讲解 USM概述 USM (Unified Shared Memory)是SYCL中基于指针的内存管理。对于使用malloc或new来分配数据的C和C程序员来说应该很熟悉。当将现有的C…...

dRep-基因组质控、去冗余及物种界定

文章目录 Install依赖关系 常用命令常见问题pplacer线程超过30报错当比较基因组很多&#xff08;>4096&#xff09;有了Bdv.csv文件后无需输入基因组list 超多基因组为什么需要界定种&#xff1f;dRep重要概念次级ANI的选择Minimum alignment coverage3. 选择有代表性的基因…...

截图贴图软件推荐 - 附下载链接 | Snipaste | Steuna

截图贴图软件推荐 - 附下载链接 | Snipaste | Steuna 前言下载链接Snipaste&#xff08;推荐&#xff09;Steuna 前言 Win系统下截图软件多种多样&#xff0c;但贴图软件少之又少&#xff0c;本文介绍2个带有贴图功能的截图软件&#xff0c;分别是Snipaste和Steuna。可将截图固…...

python调用chrome实现网页自动操作

一. 内容简介 python调用chrome实现网页自动操作。 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a; 三.主要流程 3.1 下载驱动和插件 调用谷歌浏览器&#xff0c;需要下载浏览器驱动&#xff08;https://registry.npmmirror.co…...

FFMPEG库实现mp4/flv文件(H264+AAC)的封装与分离

ffmepeg 4.4&#xff08;亲测可用&#xff09; 一、使用FFMPEG库封装264视频和acc音频数据到 mp4/flv 文件中 封装流程 1.使用avformat_open_input分别打开视频和音频文件&#xff0c;初始化其AVFormatContext&#xff0c;使用avformat_find_stream_info获取编码器基本信息 2.使…...

《红蓝攻防对抗实战》九.内网穿透之利用GRE协议进行隧道穿透

​ 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解 《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网 《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网 《红蓝攻防对抗实战》四.内网探测协议出网之ICMP协议探测出网 《红蓝…...

大数据毕业设计选题推荐-智慧消防大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

LeetCode 面试题 16.20. T9键盘

文章目录 一、题目二、C# 题解 一、题目 在老式手机上&#xff0c;用户通过数字键盘输入&#xff0c;手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列&#xff0c;实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射…...

systemctl enable docker.service报错“Failed to execute operation: Bad message“

将docker加入到开机自启&#xff0c;报错&#xff1a; 解决&#xff1a; 重新粘贴复制&#xff1a; [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target…...

向量的范数、矩阵的范数

向量的范数 p-范数 常用的0-范数、1-范数、2-范数、无穷-范数其实都是p-范数的特殊情形。 0-范数 当p0时&#xff0c;表示0-范数。它比较特殊&#xff0c;本质是一种计数&#xff0c;表示向量中非0元素的个数。 1-范数&#xff08;也称L1范数&#xff09; 当p1时&#xff…...

C# OpenCvSharp 玉米粒计数

效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.*|*.bmp;…...

前端缓存机制——强缓存、弱缓存、启发式缓存

强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存&#xff1a; 浏览器发起请求&#xff0c;查询浏览器的本地缓存&#xff0c;如果找到资源&#xff0c;则直接在浏览器中使用该资源。若是未找到&#xff0c;或者资源已过期&#xff0c;则浏览器缓存返回未…...

对称密钥加密与非对称密钥加密:原理与应用

在信息安全领域&#xff0c;对称密钥加密和非对称密钥加密是两种重要的加密方法&#xff0c;它们各有特点&#xff0c;适用于不同的场景。本文将详细介绍这两种加密方法的原理&#xff0c;并通过实例说明其应用&#xff0c;同时阐述在报文传输过程中&#xff0c;何时使用对称密…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...