opencv 图像直方图详解

2023-10-29

理论基础

直方图
直方图是数值数据分布的精确图形表示。为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。
图像直方图
图像直方图统计的可以是对描述图像有用的任何特征,如灰度值,梯度等。
直方图是图像的一个统计特征,它具有旋转、缩放、平移不变性,被应用于灰度图像的阈值分割,对比度调整,颜色匹配等等。下面以灰度图像灰度直方图说明统计的原理:
在这里插入图片描述
考虑以上灰度值图像,我们如何统计这些数据呢?我们知道灰度值在0 - 255范围之间总共 256 个值,可以将我们的范围划分为子部分(称为bins),例如:
在这里插入图片描述
计算每个bini范围内像素的数量。得到下图(x轴表示bin,y轴表示每个箱子中的像素数)。
在这里插入图片描述
直方图重要概念:
dim:希望收集数据的参数数量。在上面例子中,dims = 1是因为我们只计算每个像素(在灰度图像中)的强度值。
bin:在上面例子的示例中,bins = 16
range:要测量的值的限制。在本例中:range = [0,255]

一、opencv 函数支持calcHist()

计算一组数组的直方图。函数原型,三个重载函数:

CV_EXPORTS 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 );

/** @overload

this variant uses %SparseMat for output
*/
CV_EXPORTS void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          SparseMat& hist, int dims,
                          const int* histSize, const float** ranges,
                          bool uniform = true, bool accumulate = false );

/** @overload */
CV_EXPORTS_W void calcHist( InputArrayOfArrays images,
                            const std::vector<int>& channels,
                            InputArray mask, OutputArray hist,
                            const std::vector<int>& histSize,
                            const std::vector<float>& ranges,
                            bool accumulate = false );

参数说明:
images:源数组。它们都应该具有相同的深度,CV_8U, CV_16U或CV_32F,以及相同的大小。它们中的每一个都可以有任意数量的通道。
nimages:源图像个数。
channels:要测量的通道。
mask:源数组上使用的掩码(0表示要忽略的像素)。如果没有定义,则不使用
hist:输出直方图数组。
dims:直方图维度,必须是正的,不大于CV_MAX_DIMS(在当前OpenCV版本中等于32)。
histSize:每个维度bind的数量
ranges:每个维度要测量的值的范围
uniform:表示直方图是否均匀的标志(见上)。
accumulate:积累标志。如果设置了,则分配直方图时,一开始不清除。该特性使您能够从多个数组集合中计算出一个直方图,或者及时更新直方图。

