c++视觉处理----绘制直方图,H—S直方图,二维H—S直方图,RGB三色直方图

直方图:cv::calcHist()

cv::calcHist() 是 OpenCV 中用于计算直方图的函数。直方图是一种用于可视化图像亮度或颜色分布的工具。这函数通常应用于灰度图像或彩色图像的各个通道。以下是 cv::calcHist() 函数的基本语法和参数:

void cv::calcHist(const cv::Mat* images, // 输入图像的数组int nimages,           // 输入图像的数量const int* channels,   // 通道索引数组(可以为空)const cv::InputArray& mask, // 掩模图像(可以为空)cv::OutputArray& hist,      // 输出的直方图int dims,                 // 直方图的维数const int* histSize,      // 直方图的尺寸数组const float* ranges[],    // 直方图范围数组bool uniform = true,      // 直方图是否均匀分布bool accumulate = false   // 是否累积直方图
);

以下是参数的说明:

  • images:输入图像的数组,可以是一个或多个图像。
  • nimages:输入图像的数量,通常为1。
  • channels:通道索引数组,指定要计算直方图的通道。对于灰度图像,通常为0。对于彩色图像,通道索引可以是{0, 1, 2},分别代表蓝色、绿色和红色通道。
  • mask:可选的掩模图像,用于限制计算直方图的区域。可以为空。
  • hist:输出的直方图。
  • dims:直方图的维数。通常为1。
  • histSize:直方图的尺寸数组,表示直方图的柱数。
  • ranges:直方图范围数组,指定直方图的范围。通常为{0, 256},表示像素值的范围。
  • uniform:指定是否将直方图均匀分布,如果为true,每个直方柱的宽度相同。
  • accumulate:指定是否累积直方图,如果为true,直方图将被累积。

cv::calcHist() 函数用于计算直方图后,你可以进一步分析或可视化直方图数据。这对于图像处理、分析和计算机视觉任务非常有用。

以下是一个更完整的 cv::calcHist() 函数的示例,它将计算一幅图像的直方图并绘制出来。这个示例假定你已经读取了一幅图像,并且使用灰度图像计算直方图:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg");if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 将图像转换为灰度图像cv::Mat gray_image;cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);// 定义直方图的参数int histSize = 256; // 直方图中的条柱数量float range[] = {0, 256}; // 像素值范围const float* histRange = {range};// 计算直方图cv::Mat hist;cv::calcHist(&gray_image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);// 创建一个空的直方图图像int hist_w = 512;int hist_h = 400;cv::Mat hist_image(hist_h, hist_w, CV_8UC3, cv::Scalar(0, 0, 0));// 归一化直方图cv::normalize(hist, hist, 0, hist_image.rows, cv::NORM_MINMAX, -1, cv::Mat());// 绘制直方图for (int i = 1; i < histSize; i++) {cv::line(hist_image, cv::Point(i - 1, hist_h - cvRound(hist.at<float>(i - 1))),cv::Point(i, hist_h - cvRound(hist.at<float>(i))),cv::Scalar(255, 255, 255), 2, 8, 0);}// 显示原始图像和直方图cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);cv::imshow("Original Image", gray_image);cv::namedWindow("Histogram", cv::WINDOW_AUTOSIZE);cv::imshow("Histogram", hist_image);cv::waitKey(0);return 0;
}

这个示例将图像转换为灰度图像,计算其直方图,然后绘制直方图并显示原始图像以及对应的直方图。希望这个示例可以帮助你理解如何使用 cv::calcHist() 函数来计算和可视化图像的直方图。
在这里插入图片描述

绘制H—S直方图

