建立直方图
 (CvHistogram*) cvCreateHist( int dims, int* sizes, int type, float** ranges CV_DEFAULT(NULL), int uniform CV_DEFAULT(1));
dim为hist的维度;size为总分区间数;type为标记图像是什么类型,是CV_HIST_ARRAY,还是CV_HIST_TREE,然后就可以选择如何保存数据,如果CV_HIST_ARRAY,就用CvMatND(多维密集数组);如果CV_HIST_TREE,就使用CvSparseMat(多维稀疏数组);range为每个维度的范围;uniform为归一化标识,一般用1。
计算直方图
void cvCalcHist( IplImage** image, CvHistogram* hist, int accumulate CV_DEFAULT(0), const CvArr* mask CV_DEFAULT(NULL) );
image为需要计算的图像,hist为直方图结构体。

(void) cvGetMinMaxHistValue( const CvHistogram* hist, float* min_value, float* max_value, int* min_idx CV_DEFAULT(NULL), int* max_idx CV_DEFAULT(NULL));
用来找直方图中最大最小值。

注意:当显示直方图时,还需要从HSV空间转换到RGB空间才行。

以下是网上一个示例代码,对图像H,S两个通道来计算直方图并显示:

#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;

int main( int argc, char** argv )
{
 IplImage * src;
 if (!(src = cvLoadImage("girl.jpg")))
 {
  cout << "没有找到源文件" << endl;
  return -1;
 }
 
 IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
 IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
 IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
 IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
 IplImage* planes[] = { h_plane, s_plane };
 
 /** H 分量划分为16个等级,S分量划分为8个等级 */
 int h_bins = 16, s_bins = 8;
 int hist_size[] = {h_bins, s_bins};
 
 /** H 分量的变化范围 */
 float h_ranges[] = { 0, 180 };
 
 /** S 分量的变化范围*/
 float s_ranges[] = { 0, 255 };
 float* ranges[] = { h_ranges, s_ranges };
 
 /** 输入图像转换到HSV颜色空间 */
 cvCvtColor( src, hsv, CV_BGR2HSV );
 cvNamedWindow( "hsv", 1 );
 cvShowImage( "hsv", hsv );
 
 cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
 cvNamedWindow( "h_plane", 1 );
 cvShowImage( "h_plane", h_plane );
 cvNamedWindow( "s_plane", 1 );
 cvShowImage( "s_plane", s_plane );
 cvNamedWindow( "v_plane", 1 );
 cvShowImage( "v_plane", v_plane );
 
 /** 创建直方图,二维, 每个维度上均分 */
 CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
 /** 根据H,S两个平面数据统计直方图 */
 cvCalcHist( planes, hist, 0, 0 );
 
 /** 获取直方图统计的最大值,用于动态显示直方图 */
 float max_value;
 cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
 
 
 /** 设置直方图显示图像 */
 int height = 240;
 int width = (h_bins*s_bins*6);
 IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
 cvZero( hist_img );
 
 /** 用来进行HSV到RGB颜色转换的临时单位图像 */
 IplImage * hsv_color = cvCreateImage(cvSize(1,1),8,3);
 IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);
 int bin_w = width / (h_bins * s_bins);
 for(int h = 0; h < h_bins; h++)
 {
  for(int s = 0; s < s_bins; s++)
  {
   int i = h*s_bins + s;
   /** 获得直方图中的统计次数,计算显示在图像中的高度 */
   float bin_val = cvQueryHistValue_2D( hist, h, s );
   int intensity = cvRound(bin_val*height/max_value);
 
   /** 获得当前直方图代表的颜色,转换成RGB用于绘制 */
   cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,255,0));
   cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
   CvScalar color = cvGet2D(rgb_color,0,0);
 
   cvRectangle( hist_img, cvPoint(i*bin_w,height),
    cvPoint((i+1)*bin_w,height - intensity),
    color, -1, 8, 0 );
  }
 }
 
 cvNamedWindow( "Source", 1 );
 cvShowImage( "Source", src );
 
 cvNamedWindow( "H-S Histogram", 1 );
 cvShowImage( "H-S Histogram", hist_img );
 
 cvWaitKey(0);
}

