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

OpenCV calcHist()函数及其用法详解

        OpenCV calcHist()函数原型共有三个,如下:

        该函数计算一个或多个数组的直方图。用于递增直方图箱的元组的元素取自同一位置的相应输入数组。

函数参数:

       images  源(图像)数组。它们都应具有相同的深度、CV_8U、CV_16U 或 CV_32F 以及相同的大小。每个都可以有任意数量的通道。

       nimages 源图像数量

       channels 用于计算直方图的维度通道列表。第一个数组通道从 0 到 images[0].channels()-1 计数,第二个数组通道从 images[0].channels() 到 images[0].channels() + images[1] 计数。通道()-1,等等。

        mask 可选掩模。如果矩阵不为空,则它必须是与 images[i] 大小相同的 8 位数组。非零掩码元素标记直方图中计数的数组元素。

       hist  输出直方图,它是密集或稀疏的 dims 维数组。

       dims  直方图维数,必须为正且不大于 CV_MAX_DIMS(在当前 OpenCV 版本中等于 32)。

       histSize 每个维度的直方图数组大小

       ranges 每个维度中直方图 bin 边界的 dims 数组的数组。当直方图是均匀的 (uniform =true) 时,对于每个维度 i,足以指定第 0 个直方图 bin 的下限(包含)边界 L0 和上限(不包含)边界 UhistSize[i]−1最后一个直方图 bin histSize[i]-1 。也就是说,在均匀直方图的情况下,每个 range[i] 都是一个包含 2 个元素的数组。当直方图不均匀时(uniform=false),则每个range[i]包含histSize[i]+1个元素:L0,U0=L1,U1=L2,...,UhistSize[i]−2=LhistSize [i]−1,UhistSize[i]−1 。不在 L0 和 UhistSize[i]−1 之间的数组元素不计入直方图中。

    uniform 指示直方图是否均匀的标志

       accumulate 累积标志。如果设置了,直方图在分配时不会被清除。此功能使您能够从多组数组计算单个直方图,或及时更新直方图。

        这是一个重载成员函数,为方便起见而提供。它与上述函数的不同之处仅在于它接受的参数。 该重载函数使用 SparseMat 进行输出。

        这是一个重载成员函数,为方便起见而提供。它与上述函数的不同之处仅在于它接受的参数。 该重再函数仅支持统一直方图。 range 参数可以是空向量,也可以是 histSize.size()*2 元素(histSize.size() 元素对)的展平向量。每对的第一个和第二个元素指定下边界和上边界。

用法示例

新建一个控制台应用程序Project。在源程序中加入如下代码:

#include <iostream>
#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("1.jpeg");
    if (src.empty())
    {
        cout << "Cann't open the image!" << endl;
        return -1;
    }
    imshow("Src", src);

    vector<Mat> bgr;
    split(src, bgr);
    int numbins = 256;
    float range[] = { 0, 256 };
    const float* histRange = { range };
    Mat bhist, ghist, rhist;

    calcHist(&bgr[0], 1, 0, Mat(), bhist, 1, &numbins, &histRange);
    calcHist(&bgr[1], 1, 0, Mat(), ghist, 1, &numbins, &histRange);
    calcHist(&bgr[2], 1, 0, Mat(), rhist, 1, &numbins, &histRange);
    int width = 512;
    int height = 300;
    Mat histImage(height, width, CV_8UC3, Scalar(127, 127, 127));

    normalize(bhist, bhist, 0, height, NORM_MINMAX);
    normalize(ghist, ghist, 0, height, NORM_MINMAX);
    normalize(rhist, rhist, 0, height, NORM_MINMAX);

    int binStep = cvRound((float)width / numbins);

    for (int i = 1; i < numbins; i++)
    {
        line(histImage, Point(binStep * (i - 1), height - cvRound(bhist.at<float>(i - 1))), Point(binStep * i, height - cvRound(bhist.at<float>(i))), Scalar(255, 0, 0));
        line(histImage, Point(binStep * (i - 1), height - cvRound(ghist.at<float>(i - 1))), Point(binStep * i, height - cvRound(ghist.at<float>(i))), Scalar(0, 255, 0));
        line(histImage, Point(binStep * (i - 1), height - cvRound(rhist.at<float>(i - 1))), Point(binStep * i, height - cvRound(rhist.at<float>(i))), Scalar(0, 0, 255));
    }
    imshow("HistImage", histImage);

    waitKey(0);
}

试运行,结果如下:


http://www.kler.cn/a/313702.html

相关文章:

  • SpringSecurity源码中核心类
  • Java学习--网络编程
  • 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
  • AI生活之我用AI处理Excel表格
  • 详解kafka消息发送重试机制的案例
  • 如何使用IDEA创建Maven/SSM工程?
  • 国标视频流媒体服务GB28181和Ehome等多协议接入的Liveweb方案详解
  • vmware + ubuntu + 初始配置(超级用户权限、vim安装、ssh登陆、共享文件夹、git)
  • 实变函数精解【23】
  • java集合(1)
  • 在 CentOS 中安装 MySQL(无坑版)
  • No operations allowed after statement closed
  • WPF TextBox 控件文本水平垂直居中
  • 写一个自动化记录鼠标/键盘的动作,然后可以重复执行的python程序
  • 华为云分布式缓存服务DCS 8月新特性发布
  • Android-UI设计
  • js 将二进制文件流,下载为excel文件
  • 2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析|数学建模完整过程+详细思路+代码全解析
  • 【Linux取经之路】软件包管理器yum编辑器vim及其配置
  • 进程间关系与进程守护
  • 浅析OceanBase数据库的向量化执行引擎
  • CSS中如何实现鼠标悬停效果?
  • 数据结构:(牛客OR36)链表的回文结构
  • (笔记自用)LeetCode:快乐数
  • mysql时间戳格式化yyyy-mm-dd
  • kubeadm方式安装k8s+基础命令的使用