当前位置: 首页 > 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;何时使用对称密…...

python buildah

# 聊聊Python和Podman那点事儿 最近几年容器技术火得不行&#xff0c;Docker几乎成了标配。但如果你在Python开发圈子里待得够久&#xff0c;可能会注意到另一个名字开始频繁出现——Podman。这东西到底是个什么来头&#xff0c;和咱们Python开发又有什么关系&#xff1f;今天就…...

从风格迁移到目标检测:Instance Norm、Layer Norm、Group Norm的跨界应用与PyTorch代码对比

从风格迁移到目标检测&#xff1a;Instance Norm、Layer Norm、Group Norm的跨界应用与PyTorch代码对比 在计算机视觉领域&#xff0c;归一化技术&#xff08;Normalization&#xff09;早已超越简单的训练加速工具&#xff0c;成为模型设计中影响特征表达的关键因素。传统Batc…...

状态机+事件驱动框架在嵌入式开发中的5个常见误区及避坑指南

状态机事件驱动框架在嵌入式开发中的5个常见误区及避坑指南 在嵌入式系统开发中&#xff0c;状态机与事件驱动框架的组合堪称黄金搭档&#xff0c;它们共同构建了响应迅速、结构清晰的软件架构。然而&#xff0c;就像任何强大的工具一样&#xff0c;如果使用不当&#xff0c;这…...

Windows上运行Android应用的3种革命性方法:告别模拟器的时代已来

Windows上运行Android应用的3种革命性方法&#xff1a;告别模拟器的时代已来 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾在电脑上想玩手机游戏却苦于模拟器…...

FastAPI后台任务完成,如何设计一个全局的、不掉线的SSE通知中心?

FastAPI全局SSE通知中心设计&#xff1a;构建高可靠异步任务通信架构 当用户点击"生成年度报表"按钮时&#xff0c;页面瞬间响应"任务已开始处理"&#xff0c;而背后的数据聚合运算可能持续20分钟。如何让用户在这段时间自由浏览其他页面&#xff0c;并在…...

题目一: 准备生日礼物 100分

限制&#xff1a;1s 空间限制&#xff1a;256MB 限定语言&#xff1a;C(clang11), C(clang11).Java(javac 1.8), Python3(3.9), JavaScript Node(12.18.2), Go(1.14.4), Rust(1.44) 题目描述&#xff1a;小明在一个充满人文关怀的公司上班&#xff0c;公司每个月都要为该月生日…...

宏基AS6530笔记本时序解析:从G3到S0的硬件启动密码

1. 宏基AS6530笔记本的硬件启动密码&#xff1a;从G3到S0的时序解析 当你按下笔记本电源键的那一刻&#xff0c;主板就像在解一道精密的数学题——每个电压和信号必须按照特定顺序出现&#xff0c;错一步就会导致启动失败。宏基AS6530采用的广达ZK3代工板&#xff0c;其启动时序…...

Translumo:打破语言壁垒的终极解决方案——实时屏幕翻译工具深度解析

Translumo&#xff1a;打破语言壁垒的终极解决方案——实时屏幕翻译工具深度解析 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translum…...

用Python+Matplotlib分析你的游戏战绩:手把手教你画多组数据对比箱线图

用PythonMatplotlib分析你的游戏战绩&#xff1a;手把手教你画多组数据对比箱线图 每次游戏结束后&#xff0c;看着战绩面板上密密麻麻的数字&#xff0c;你是否好奇自己最擅长的英雄究竟是哪个&#xff1f;或者想知道在不同时间段的表现稳定性如何&#xff1f;箱线图&#xf…...

XTDRONE:ego_planner三维运动规划核心状态机与实时避障解析

1. XTDRONE与ego_planner的核心架构解析 XTDRONE作为开源无人机仿真平台&#xff0c;其核心运动规划模块ego_planner采用了典型的状态机设计模式。这个设计最精妙之处在于将复杂的运动规划问题分解为有限状态集合和状态转移规则&#xff0c;就像交通信号灯的红黄绿状态切换一样…...