opcv 直方图计算相关推荐

  1. OpenCV(十九)直方图(直方图计算、掩膜、均衡化、自适应均衡化)

    目录 一.基础理论 1.原理及作用 2.专业术语 二.直方图计算 函数介绍: 1.灰度图 代码: 效果: 2.彩色图 代码: 三.直方图掩膜的应用(mask) 1.基础理论 2.代码 3.效果 四.直 ...

  2. 【OpenCV 】直方图均衡化,直方图计算,直方图对比

    目录 1.直方图均衡化¶ 1.1 原理 1.2 直方图均衡化 1.3 直方图均衡化原理 1.4 代码实例 1.5 运行效果 2. 直方图计算¶ 2.1 目标 2.2 直方图 2.3 代码实例 2.4 ...

  3. OpenCV2.3的cvCalcHist函数有问题?255级值总为0,索性自己写一个直方图计算函数,附源码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 我在写直方图规定化的代码过程中,发现OpenCV ...

  4. OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配

    直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...

  5. Win8 Metro(C#)数字图像处理--3.3图像直方图计算

    原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary>/// Get the array of histrgram./// </summa ...

  6. Python OpenCV学习笔记之:灰度图像的直方图计算

    为什么80%的码农都做不了架构师?>>>    # -*- coding: utf-8 -*- """ 图像的直方图计算 ""&qu ...

  7. 【opencv学习笔记】025之直方图计算 - calcHist函数详解

    前言 如果你想了解更多有关于计算机视觉.OpenCV.机器学习.深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧! 1.calcHist函数是干什么滴? 这个问题嘛,看看标 ...

  8. 详解为什么OpenCV的直方图计算函数calcHist()计算出的灰度值为255的像素个数为0

    在使用OpenCV的直方图计算函数calcHist()时,发现灰度值为255的像素个数总是为0. 哪怕图像中灰度值为255的像素个数不为0,使用OpenCV的直方图计算函数calcHist()计算出的 ...

  9. OpenCV-Python直方图计算calcHist函数详解

    ☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在<<数字图像处理>第三章学习总结感悟2:直方图处理: h ...

最新文章

  1. (三十一)java多线程二
  2. Egret之位图字体
  3. python基础(1.5-1.7)
  4. python电脑下载有问题-Python 解决火狐浏览器不弹出下载框直接下载的问题
  5. 博士申请 | 香港中文大学(深圳)罗元教授招收计算机与信息工程全奖博士
  6. Collatz猜想 (Hailstone)(3n + 1猜想)
  7. spring mvc 与 jasper Report集成
  8. 吴恩达DeepLearningCourse1-神经网络和深度学习
  9. 基于matlab 的燃油喷雾图像处理方法,基于MATLAB的燃油喷雾图像处理方法.doc
  10. C语言高级输出及进阶
  11. 字符串的存储方式以及静态存储区域、栈、堆
  12. 西工大18秋《C语言程序设计》平时作业,西工大18秋C语言程序设计平时作业答案...
  13. 移动开发 Jetpack Compose 组件布局
  14. Android Studio报错: Alternatively, to transfer the license agreements from one workstation to another
  15. iOS底层探索之多线程(九)—GCD源码分析(栅栏函数)
  16. OC实现带弹跳动画按钮的界面控制器view
  17. c语言课程设计报告内容,c语言课程设计报告
  18. 第14课:走向技术管理者的4种方式
  19. Zigbee疑难问题定位以及思路方法分享 (一)
  20. python3 下载特定网页上的文件

热门文章

  1. 吾生也有涯,吾知也无涯_乌拉(7)
  2. 讲座“计算机与手机导购”
  3. 岗位来啦-华为研发OD招聘
  4. python-socket编程-一个简单的嗅探器
  5. git拉取代码如何解决冲突_Git工具-git pull拉取代码时冲突的解决办法
  6. 新闻发布系统,SQLHelper重构
  7. matlab wc wp,MATLAB_IIR_带通通滤波
  8. Arduino模拟简易倒车雷达系统
  9. JS计算两个日期之间的月份差
  10. 一键多值的Map~~