#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("1.jpg");if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 将图像转换为HSV颜色空间cv::Mat hsv_image;cv::cvtColor(image, hsv_image, cv::COLOR_BGR2HSV);// 分割H和S通道std::vector<cv::Mat> channels;cv::split(hsv_image, channels);// 定义直方图的参数int histSize = 256; // 直方图中的条柱数量float hRange[] = { 0, 256 }; // 色相通道的像素值范围const float* hHistRange = { hRange };float sRange[] = { 0, 256 }; // 饱和度通道的像素值范围const float* sHistRange = { sRange };// 计算H和S通道的直方图cv::Mat h_hist, s_hist;cv::calcHist(&channels[0], 1, 0, cv::Mat(), h_hist, 1, &histSize, &hHistRange);cv::calcHist(&channels[1], 1, 0, cv::Mat(), s_hist, 1, &histSize, &sHistRange);// 归一化直方图cv::normalize(h_hist, h_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());cv::normalize(s_hist, s_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());// 创建一个直方图图像int hist_w = 512;int hist_h = 400;cv::Mat hist_image(hist_h, hist_w, CV_8UC3, cv::Scalar(0, 0, 0));// 绘制H通道直方图for (int i = 1; i < histSize; i++) {cv::line(hist_image, cv::Point(i - 1, hist_h - cvRound(h_hist.at<float>(i - 1))),cv::Point(i, hist_h - cvRound(h_hist.at<float>(i))),cv::Scalar(0, 0, 255), 2, 8, 0);}// 绘制S通道直方图for (int i = 1; i < histSize; i++) {cv::line(hist_image, cv::Point(i - 1, hist_h - cvRound(s_hist.at<float>(i - 1))),cv::Point(i, hist_h - cvRound(s_hist.at<float>(i))),cv::Scalar(0, 255, 0), 2, 8, 0);}// 显示图像和H-S直方图cv::imshow("mage", image);cv::imshow("H-S Histogram", hist_image);cv::waitKey(0);return 0;
}

在这里插入图片描述

绘制二维H—S直方图

#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("1.jpg");if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 将图像转换为HSV颜色空间cv::Mat hsv_image;cv::cvtColor(image, hsv_image, cv::COLOR_BGR2HSV);// 定义直方图的参数int h_bins = 30; // 色相通道的柱数int s_bins = 32; // 饱和度通道的柱数int histSize[] = {h_bins, s_bins};float h_range[] = {0, 180}; // 色相通道的范围float s_range[] = {0, 256}; // 饱和度通道的范围const float* ranges[] = {h_range, s_range};// 计算H-S直方图cv::MatND hist;int channels[] = {0, 1}; // 色相和饱和度通道cv::calcHist(&hsv_image, 1, channels, cv::Mat(), hist, 2, histSize, ranges, true, false);// 归一化直方图cv::normalize(hist, hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());// 创建一个H-S直方图图像int hist_w = 512;int hist_h = 512;cv::Mat hist_image(hist_h, hist_w, CV_8UC3, cv::Scalar(0, 0, 0));// 绘制直方图for (int h = 0; h < h_bins; h++) {for (int s = 0; s < s_bins; s++) {float bin_val = hist.at<float>(h, s);int intensity = cvRound(bin_val * 255);cv::rectangle(hist_image, cv::Point(h * (hist_w / h_bins), s * (hist_h / s_bins)),cv::Point((h + 1) * (hist_w / h_bins), (s + 1) * (hist_h / s_bins)),cv::Scalar(intensity, intensity, intensity), -1);}}// 显示原始图像和H-S直方图cv::imshow("Image", image);cv::imshow("H-S Histogram", hist_image);cv::waitKey(0);return 0;
}

在这里插入图片描述

绘制RGB三色直方图

#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("1.jpg");if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 定义直方图的参数int histSize = 256; // 直方图中的条柱数量float range[] = { 0, 256 }; // 像素值范围const float* histRange = { range };// 分割RGB通道std::vector<cv::Mat> channels;cv::split(image, channels);// 计算红色通道的直方图cv::Mat red_hist;cv::calcHist(&channels[2], 1, 0, cv::Mat(), red_hist, 1, &histSize, &histRange);// 计算绿色通道的直方图cv::Mat green_hist;cv::calcHist(&channels[1], 1, 0, cv::Mat(), green_hist, 1, &histSize, &histRange);// 计算蓝色通道的直方图cv::Mat blue_hist;cv::calcHist(&channels[0], 1, 0, cv::Mat(), blue_hist, 1, &histSize, &histRange);// 归一化直方图cv::normalize(red_hist, red_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());cv::normalize(green_hist, green_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());cv::normalize(blue_hist, blue_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());// 创建一个直方图图像int hist_w = 512;int hist_h = 400;cv::Mat hist_image(hist_h, hist_w, CV_8UC3, cv::Scalar(0, 0, 0));// 绘制红色通道直方图for (int i = 1; i < histSize; i++) {cv::line(hist_image, cv::Point(i - 1, hist_h - cvRound(red_hist.at<float>(i - 1))),cv::Point(i, hist_h - cvRound(red_hist.at<float>(i))),cv::Scalar(0, 0, 255), 2, 8, 0);}// 绘制绿色通道直方图for (int i = 1; i < histSize; i++) {cv::line(hist_image, cv::Point(i - 1, hist_h - cvRound(green_hist.at<float>(i - 1))),cv::Point(i, hist_h - cvRound(green_hist.at<float>(i))),cv::Scalar(0, 255, 0), 2, 8, 0);}// 绘制蓝色通道直方图for (int i = 1; i < histSize; i++) {cv::line(hist_image, cv::Point(i - 1, hist_h - cvRound(blue_hist.at<float>(i - 1))),cv::Point(i, hist_h - cvRound(blue_hist.at<float>(i))),cv::Scalar(255, 0, 0), 2, 8, 0);}// 显示原始图像和RGB三色直方图cv::imshow("mage", image);cv::imshow("RGB Histogram", hist_image);cv::waitKey(0);return 0;
}

