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

Ubuntu系统VScode实现opencv(c++)图像二维直方图

在数字图像处理中,二维直方图是一种强大的工具,用于同时分析图像中两个通道的像素值分布。与一维直方图(通常用于单通道图像)不同,二维直方图能够捕捉两个通道之间的关系,从而提供更丰富的图像特征信息。这种分析在许多应用中具有重要意义,例如图像分割、目标检测、特征匹配以及图像增强等。

二维直方图的应用

  1. 图像分割:通过分析两个通道的联合分布,可以更准确地识别和分离图像中的不同区域。例如,在医学图像中,二维直方图可以帮助区分不同的组织类型。

  2. 目标检测:在复杂背景中,某些目标可能具有独特的颜色特征。二维直方图可以用于描述这些特征,并帮助定位目标。

  3. 特征匹配:在图像配准或拼接中,二维直方图可以作为特征描述符,用于匹配图像之间的相似区域。

  4. 图像增强:通过分析两个通道的联合分布,可以设计更有效的增强算法,改善图像的视觉效果。

 二维对应两个通道,应该有两个bins,分别对应两个通道的横坐标,以HSV格式的为例子,分为亮度与色域。

第一步是将输入的图片转到HSV格式:

cvtColor(image,image,COLOR_BGR2HSV);

定义所需要的参数:

 const int hbins = 30,sbins = 32;int hist_bins[] = {hbins,sbins};float h_ranges[] = {0,180};float s_ranges[] = {0,256};const float* ranges[] = {h_ranges,s_ranges};int hs_channel[]={0,1};

hbins是亮度的横坐标,sbins是色度的横坐标 ,h_ranges是亮度像素的范围,s_ranges是色度像素的最大最小范围,hs_channel是用于标明通道的,0就是亮度通道,1就是色度通道。

整体代码如下:

void Demo::calicHist_2D_Demo(Mat &image)
{cvtColor(image,image,COLOR_BGR2HSV);// imshow("HSV",image);const int hbins = 30,sbins = 32;int hist_bins[] = {hbins,sbins};float h_ranges[] = {0,180};float s_ranges[] = {0,256};const float* ranges[] = {h_ranges,s_ranges};int hs_channel[]={0,1};Mat hs_hist;calcHist(&image,1,hs_channel,Mat(),hs_hist,2,hist_bins,ranges);// ---------- 1. 归一化到 0~255 ----------normalize(hs_hist, hs_hist, 0, 255, NORM_MINMAX);// ---------- 2. 生成可显示的 8 位单通道图 ----------Mat histImg(sbins, hbins, CV_8UC1);for (int y = 0; y < sbins; ++y){uchar* row = histImg.ptr<uchar>(y);for (int x = 0; x < hbins; ++x){row[x] = saturate_cast<uchar>(hs_hist.at<float>(y, x));}}// ---------- 3. 伪彩色增强 ----------Mat colorMap;applyColorMap(histImg, colorMap, COLORMAP_JET);// ---------- 4. 放大显示 ----------resize(colorMap, colorMap, Size(hbins * 10, sbins * 10), 0, 0, INTER_NEAREST);// ---------- 5. 显示 ----------imshow("H-S 2D Histogram", colorMap);waitKey(0);
}

由于这是二维直方图,所以呈现的效果就是色素块的堆积,越亮就代表出现的最多。

 

http://www.xdnf.cn/news/17092.html

相关文章:

  • 补:《每日AI-人工智能-编程日报》--2025年7月28日
  • 软件设计 VS 软件需求:了解成功软件开发外包的关键差异
  • git操作命令和golang编译脚本
  • 补:《每日AI-人工智能-编程日报》--2025年7月27日
  • 移动端 WebView 视频无法播放怎么办 媒体控件错误排查与修复指南
  • 高精度实战:YOLOv11交叉口目标行为全透视——轨迹追踪×热力图×滞留分析(附完整代码)
  • Linux-Day01.初识Linux和基础指令
  • 基于FAISS和Ollama的法律智能对话系统开发实录-【大模型应用班-第5课 RAG技术与应用学习笔记】
  • Ubuntu 下编译 SQLCipher 4.8.0
  • CMake进阶: 使用FetchContent方法基于gTest的C++单元测试
  • sqli-labs靶场less29~less35
  • Ethereum:拥抱开源,OpenZeppelin 未来的两大基石 Relayers 与 Monitor
  • 互联网医院整体项目套表整理过程文档全流程分析
  • Linux 文件与目录属性管理总结
  • IPIDEA:全球领先的企业级代理 IP 服务商
  • Go语言 逃 逸 分 析
  • JVM(Java虚拟机)运行时数据区
  • 【测试】⾃动化测试概念篇
  • 服务器突然之间特别卡,什么原因?
  • 晨控CK-GW08S与汇川AC系列PLC配置Ethernet/IP通讯连接手册
  • 开疆智能ModbusTCP转Profient网关连接ER机器人配置案例
  • 第二十三天(APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围)
  • 红队信息收集工具oneforall子域名搜集爆破工具安装使用教程详细过程
  • Python-初学openCV——图像预处理(七)——模板匹配、霍夫变换
  • Nestjs框架: Node.js 多环境配置策略与 dotenv 与 config 库详解
  • Node.js高并发接口下的事件循环卡顿问题与异步解耦优化方案
  • open-webui pipelines报404, ‘Filter pipeline.exporter not found‘
  • MySQL 约束知识体系:八大约束类型详细讲解
  • stanford cs336 assignment1 Byte-Pair Encoding (BPE) Tokenizer
  • Onnx模型部署到Arm64进行推理