建立直方图
 (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. 通过双向证书认证使用 gSOAP 访问 web services
  2. kail Linux 安装Parallels Tools
  3. 如何解决java乱码_java如何解决乱码
  4. qhfl-3 Course模块
  5. 2018-07-06笔记(LNMP配置)
  6. Android之使用AlertDialog类和AlertDialog.Builder类创建带取消,确定,中立的对话框
  7. jdk1.6+Maven
  8. git合并分支的时候将某个文件添加到忽略列表_常用的 Git 命令
  9. shell if判断语句
  10. 用c语言定义一个分式方程,计算机C语言实验报告(00001)
  11. 关于管理的十个经典故事
  12. 最新全套Web前端视频教程
  13. 计算机服务器可以开游戏吗,想买台小服务器做个人电脑,玩游戏可以吗
  14. 有哪些值得推荐的PS(Adobe Photoshop)插件?
  15. Ubuntu 优化、美化(主题、终端)
  16. 2018c语言二级选择题题库,计算机二级office题库选择题及答案
  17. 计算机常见故障及其原因
  18. vmware校园网虚拟机无法连接网络解决方法
  19. itunes下载的软件所在目录
  20. JS学习之路系列总结二阴阳阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)...

热门文章

  1. 2022A特种设备相关管理(电梯)考试题模拟考试题库模拟考试平台操作
  2. 共享网络电子商刊(iebook)营销盛宴
  3. CMOS摄像头驱动分析
  4. 中职学校计算机大赛方案,2014年河北省中等职业学校信息化教学大赛方案(附件1)...
  5. 解析圆—-智能手表UI设计理念
  6. 在GridView中使用FindControl
  7. 香港主机需要考虑的几个因素
  8. Tekla二次开发——AutoCAD导入Tekla
  9. 如何批量生成IATA条码
  10. [Unity3D]修改PaintIn3D插件源码以便用于VR