在这里插入图片描述

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

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

相关文章

Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮

文章目录 第一部分&#xff1a;边缘计算和Docker容器边缘计算的定义Docker容器的崭露头角1. 可移植性2. 资源隔离3. 自动化部署和伸缩 第二部分&#xff1a;应用案例1. 边缘分析2. 工业自动化3. 远程办公 第三部分&#xff1a;挑战和解决方案1. 网络延迟2. 安全性3. 管理和部署…

树莓派部署.net core控制台程序

1、在自己的电脑上使用VS写一个Net6.0的控制台程序&#xff0c;我假设我就写个Helloworld。 发布项目 使用mobaxterm上传程序 就传三个文件就行 回到在mobaxterm中&#xff0c;进入目录输入&#xff1a;cd consolepublish,运行程序&#xff1a; dotnet ConsoleApp1.dll 输出h…

入行CSGO游戏搬砖项目前,这些问题一定要了解

最近咨询的人也不少&#xff0c;针对大家平时问到的问题&#xff0c;在这里做一个统一汇总和解答。 1、什么是国外steam游戏装备汇率差项目&#xff1f; 通俗易懂的理解就是&#xff0c;从国外steam游戏平台购买装备&#xff0c;再挂到国内网易buff平台上进行售卖。充值汇率差…

MyCat管理及监控

MyCat原理 在 MyCat 中&#xff0c;当执行一条 SQL 语句时&#xff0c; MyCat 需要进行 SQL 解析、分片分析、路由分析、读写分离分析等操作&#xff0c;最终经过一系列的分析决定将当前的SQL 语句到底路由到那几个 ( 或哪一个 ) 节点数据库&#xff0c;数据库将数据执行完毕后…

WSL+vscode配置miniob环境

1.配置WSL Windows Subsystem for Linux入门&#xff1a;安装配置图形界面中文环境vscode wu-kan 2.获取源码 找个位置Git Bash然后拉取代码 git clone https://github.com/oceanbase/miniob.git 3.安装相关依赖 https://gitee.com/liangcha-xyy/source/blob/master/how…

软件设计之工厂方法模式

工厂方法模式指定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 结构关系如下&#xff1a; 可以看到&#xff0c;客户端创建了两个接口&#xff0c;一个AbstractFactory&#xff0c;负责创建产品&#xff0c;一个Product&#xff0c;负责产品的实现。ConcreteF…

如何生成SSH服务器的ed25519公钥SHA256指纹

最近搭建ubuntu服务器&#xff0c;远程登录让确认指纹&#xff0c;研究一番搞懂了&#xff0c;记录一下。 1、putty 第一次登录服务器&#xff0c;出现提示&#xff1a; 让确认服务器指纹是否正确。 其中&#xff1a;箭头指向的 ed25519 :是一种非对称加密的签名方法&#xf…

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f95e;网卡设备接入输入子系统&#x1f354;测试 &#x1f95e;业务子系统&#…

PostGIS导入shp文件报错:dbf file (.dbf) can not be opened.

