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

OpenCV 图像直方图

一、知识点
1、图像直方图
  (1)、图像直方图(Histogram)是图像像素值的统计报告图。
  (2)、由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般横轴表示数据类型,纵轴表示分布情况。
  (3)、计算代价较小,具有图像平移、旋转、缩放不变性等众多优点。
  (4)、广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类、反向投影跟踪。
  (5)、常见的分为灰度直方图、颜色直方图。
  (6)、例如灰度直方图,横坐标是0到255,纵坐标表示灰度值在像素点出现的次数。


  
2、Bins
  (1)、bin,英文翻译为箱子,我理解为直方图的一个条纹、柱子。
  (2)、Bins指直方图柱子的个数,即把数据划分为连续区间的个数,用于统计每个区间内数据出现的频次。
  (3)、对于像素值在0-255之间的,可以有256个bin,可以有16、32、48、128等,256除以bin应该是整数倍。
  
3、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 );

  (1)、用于统计图像中每个灰度值的像素个数,即计算图像直方图。
  (2)、参数说明:
      images: 源图像数组。 它们应具有相同的深度(CV_8U、CV_16U、CV_32F)、相同的尺寸,但它们每一个可以有任意数量的通道。
      nimages: 源图像的数量。
      channels: 需要统计的通道索引数组。第一个图像的通道索引为0到images[0].channels() - 1,第二个图像通道索引为images[0].channels()到images[0].channels() + images[1].channels() - 1,依次类推。
      mask: 可选掩码。 若不为空,则它必须和源图像大小相同且像素深度为8位。 非零元素对应的图像元素才计算直方图。
      hist: 输出的统计直方图结果,它是一个dims维度的数组。
      dims: 需要计算直方图的维度,必须是整数,不能大于CV_MAX_DIMS。
      histSize: 每个维度的直方图bins数组。
      ranges: 每个图像通道中灰度值的取值范围。
      uniform: 直方图是否均匀的标志,默认为均匀。
      accumulate: 是否累计统计直方图的标志。 该参数主要用于统计多个图像整体的直方图。
  (3)、因此函数参数较多且复杂,建议将彩色图像先分离通道再计算直方图。
  
4、int cvRound(double value)
  (1)、对浮点数进行四舍五入。


二、示例代码

#include <iostream>
#include <opencv2/opencv.hpp>int main()
{//1.读取源彩色图像cv::Mat src = cv::imread("../images/img08.png");if (src.empty()){std::cout << "load src image error..." << std::endl;return -1;}//2.三通道分离std::vector<cv::Mat> bgr_plane;cv::split(src, bgr_plane);//3.定义参数变量const int bins[1] = { 256 };float hrange[2] = { 0, 255 };const float* ranges[1] = { hrange };cv::Mat b_hist;cv::Mat g_hist;cv::Mat r_hist;//4.计算Blue、Green、Red通道的直方图cv::calcHist(&bgr_plane[0], 1, nullptr, cv::Mat(), b_hist, 1, bins, ranges);cv::calcHist(&bgr_plane[1], 1, nullptr, cv::Mat(), g_hist, 1, bins, ranges);cv::calcHist(&bgr_plane[2], 1, nullptr, cv::Mat(), r_hist, 1, bins, ranges);//5.创建画布int hist_w = 512;int hist_h = 400;int bin_w = cvRound((double)hist_w / bins[0]);cv::Mat histImage = cv::Mat::zeros(hist_h, hist_w, CV_8UC3);//6.归一化直方图数据cv::normalize(b_hist, b_hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());cv::normalize(g_hist, g_hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());cv::normalize(r_hist, r_hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());//7.绘制直方图曲线for (int i = 1; i < bins[0]; i++){cv::line(histImage, cv::Point(bin_w * (i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),cv::Point(bin_w * i, hist_h - cvRound(b_hist.at<float>(i))), cv::Scalar(255, 0, 0), 2, 8, 0);cv::line(histImage, cv::Point(bin_w * (i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),cv::Point(bin_w * i, hist_h - cvRound(g_hist.at<float>(i))), cv::Scalar(0, 255, 0), 2, 8, 0);cv::line(histImage, cv::Point(bin_w * (i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),cv::Point(bin_w * i, hist_h - cvRound(r_hist.at<float>(i))), cv::Scalar(0, 0, 255), 2, 8, 0);}//8.显示直方图cv::namedWindow("Hisogram Demo", cv::WINDOW_AUTOSIZE);cv::imshow("Hisogram Demo", histImage);cv::waitKey(0);return 0;
}

输出结果:

http://www.lqws.cn/news/442063.html

相关文章:

  • 中泰制造企业组网新方案:中-泰企业国际组网专线破解泰国工厂访问国内 OA/ERP 卡顿难题
  • 【世纪龙科技】智能网联汽车自动驾驶虚拟实训软件
  • 【鸿蒙HarmonyOS Next App实战开发】​​​​ArkUI纯色图生成器
  • Linux中Ansible常用模块
  • 【油藏地球物理正演软件ColchisFM】为什么经常用90度相移处理代替反演使用
  • PostgreSQL的扩展dict_int
  • 【AI作画】第2章comfy ui的一般输入节点,文本框的类型和输入形式
  • Postman 的 Jenkins 管理 - 自动构建
  • 通俗解释:编码器与解码器
  • 系统性能优化-3 内存池
  • uni-app项目实战笔记15--使用uni-popup实现弹出层和uni-rate实现评分效果
  • 【python】多次重试调用ai大模型
  • FPGA基础 -- Verilog 命名事件
  • Cursor Pro取消500次请求限制,无限用的体验更好了吗?
  • 【vim】通过vim编辑器打开、修改、退出配置文件
  • 新生活的开启:从 Trae AI 离开后的三个月
  • 【研发工具】.Net创建多项目模板(Visual Studio)
  • 轻量化社交管理方案:Skout与云手机的巧妙搭配
  • 暑期前端训练day1
  • SpringBoot扩展——应用Web Service!
  • 【 感知集群】大规模分布式基础设施的AI赋能蓝图
  • 深度学习之目标检测YOLO简介和YOLO v1模型算法流程详解说明(超详细理论篇)
  • Redis
  • 动态规划算法思路详解
  • 【高录用】2025年数字金融,大数据与商业管理国际会议 (DFBBM 2025)
  • 蚀刻效果解释
  • LeetCode | 一文弄懂树:定义、原理、应用与题型分类
  • SpringBoot新闻项目学习day3--后台权限的增删改查以及权限管理分配
  • 算法导论第十九章 并行算法:解锁计算新维度
  • Oracle 数据库性能优化之重做日志(redo)