直方图概述

简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度、方向、色彩或任何其他特征。它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量。

计算直方图:calcHist 函数

calcHist 函数用于计算一个或多个阵列的直方图。

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 accumul = false);

  • images,输入的数组(图像)或数组集(图像集),他们需为相同深度(CV_8U 或 CV_32F)和相同尺寸。
  • nimages,第一个参数中存放了多少张图象。
  • channels,图像索引,会按照索引顺序依次计算图像直方图(注意,第一张图片索引为 0,以此类推)。
  • mask,可选的掩膜操作,非零掩码元素用于标记待统计元素,需要与输入图像集有相同尺寸。
  • hist,输出的目标直方图,一个二维数组。
  • dims,输出目标直方图的维度。一般设为 1(线)。
  • histSize,x 轴将被分成 histSize 份。
  • ranges,x 的取值范围。
  • uniform,直方图是否归一化的标识符,默认为 true。
  • accumulate,在计算直方图时是否清空传入的 hist。true 表示不清空,false 表示清空。默认为 false。只有在想要统计多个图像序列中的累加直方图时才会设置为 true。

代码示例:

#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/证件照/6.jpg");
imshow("src", src); //计算 BGR 三通道各自直方图
vector<Mat>bgr();
int channels[] = { ,, };
int histsize[] = { ,, };
float r[] = { , };
const float* ranges[] = { r,r,r };
calcHist(&src, , &channels[], Mat(), bgr[], , &histsize[], &ranges[], true);
calcHist(&src, , &channels[], Mat(), bgr[], , &histsize[], &ranges[], true);
calcHist(&src, , &channels[], Mat(), bgr[], , &histsize[], &ranges[], true); //直方图归一化
//https://www.cnblogs.com/bjxqmy/p/12292421.html
int w = , h = ;
normalize(bgr[], bgr[], h, , NORM_L1);
normalize(bgr[], bgr[], h, , NORM_L1);
normalize(bgr[], bgr[], h, , NORM_L1); //绘制直方图
string names[] = { "b_img","g_img","r_img" };
Mat dst[];//绘在三张背景上
dst[] = Mat(h, w, src.type(), Scalar(, , ));
dst[] = dst[].clone();
dst[] = dst[].clone();
double width[] = { w / histsize[],w / histsize[],w / histsize[] };
Scalar colors[] = { Scalar(,,),Scalar(,,) ,Scalar(,,) };
for (int i = ; i < ; i++) {
for (int j = ; j < histsize[i]; j++) {
Point pre = Point(j*width[i], h);
Point next = Point(j*width[i], h - bgr[i].at<float>(j));
line(dst[i], pre, next, colors[i], );
}
imshow(names[i], dst[i]);
}
waitKey();
}

效果演示:

借鉴博客:https://blog.csdn.net/zhu_hongji/article/details/81663161

最新文章

  1. H3 BPM社区:流程开发者的学习交流平台
  2. Fedora下依赖库的解决
  3. MVC学习网站
  4. 接口测试之HttpClient
  5. archlinux 安装mysql-workbench
  6. 51nod 1049 1049 最大子段和 (dp)
  7. js各种间距数据汇总
  8. 1829 A Bug&#39;s Life
  9. DOS命令关闭进程
  10. centos系统使用技巧
  11. asp.net Page_Load事件加载两次
  12. jascript基础教程学习总结(2)
  13. druid 搭建集群环境
  14. Css详解之(伪类选择器)
  15. React Native: unable to load scripts from assets &#39;index.android.bundle&#39; on real device
  16. PHPsql
  17. java的Io流学习
  18. bootstrap 下拉选中查询
  19. V-rep学习笔记:机器人模型创建3—搭建动力学模型
  20. appium启动APP时避免重新安装的问题

热门文章

  1. Django 连接mysql 踩过的坑
  2. context:component-scan标签的诠释
  3. 【红外DDE算法】聊聊红外图像增强算法的历史进程(第一回)
  4. moco响应中文乱码
  5. thinkphp快速入门(学习php框架及代码审计)
  6. (转) fuzzing XSS filter
  7. Frameworks.Entity.Core 1
  8. 谈谈模型融合之三 —— GBDT
  9. 基本库使用(urllib,requests)
  10. Linux文件内容重定向