一、报错 刚开始以为是SRID输入错误&#xff0c;反复尝试SRID的输入&#xff0c;还是报错&#xff01; 后来看到了这篇博客&#xff0c;解决了&#xff01;https://blog.csdn.net/Fama_Q/article/details/117381378 二、导致报错的原因 导入的shp文件路径太深&#xff0c;换…

Jackson+Feign反序列化问题排查

概述 本文记录在使用Spring Cloud微服务开发时遇到的一个反序列化问题&#xff0c;RPC/HTTP框架使用的是Feign&#xff0c;JSON序列化反序列化工具是Jackson。 问题 测试环境的ELK告警日志如下&#xff1a; - [43f42bf7] 500 Server Error for HTTP POST "/api/open/d…

洗地机哪款最好用?口碑最好的家用洗地机推荐

洗地机方便快捷的清洁方式&#xff0c;如今融入到我们的日常生活需求中来了&#xff0c;然而&#xff0c;在市面上琳琅满目的洗地机品牌中&#xff0c;究竟哪款洗地机比较好用呢&#xff1f;今天&#xff0c;笔者将向大家推荐四款口碑最好的家用洗地机&#xff0c;让你在挑选时…

Java实现防重复提交,使用自定义注解的方式

目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证 6.总结 1.背景 在进行添加操作时&#xff0c;防止恶意点击&#xff0c;后端进行请求接口的防重复提交 2.思路 通过拦截器搭配自定义注解的方式进行实现&#xff0c;拦截器拦截请求&#xff0c;使…

JS加密/解密之webpack打包代码逆向

Webpack 是一个强大的打包工具&#xff0c;能够将多个文件打包成一个或多个最终的文件。然而&#xff0c;将已经经过打包的代码还原回原始源代码并不是一件直接的事情&#xff0c;因为 webpack 打包的过程通常会对代码进行压缩、混淆和优化&#xff0c;丢失了部分变量名和代码结…

Gralloc ION DMABUF in Camera Display

目录 Background knowledge Introduction ia pa va and memory addressing Memory Addressing Page Frame Management Memory area management DMA IOVA and IOMMU Introduce DMABUF What is DMABUF DMABUF 关键概念 DMABUF APIS –The Exporter DMABUF APIS –The…

Flutter - 波浪动画和lottie动画的使用

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 波浪动画三方库wave lottie动画 Lottie 是 Airbnb 开发的一款能够为原生应用添加动画效果的开源工具。具有丰富的动画效果和交互功能。 # 波浪动画 https://pub-web…

高并发下的服务容错

在微服务架构中&#xff0c;我们将业务拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff0c;但是由于网络 原因或者自身的原因&#xff0c;服务并不能保证服务的100%可用&#xff0c;如果单个服务出现问题&#xff0c;调用这个服务就会 出现网络延迟&#xf…

线性回归模型进行特征重要性分析

目的 线性回归是很常用的模型&#xff1b;在局部可解释性上也经常用到。 数据归一化 归一化通常是为了确保不同特征之间的数值范围差异不会对线性模型的训练产生过大的影响。在某些情况下&#xff0c;特征归一化可以提高模型的性能&#xff0c;但并不是所有情况下都需要进行归一…

PG学习笔记(PostgreSQL)

PG学习笔记&#xff08;PostgreSQL&#xff09; 1、PG特点 项目极限值最大单个数据库大小不限最大最大数据单表大小32 TB单条记录最大1.6TB单字段最大允许1GB单表允许最大记录数不限单表最大字段数250~1600&#xff08;取决于字段类型&#xff09;单表最大索引数不限 2、PG安…

go-gin-api 本地部署调试问题总结

1.告警邮箱设置 保存后会自动将配置信息保存在fat_configs.toml 文件中&#xff1b; 可能出现问题&#xff1a;报错 550和 anth 问题&#xff0c;说明你的邮箱配置有问题&#xff08;密码或者授权码&#xff09;&#xff1b; 2.生成数据表curd 执行结果报错 exec: “gormge…

Win10 系统中用户环境变量和系统环境变量是什么作用和区别?

环境&#xff1a; Win10专业版 问题描述&#xff1a; Win10 系统中用户环境变量和系统环境变量是什么作用和区别&#xff1f; 解答&#xff1a; 在Windows 10系统中&#xff0c;用户环境变量和系统环境变量是两个不同的环境变量&#xff0c;它们具有不同的作用和区别 1.用…