直方图可以用来描述各种不同的事物,如物体的色彩分布、物体边缘梯度模板,以及表示目标位置的当前假设。

简单的说,直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中。bin中的数值是从数据中计算出特征的统计量,这些数据可以是诸如梯度、方向、色彩或者任何其他特征。无论如何,直方图获得的是数据分布的统计图。通常直方图的维数要低于原始数据。

具体可参见:

http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html#histogram-calculation

下面参考《Learning OpenCV》一个例子。根据输入的图像计算出一个色相饱和度的2维直方图。

/**
* file:参考《learning OpenCV》P227
* author: Jacky_Liu
* date: 2013-12-06
*/ #include <QtCore/QCoreApplication>
#include <cv.h>
#include <highgui.h> int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);
// return a.exec(); IplImage *src = NULL; if(argc != || (src = cvLoadImage(argv[], )) == )
{
printf("The number of the arguments is wrong, or the fail to load image.");
return ;
} //转换颜色空间
IplImage *hsv = cvCreateImage(cvGetSize(src), , );
cvCvtColor(src, hsv, CV_BGR2HSV); //分割到3个独立通道的图像
IplImage *h_plane = cvCreateImage( cvGetSize(src), , );
IplImage *s_plane = cvCreateImage( cvGetSize(src), , );
IplImage *v_plane = cvCreateImage( cvGetSize(src), , ); IplImage *planes[] = {h_plane, s_plane};
cvCvtPixToPlane(hsv, h_plane, s_plane, v_plane, ); //建立直方图结构,并计算
int h_bins = , s_bins = ;
CvHistogram *hist = NULL; //数组每一个元素对应直方图对应维数的bin的个数
int hist_size[] = {h_bins, s_bins};
//hue范围[0,180]
float h_ranges[] = {, };
float s_ranges[] = {, };
float *ranges[] = {h_ranges, s_ranges}; hist = cvCreateHist(, //直方图维数为2维
hist_size, //直方图每一维对应的bin数
CV_HIST_ARRAY, //稠密矩阵存储
ranges, //直方图每一维的维数
); //均匀直方图
//计算直方图
cvCalcHist(planes, hist, , ); //显示2维直方图
int scale = ;
IplImage *hist_img = cvCreateImage(cvSize(h_bins * scale, s_bins * scale),
, );
cvZero( hist_img ); float max_value = ;
cvGetMinMaxHistValue(hist, , &max_value, , ); for(int h = ; h < h_bins; h++)
{
for(int s = ; s < s_bins; s++)
{
//获取bin对应的最大值
float bin_val = cvQueryHistValue_2D(hist, h, s);
//颜色归一化到[0,255]显示
int intensity = cvRound( bin_val * / max_value);
//显示
cvRectangle(
hist_img,
cvPoint( h*scale, s*scale),
cvPoint( (h+)*scale - , (s+)*scale - ),
CV_RGB(intensity,intensity, intensity),
CV_FILLED
);
}
}
cvNamedWindow("Source", );
cvShowImage("Source", src); cvNamedWindow("H-S Histogram", );
cvShowImage("H-S Histogram", hist_img);
cvWaitKey(); return ;
}

OpenCV处理直方图的更多相关文章

  1. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  2. opencv——图像直方图与反向投影

    引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...

  3. opencv 比较直方图方式 进行人脸检测对比

    完整opencv(emgucv)人脸.检测.采集.识别.匹配.对比 //成对几何直方图匹配               public static string MatchHist()         ...

  4. 【OpenCV】直方图

    今天写直方图,学了几个相关函数 1. mixChannels void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const ...

  5. Opencv——灰度直方图

    灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率. 如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用pro ...

  6. OpenCV 之 直方图处理

    1  图像直方图 1.1  定义 统计各个像素值,在整幅图像中出现次数的一个分布函数.        1.2  标准化 $\quad p_r(r_k) = \frac{n_k}{MN} \qquad ...

  7. 【Opencv】直方图函数 calchist()

    calchist函数需要包含头文件 #include <opencv2/imgproc/imgproc.hpp> 函数声明(三个重载 calchist函数): //! computes t ...

  8. opencv图像直方图均衡化及其原理

    直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均 ...

  9. opencv 7 直方图与匹配

    图像直方图概述 直方图的计算与绘制 计算直方图:calcHist()函数 找寻最值:minMaxLoc()函数 示例程序:绘制H-S直方图 #include "opencv2/highgui ...

随机推荐

  1. 用canvas绘制验证码

    在通常的登录界面我们都可以看到验证码,验证码的作用是检测是不是人在操作,防止机器等非人操作,防止数据库被轻而易举的攻破. 验证码一般用PHP和java等后端语言编写: 但是在前端,用canva或者SV ...

  2. [Baltic2009]Radio Transmission

    bzoj 1355: [Baltic2009]Radio Transmission http://www.lydsy.com/JudgeOnline/problem.php?id=1355 Time ...

  3. Java并发编程原理与实战十九:AQS 剖析

    一.引言在JDK1.5之前,一般是靠synchronized关键字来实现线程对共享变量的互斥访问.synchronized是在字节码上加指令,依赖于底层操作系统的Mutex Lock实现.而从JDK1 ...

  4. 自定义模板类型vs模板类型自动推测

    [自定义模板类型vs模板类型自动推测] GCC在编译时,先确定看是否人工定义了模板的类型,如果定义了,则看传递的参数是否能转换成定义后的类型,如果没定义,则根据参数确定定义的类型. 1. 是否人工定义 ...

  5. 《设计模式》-原则四:接口隔离原则(ISP)

    啊!天气很热啊,回来洗个澡,做个饭吃完后 又出了一身汗,真后悔先洗澡. 加油坚持学习,今天要学的是“接口隔离原则” 意思是说:在设计的时候使用多个专门的接口比使用一个总的接口好很多.一个类对另一个类的 ...

  6. VBS 重启 TP-Link 路由器

    分享一个自己用的小工具,重启TP-Link路由器的,好像还是大学时候写的,献丑了. 其他路由器可能有些不同,但是思路都是差不多的. user = "admin" '路由器帐号 pa ...

  7. 20155301 2016-2017-2 《Java程序设计》第5周学习总结

    20155301 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 1.1try.catch关键词,在用户不小心输入错误的时候,程序会出现错误信息,将代表错误的 ...

  8. php empty()与isset()

    empty() : 检查一个变量是否为空. 判断一个变量是否被认为是空的.当一个变量并不存在,或者它的值等同于FALSE,那么它会被认为不存在.如果变量不存在的话,empty()并不会产生警告. em ...

  9. java中并发Queue种类与各自API特点以及使用场景!

    一 先说下队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部) 就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经 ...

  10. gcc 编译 + 选项【转】

    转自:http://blog.csdn.net/princess9/article/details/6567678 一般来说要现有项目中的编译选项,设置新的project的编译选项 编译器 就是将“高 ...