Opencv(C++)学习之cv::calcHist 任意bin数量进行直方图计算

news/2024/7/21 5:13:39 标签: opencv, c++, 图像处理

**背景:**当前网上常见的直方图使用方法都是默认使用256的范围,而对于使用特定范围的直方图方法讲的不够清楚。仔细研究后总结如下:

1、常见使用方法,直接对灰度图按256个Bin进行计算。

Mat mHistUn;
int channels[1] = { 0 };
{
    bool uniform = true;//使用标准方法-也就是每个bin长度为1
    int histSize[1] = { 256 };
    float range[2] = { 0, 255 };
    const float* ranges[] = { range }; // 指定单个bin的取值范围

    cv::calcHist(&src, 1, channels, cv::Mat(), mHistUn, 1, histSize, ranges, uniform);
}

2、使用128个Bin进行计算

Mat mHist;
int channels[1] = { 0 };
{
    bool uniform = false;
    int histSize[1] = { 128 };
    float range[129] = { 0 };
    for (size_t i = 0, j = 0; i < 129; i++, j += 2)
        range[i] = j;
    const float* ranges[] = { range }; // 指定单个bin的取值范围

    cv::calcHist(&src, 1, channels, cv::Mat(), mHist, 1, histSize, ranges, uniform);
}

在该方法中,channels为0 ,表示单通道。先将uniform 标志位置为false,表示单个bin不再使用默认的距离1。
再构建每个bin的取值范围ranges,这里bin的宽度按2进行配置 ,那么所有的bin就是[0,2],[2,4],[4,6]…[254,255],总共128个bin。
其中需要注意的是,128个bin,但ranges的大小是129.这和opencv对这块的数据处理相关。

3、观察效果

void showCvHist(Mat srchist, int histSize)
{
    int hist_w = 511;
    int hist_h = 400;
    int bin_w = cvRound((double)hist_w / histSize);
    Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0, 0, 0));
    Mat hist = srchist.clone();
    normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1, Mat());

    for (int i = 1; i < histSize; 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(255, 0, 0), 2, 8, 0);
    }
    imshow("tt", histImage);
    cv::waitKey(0);
}

使用该函数对结果进行显示
256方法:
256bin的直方图
128的方法
128bin的直方图

可以看到,直方图的趋势基本类似。我们再看下直方图统计的具体数据。可以看到,在128bin方法中,每个数据正好对应256方法中2个数据之和。说明bin宽度为2正好生效。
256bin与128bin的数据对比1
4、一点统计的疑问:数据的最尾端,[254,255]合并成[127]时,数据存在3000的差异,不知从何引入的。
有知道的朋友可以帮忙看下

256bin与128bin的数据对比2


http://www.niftyadmin.cn/n/5300122.html

相关文章

WPS/PPT插件-大珩助手免费功能更新-特殊字符

扩展特殊格式下特殊字符&#xff0c;增加200多个常用特殊字符&#xff0c;可直接点击插入。 PPT大珩助手 1.7.6 1、提供素材库功能&#xff0c;可实现一键保存素材&#xff0c;支持对选中的形状&#xff0c;支持一键替换素材&#xff0c;保留原素材的尺寸和位置&#xff0c;…

【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】

文章目录 一.【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】1.1 项目主题:豆瓣电影二.代码剖析2.1 项目效果展示2.2 服务端代码剖析2.3 数据分析2.4 数据评分三.寄语四.本案例完整源码下载一.【计算机设计大赛作品】豆瓣…

力扣_day1

两数之和 hash表的时间复杂度为什么是O(1)&#xff1f; hash表是基于数组链表的实现的。数组在内存中是一块连续的空间&#xff0c;只要知道查找数据的下标就可快速定位到数据的内存地址&#xff0c;即数组查找数据的时间复杂度为O(1)。 能用一次循环解决问题就用一次循环。…

Mnist手写体数字数据集介绍与在Pytorch中使用

1.介绍 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;数据集是一个广泛用于机器学习和计算机视觉研究的常用数据集之一。它由手写数字图像组成&#xff0c;包括0到9的数字&#xff0c;每张图像都是28x28像素的灰度图像&#xff0c;图…

关键词提取

nodejieba关键词提取库 本来想在 centos 上安装 nodejieba&#xff0c;奈何 Centos7 上面的 gcc 的动态库太老&#xff0c;一直没办法更新动态库。 在 nodejieba 的 issues 找了一圈&#xff0c;发现了用 rust 实现的 node jiba 扩展&#xff1a;node-rs/jieba&#xff1a;ht…

虚幻UE 材质-进阶边界混合之WAT世界对齐纹理

边界混合前篇&#xff1a;虚幻UE 材质-边界混合之PDO像素深度偏移量 上一篇主要讲材质相似或者不同的两个物体之间的边界混合 这一篇主要讲自建材质且相同的两个物体之间的边界混合 文章目录 一、世界对齐纹理二、世界对齐纹理实验1、制作材质 三、进一步优化 一、世界对齐纹理…

[概率论]四小时不挂猴博士

贝叶斯公式是什么 贝叶斯公式是概率论中的一个重要定理&#xff0c;用于计算在已知一些先验信息的情况下&#xff0c;更新对事件发生概率的估计。贝叶斯公式的表达式如下&#xff1a; P(A|B) P(B|A) * P(A) / P(B) 其中&#xff0c;P(A|B)表示在事件B发生的条件下事件A发生的概…

Halcon纹理分析texture_laws/trans_from_rgb

Halcon纹理分析 文章目录 Halcon纹理分析1. 纹理滤波器2. 织物折痕检测 纹理是图像表面的一种灰度变化。有的纹理很规则&#xff0c;会以局部小区域为单元重复出现&#xff0c;而有的纹理则呈现出随机性。对于规则的纹理&#xff0c;可以很容易地从中分辨出重复的区域&#xff…