代码示例

    cv::Mat image = cv::imread("D:\\QtProject\\Opencv_Example\\Hist\\Hist.png", cv::IMREAD_GRAYSCALE);
    if (image.empty()) {
      cout << "Cannot load image" << endl;
      return;
    }
    imshow("image",image);
    const int bins[1] = { 256 };
    float hranges[2] = { 0,255 };
    const float* ranges[1] = { hranges };

    Mat hist;
    // 计算直方图
    calcHist(&image, 1, 0, Mat(), hist, 1, bins, ranges);

    // 显示直方图
    int hist_w = 500;
    int hist_h = 600;
    int bin_w = cvRound((double)hist_w / bins[0]);  //两个灰度级之间的距离
    Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3); //直方图画布
    // 归一化直方图数据
    normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和hist_h之间
    // 绘制直方图曲线
    for (int i = 1; i < bins[0]; i++) {
        line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
            Point(bin_w*(i), hist_h - cvRound(hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);
    }
    // 显示直方图
    namedWindow("Histogram", WINDOW_AUTOSIZE);
    imshow("Histogram", histImage);

运行效果:
原图:
在这里插入图片描述
直方图:
在这里插入图片描述
参考文章:https://docs.opencv.org/4.x/d8/dbc/tutorial_histogram_calculation.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 图像直方图详解 的相关文章

  • 带有 OpenCV 的增强现实 SDK [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用requirements.txt 在 Heroku python Web 应用程序中安装 Dlib?

    我构建了一个涉及机器学习的 Python Flask Web API 但在 Heroku 上部署它时遇到了很多挫折 问题是 我的应用程序依赖于 Dlib 一个库 我似乎找不到在我的 Heroku 服务器中安装的方法 我正在试图解决这个问题
  • 如何解决 Python 'Pyzbar' 库的导入错误?

    我刚刚开始熟悉 Pyzbar 库 但是当使用decode方法我得到一个错误 这是代码 import cv2 import numpy as np import pyzbar code image cv2 imread C Users Ace
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • opencv createsamples没有错误,但是没有找到样本

    我在用着this http coding robin de 2013 07 22 train your own opencv haar classifier html教程 我正在根据我的正面图像创建大量样本 我正在使用 Windows 这是
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 来自 OpenCV 的外部参数

    我正在使用 OpenCV 来校准立体相机对 我拍摄了各种校准照片 并且使用 cv2 calibrateCamera 对内在参数进行了令人满意的拟合 然而 目前尚不清楚如何获取外部参数 该函数仅返回cameraMatrix 尽管它很有用 但实
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • 我可以使用 openCV 比较两张不同图像上的两张脸吗?

    我对 openCV 很陌生 我看到它可以计算出脸部并返回一个矩形来指示脸部 我想知道 openCV 是否可以访问两张包含一张脸的图像 并且我希望 openCV 返回这两个人是否相同的可能性 Thanks OpenCV 不提供完整的人脸识别引
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us
  • 创建 OpenCV 的 mouseCallback 函数的基于类的实现时遇到问题

    正如标题所示 我在基于类的 C 结构中实现 OpenCV 的 mouseCallback 函数时遇到了一些麻烦 请允许我解释一下 我定义了一个名为 BriskMatching 的类 在其中创建了一个名为 mouseCallback 的成员函
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • 从包含带边框的表格的图像中提取表格结构

    我正在尝试提取下表中的单元格位置 应用自适应阈值处理后 我能够获得细胞位置周围的轮廓 并且 HoughLines 获得垂直和水平结构元素 这是我的代码 img cv2 imread os path join img path file im
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因

随机推荐

  • 上半年实现营收9.24亿元,创新奇智的AI成制造业福星?

    如今 AI大模型迈入了商业化落地的新阶段 并且已经有不少产品被不知不觉地应用到了生活各个方面 其中 作为AI领域的后起之秀 创新奇智也于近日发布了截至2023年6月30日止六个月的中期业绩报告 数据显示 创新奇智2023年上半年公司实现营收
  • 线代【向量组与线性空间】--猴博士爱讲课

    第五课 向量组与线性空间 1 4判断某向量是否可由某向量组线性表示 这些只有一行 列 的矩阵既可以称作为向量 判断的标准 若 a1 a2 am 的秩与 a1 a2 am b 的秩相等 则b可由a a2 am线性表示 2 4判断某个向量组是否
  • final关键字最全了解

    final关键字的使用 在Java中声明类 属性和方法时 可使用关键字final来修饰 1 final标记的类不能被继承 2 final标记的方法不能被子类复写 3 final标记的变量 成员变量或局部变量 即为常量 只能赋值一次 fina
  • 消息队列之Kafka 日志清理(六)

    Kafka是一个基于日志的流处理平台 一个topic可以有多个分区 partition 分区是复制的基本单元 在单节点上 一个分区的数据文件可以存储在多个磁盘目录中 配置项是 A comma separated list of direct
  • ps 命令

    NAME ps report a snapshot of the current processes SYNOPSIS ps aAcdefHjlmNVwy acefghLnrsSTuvxX C lt 指令名称 gt g lt 群组名称 gt
  • 使用Java实现文件的上传

    基于表单的文件上传 标签
  • ASPX如何调用外界程序

    调用外界程序 用到Process类 这个相当于在运行中输入命令 而不是在cmd中输入命令 aspx cs页 Start方法应该是静态方法 1 using System Diagnostics 2 3 Process Start cmd c
  • idea写的过滤器

    Servlet 概念 Server 服务 applet 小程序 是运行在服务器端 tomcat 的java程序 作用 接受客户端发送过来的请求并做出响应 重定向和转发 gt 客户端 注解 Filter 过滤器 概念 过滤器实际上就是对web
  • pv=nrt_PV=NRT中的R的单位是什么?

    展开全部 1 气体状态方程的常数 2 n是物质的量 R是常数 对任意理想气体而言 R是一定的 约为e68a8462616964757a686964616f313333656532308 31441 0 00026J mol K PV nRT
  • swarm原理与使用

    一 Swarm简介 在Docker的官方文档当中 我们可以看到在Docker 1 12及更高版本中 Swarm模式与Docker Engine集成 那么Dokcer Swarm到底是个什么 Docker Swarm是Docker官方的三剑客
  • 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略...

    昨天在爬取电影的时候生成的表单打开result html时 发现页面出现如下乱码 第一种方法 上网找了半天 网上的解决方案是这样的 1 Win R输入gpedit msc打开组策略编辑器 2 定位到计算机配置 rarr 管理模板 windo
  • 数据结构与算法分析——第3章考试题

    判断题 1 1 Run the following operations on a stack S Push S 1 Push S 2 Pop S Push S 3 Pop S Pop S The output sequence must
  • 小程序对接企业微信客服

    一 小程序后台管理 关联企业微信客服 注意 企业ID必须跟该小程序的企业主体一样 二 登录企业微信 选择客服 登录企业微信后台 应用管理 应用 微信客服 接入场景 在微信内其他场景接入 去接入 选择客服 复制客服链接 注意 如果需要后台对接
  • 【性能测试-03】 - 如何指定性能测试目标

    文章目录 引言 定制计划 衡量指标 TPS 响应时间 报错率 性能测试指标分析 1 以衡量系统处理能力为核心目标的性能测试 时间维度 服务维度 系统健壮性 专项能力 总结 引言 在测试执行过程当中 并不清楚现在测试到的结果到底能不能满足活动
  • (5)所有角色数据分析页面的构建-5

    所有角色数据分析页面 包括一个时间轴柱状图 六个散点图 六个柱状图 每个属性角色的生命值 防御力 攻击力的max与min的对比 绘图 from pyecharts charts import Timeline from find type
  • 其他题目---两个有序数组间相加和的TopK问题

    题目 给定两个有序数组arr1和arr2 再给定一个整数k 返回来自arr1和arr2的两个数相加和最大的前k个 两个数必须分别来自两个数组 要求时间复杂度O klogk 基本思路 使用大根堆结构 假设arr1的长度是M arr2的长度是N
  • IDEA远程debug java项目

    远程debug调试 服务端程序运行在一台远程服务器上 我们可以在本地服务端的代码 前提是本地的代码必须和远程服务器运行的代码一致 中设置断点 每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态 步骤 1 远程服务器上项目需以
  • 鱼c笔记——Python爬虫(五):访问网页的异常处理

    访问网页的异常处理 当我们的urlopen 方法无法处理一个响应的时候 就会引发URLError异常 通常在没有网络连接或者对方服务器压根不存在的时候 都会引发这个异常 同时URL会伴随一个reason的属性 用于包含一个由错误编码和错误信
  • c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)

    目录 4 6 继承 4 6 1 继承的基本语法 4 6 2 继承方式 4 6 3 继承中的对象模型 4 6 4 继承中构造和析构顺序 4 6 5 继承同名成员处理方式 4 6 6 继承同名静态成员处理方式 4 6 7 多继承语法 4 6 8
  • opencv 图像直方图详解

    文章目录 理论基础 一 opencv 函数支持calcHist 代码示例 理论基础 直方图 直方图是数值数据分布的精确图形表示 为了构建直方图 第一步是将值的范围分段 即将整个值的范围分成一系列间隔 然后计算每个间隔中有多少值 这些值通常被