探索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中直方图的神奇之处:应用与实现
文章目录 导言:直方图概述:函数原型参数说明:代码示例 应用场景:结语: 导言: 直方图是数字图像处理中一个强大而重要的工具,它通过可视化数据的分布情况,帮助我们更好地理解图像的特…...
MapReduce编程——矩阵乘法(Python版本)
数据格式 对于矩阵元素 A i j A_{ij} Aij,将其处理为 < 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>的四元组格式,例如矩阵[[2, 1, 3, 4], [10, -8, 7, 2], [9, 1, 6, -2]]可被转化…...
nature日报:为什么印度德里现在的空气污染如此严重?
为什么印度德里现在的空气污染如此严重? 后季风季节为印度大城市的空气污染积累创造了理想的条件。 本文整理扩展自2023年11月10日nature杂志的NEWS EXPLAINER——Why is Delhi’s air pollution so bad right now? (nature.com) Highlights 季风期间࿰…...
ChatGPT、GPT-4 Turbo接口调用
接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion 请求方式 post 请求参数 model可选值: “gpt-3.5-turbo-1106”、 “gpt-3.5-turbo-16k” 、 “gpt-4”、“gpt-4-1106-preview”。 默认值为: “gpt-3.5-turbo-1106” to…...
IDEA中常用的调试快捷键
启动调试 对于Maven项目:Shift F9 对于普通项目:Shift F10 进入调试模式 Shift F9 逐行执行 逐行跳过:F8 逐行步入:F7 逐行步出:Shift F8 继续执行 F9 停止调试 Ctrl F2 设置断点 在代码行号左侧双击&#x…...
需要设计易清洗的口琴
我发现口琴很容易被异物影响。然后就需要清洗。正好手头有一个合适的螺丝刀,还比较方便。 反之一想,应该设计一种口琴,可以方便的拆开,用水清洗。晾干后就能组装。设计上当然会面临一些问题,比如音簧容易变音等。这个可…...
贝锐蒲公英智慧运维方案:实现远程网络监控、管理、维护工业设备
为了提升运维效率,能够及时发现和响应设备的故障、异常和潜在问题。 越来越多的企业都在搭建“集中式”的远程智慧运维体系,以提高运维效率和降低成本。 但是,受限于网络,将不同地域的资源和信息进行整合,实现统一管理…...
Intel oneAPI笔记(4)--jupyter官方文档(Unified Shared Memory)学习笔记
前言 本文是对jupyterlab中oneAPI_Essentials/03_Unified_Shared_Memory文档的学习记录,主要包含对统一共享内存的讲解 USM概述 USM (Unified Shared Memory)是SYCL中基于指针的内存管理。对于使用malloc或new来分配数据的C和C程序员来说应该很熟悉。当将现有的C…...
dRep-基因组质控、去冗余及物种界定
文章目录 Install依赖关系 常用命令常见问题pplacer线程超过30报错当比较基因组很多(>4096)有了Bdv.csv文件后无需输入基因组list 超多基因组为什么需要界定种?dRep重要概念次级ANI的选择Minimum alignment coverage3. 选择有代表性的基因…...
截图贴图软件推荐 - 附下载链接 | Snipaste | Steuna
截图贴图软件推荐 - 附下载链接 | Snipaste | Steuna 前言下载链接Snipaste(推荐)Steuna 前言 Win系统下截图软件多种多样,但贴图软件少之又少,本文介绍2个带有贴图功能的截图软件,分别是Snipaste和Steuna。可将截图固…...
python调用chrome实现网页自动操作
一. 内容简介 python调用chrome实现网页自动操作。 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接: 三.主要流程 3.1 下载驱动和插件 调用谷歌浏览器,需要下载浏览器驱动(https://registry.npmmirror.co…...
FFMPEG库实现mp4/flv文件(H264+AAC)的封装与分离
ffmepeg 4.4(亲测可用) 一、使用FFMPEG库封装264视频和acc音频数据到 mp4/flv 文件中 封装流程 1.使用avformat_open_input分别打开视频和音频文件,初始化其AVFormatContext,使用avformat_find_stream_info获取编码器基本信息 2.使…...
《红蓝攻防对抗实战》九.内网穿透之利用GRE协议进行隧道穿透
前文推荐: 《红蓝攻防对抗实战》一. 隧道穿透技术详解 《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网 《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网 《红蓝攻防对抗实战》四.内网探测协议出网之ICMP协议探测出网 《红蓝…...
大数据毕业设计选题推荐-智慧消防大数据平台-Hadoop-Spark-Hive
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
LeetCode 面试题 16.20. T9键盘
文章目录 一、题目二、C# 题解 一、题目 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射…...
systemctl enable docker.service报错“Failed to execute operation: Bad message“
将docker加入到开机自启,报错: 解决: 重新粘贴复制: [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target…...
向量的范数、矩阵的范数
向量的范数 p-范数 常用的0-范数、1-范数、2-范数、无穷-范数其实都是p-范数的特殊情形。 0-范数 当p0时,表示0-范数。它比较特殊,本质是一种计数,表示向量中非0元素的个数。 1-范数(也称L1范数) 当p1时ÿ…...
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;…...
前端缓存机制——强缓存、弱缓存、启发式缓存
强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存: 浏览器发起请求,查询浏览器的本地缓存,如果找到资源,则直接在浏览器中使用该资源。若是未找到,或者资源已过期,则浏览器缓存返回未…...
对称密钥加密与非对称密钥加密:原理与应用
在信息安全领域,对称密钥加密和非对称密钥加密是两种重要的加密方法,它们各有特点,适用于不同的场景。本文将详细介绍这两种加密方法的原理,并通过实例说明其应用,同时阐述在报文传输过程中,何时使用对称密…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
