opencv 颜色直方图直方图该怎么画

opencv:绘制直方图
一、关于直方图的数据结构
typedef struct CvHistogram
float thresh[CV_MAX_DIM][2]; /* for uniform histograms */
float** thresh2; /* for non-uniform histograms */
CvMatND /* embedded matrix header for array histograms */
二、创建直方图结构的函数
CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );
1、dims:表示直方图的维数
2、sizes:为指向整形的指针,在使用的时候其定义为一个一维的数组。且该数组的元素个数与dims相同,每个元素表示的是对应维度上的bin的个数
譬如:假设它该直方图为一个二维的直方图,则size数组便有两个元素,第一个元素的值表示第一个维度上的bin的个数,依次类推。
3、type:他可以取值为 CvMatND或者 CvSparseMat。前者表述使用密集数组进行存储,后者表示使用稀疏数组进行存储,主要为了节省存储空间。
4、表示每个维度的上的取值范围,他用双指针的类型可以解释如下。
float range1[]={ 0,255}//他表示第一个维度上的取值范围为:0-255
float range2[]={ 0,255}//他表示第二个维度上的取值范围为:0-255
float *ranges[]={ range1,range2}//ranges变量存储的实际上是range1的地址,range1存储的实际上又是浮点数组range1[]的首地址。于是ranges便使用双指针的变量表示各个维度的取值范围。
5、uniform:设为1,表示bin是均匀分布的,0表示非均匀分布
三、从直方图里面取出各个bin的值:
&cvQueryHistValue_3D( hist, idx0, idx1, idx2 )
如果为一维直方图则为1D
四、从直方图中取出最大的值
void cvGetMinMaxHistValue( const CvHistogram* hist,
float* min_value, float* max_value,
int* min_idx=NULL, int* max_idx=NULL );
五、绘制直方图
绘制直方图,便是将各个bin的值直观的呈现在一副图像里面(一般为二值图像),为了使得得到直方图看起来是连续的,可以使用填充多边形的方法,当然也可以使用绘制矩形,使用矩形的高度来表达对应bin的个数。当然也可以使用绘制直线的方法。
具体代码如下:
六、效果图如下
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?【图文】《学习OpenCV》第7章 直方图与匹配_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
《学习OpenCV》第7章 直方图与匹配
&&《学习OpenCV》第7章
大小:2.59MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢OpenCV入门(二十一)-- 绘制彩色图像的直方图 - thystar的专栏 - CSDN博客
OpenCV入门(二十一)-- 绘制彩色图像的直方图
学习OpenCV--学习笔记
本文中的代码大多来源于:
颜色直方图的一些概念 & & &&
颜色可以是基于不同的和。最常用的是RGB颜色空间,原因在于大部分的数字图像都是用这种颜色空间表达的。然而,RGB空间结构并不符合人们对颜色相似性的主观判断。因此,有人提出了基于HSV空间、Luv空间和Lab空间的颜色,因为它们更接近于人们对颜色的主观认识。其中HSV空间是最常用的颜色空间。它的三个分量分别代表色彩(Hue)、(Saturation)和值(Value)。
HSV颜色空间:HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个 模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义,
代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时 加入不同比例的白色,黑色即可获得各种不同的色调。
HSV颜色模型
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
取值范围为0.0~1.0,值越大,颜色越饱和。
取值范围为0.0(黑色)~1.0(白色)。
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
代码:绘制lena图像的直方图;
#include &highgui.h&
#include &cv.h&
#include&iostream&
void doHistDraw(IplImage* img)
IplImage* hsv = cvCreateImage(cvGetSize(img), 8, 3);
IplImage* h_plane = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* s_plane = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* v_plane = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* planes[] = {h_plane, s_plane};
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(img,hsv, CV_BGR2HSV);
cvCvtPixToPlane(hsv, h_plane, s_plane, v_plane, 0);
//创建直方图
CvHistogram* hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1);
// 根据H,S两个平面数据统计直方图
cvCalcHist(planes,hist, 0,0);
//获取直方图统计的最大值和最小值,用于动态显示直方图
float max_
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_ h++)
for(int s = 0; s & s_ 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(&H-S&,1);
cvShowImage(&H-S&,hist_img);
cvWaitKey(0);
结果:lena的直方图为:
我的热门文章【OpenCV入门指南】第八篇 灰度直方图 - CSDN博客
【OpenCV入门指南】第八篇 灰度直方图
& 直方图又称柱状图、质量分布图,是一种统计报告图。直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。在图像处理上,直方图是图像信息统计的有力工具。& 灰度直方图是指对图像的灰度信息进行统计,我们知道灰度图在图像处理中应用非常广泛,在前面的《》、《》、《》均能找到灰度图的用武之地。因此灰度直方图具有较高的实用价值。下面先介绍灰度直方图的几个主要函数。函数功能:创建直方图函数原型:(CvHistogram*)& cvCreateHist( // Creates new histogram dims, * sizes,
type,** ranges CV_DEFAULT(NULL), uniform CV_DEFAULT(1)参数说明:第一个参数表示直方图维数,灰度图为,彩色图为。第二个参数表示直方图维数的数目,其实就是数组的维数。第三个参数表示直方图维数尺寸的数组。第四个参数表示直方图类型,为表示直方图数据表示为多维密集数组,为表示直方图数据表示为多维稀疏数组。第五个参数表示归一化标识,其原理有点复杂。通常使用默认值即可。函数说明:直方图的数据结构如下所示: struct CvHistogram&&&& type;*& bins;&& thresh[CV_MAX_DIM][2];& /* For uniform histograms. */** thresh2;&&&&&&&&&&&&&&& /* For non-uniform histograms. */ mat;&&&& /* Embedded matrix header for array histograms. */;二.函数功能:根据图像计算直方图函数原型:& cvCalcHist( ** image, * hist, accumulate CV_DEFAULT(0), CvArr* mask CV_DEFAULT(NULL)参数说明:第一个参数表示输入图像。第二个参数表示输出的直方图指针。第三个参数操作确定输入图像的哪个象素被计数。第四个参数表示累计标识。如果设置,则直方图在开始时不被清零。这个特征保证可以为多个图像计算一个单独的直方图,或者在线更新直方图。函数说明:这是个函数,函数内部会直接调用其它直方图的函数介绍可以参阅:下面给出灰度直方图的代码示范://图像的灰度直方图
//By MoreWindows (http://blog.csdn.net/MoreWindows)
#include &opencv2/opencv.hpp&
#include &opencv2/legacy/compat.hpp&
#pragma comment(linker, &/subsystem:\&windows\& /entry:\&mainCRTStartup\&&)
void FillWhite(IplImage *pImage)
cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage-&width, pImage-&height), CV_RGB(255, 255, 255), CV_FILLED);
// 创建灰度图像的直方图
CvHistogram* CreateGrayImageHist(IplImage **ppImage)
int nHistSize = 256;
float fRange[] = {0, 255};
//灰度级的范围
float *pfRanges[] = {fRange};
CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);
cvCalcHist(ppImage, pcvHistogram);
return pcvH
// 根据直方图创建直方图图像
IplImage* CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram)
IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);
FillWhite(pHistImage);
//统计直方图中的最大直方块
float fMaxHistValue = 0;
cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);
//分别将每个直方块的值绘制到图中
for(i = 0; i & nImageW i++)
float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小
int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight);
//要绘制的高度
cvRectangle(pHistImage,
cvPoint(i * nScale, nImageHeight - 1),
cvPoint((i + 1) * nScale - 1, nImageHeight - nRealHeight),
cvScalar(i, 0, 0, 0),
return pHistI
int main( int argc, char** argv )
const char *pstrWindowsSrcTitle = &原图(http://blog.csdn.net/MoreWindows)&;
const char *pstrWindowsGrayTitle = &灰度图(http://blog.csdn.net/MoreWindows)&;
const char *pstrWindowsHistTitle = &直方图(http://blog.csdn.net/MoreWindows)&;
// 从文件中加载原图
IplImage *pSrcImage = cvLoadImage(&007.jpg&, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 灰度直方图
CvHistogram *pcvHistogram = CreateGrayImageHist(&pGrayImage);
// 创建直方图图像
int nHistImageWidth = 255;
int nHistImageHeight = 150;
//直方图图像高度
int nScale = 2;
IplImage *pHistImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogram);
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsHistTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
cvShowImage(pstrWindowsGrayTitle, pGrayImage);
cvShowImage(pstrWindowsHistTitle, pHistImage);
cvWaitKey(0);
cvReleaseHist(&pcvHistogram);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsGrayTitle);
cvDestroyWindow(pstrWindowsHistTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pHistImage);
}运行效果如下图所示:由直方图可以看出灰度图上有四种灰度占了很大一部分比例。估计应该是墙壁,衣服,裤子及皮肤这四种灰度吧。本篇主要介绍了灰度图像的直方图,彩色图像的直方图可以参考:后面二篇《》与《》将介绍直方图的均衡化处理,这是图像增强的常用方法。欢迎继续浏览。&《入门指南》系列文章地址:转载请标明出处,原文地址:欢迎关注微博:
本文已收录于以下专栏:
相关文章推荐
《OpenCV入门指南》系列文章地址:
http://blog.csdn.net/morewindows/article/category/1291764
转载请标明出处,原文地址:htt...
直方图(Histogram)又称柱状图、质量分布图,是一种统计报告图。直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。在图像处理上,直方图是图像信息...
直方图(Histogram)又称柱状图、质量分布图,是一种统计报告图。直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。在图像处理上,直方图是图像信息...
《OpenCV入门指南》系列文章地址:
http://blog.csdn.net/morewindows/article/category/1291764
转载请标明出处,原文地址:htt...
上一篇《OpenCV第八篇灰度直方图》介绍对灰度直方图,本篇将介绍直方图的均衡化,这是图像增强的常用方法。直方图均衡化的数学原理这里就不介绍了,有兴趣可以查阅专业书籍。下面来看看灰度直方图均衡化的函数...
上一篇《OpenCV第八篇灰度直方图》介绍对灰度直方图,本篇将介绍直方图的均衡化,这是图像增强的常用方法。直方图均衡化的数学原理这里就不介绍了,有兴趣可以查阅专业书籍。下面来看看灰度直方图均衡化的函数...
灰度直方图是一个帮助分析图像很有力的工具吧,今天学习了下,一天不敲代码就生疏啊- -
  灰度直方图这个程序主要有几个函数和结构体先说一下:
  1.  CreateHIst
       &#160...
根据第一篇创建项目并添加两个文件
程序如下:
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)OpenCV学习(十六)之直方图均衡化并画出直方图
实验环境: VS2010 + OpenCV2.4.9.0
#include &iostream&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/imgproc/imgproc.hpp&
void showHistogram(Mat &src, int bins,char* wndName)
int histSize[] = {bins};
float range[] = {0,bins};
const float* ranges[] = {range};
int channels[] = {0};
calcHist(&src, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);
double maxV
minMaxLoc(hist, 0, &maxVal, 0, 0);
int scale = 2; //histogram size(width)
int histHeight = 256;
Mat histImage = Mat::zeros(histHeight,bins * scale,CV_8UC1);
for(int i = 0; i & i++)
float binVal = hist.at&float&(i);
int intensity = cvRound(binVal * histHeight/maxVal);
rectangle(histImage,Point(i * scale,histHeight - 1),
Point((i + 1)*scale - 1,histHeight - intensity),CV_RGB(255,255,255));
namedWindow(wndName,CV_WINDOW_AUTOSIZE);
imshow(wndName,histImage);
int main(int argc,char** argv)
char* source_window = &Source Image&;
char* equalized_window = &Equalized Image&;
src = imread(&lena.jpg&);
if(!src.data)
cerr && &Read Image Failed!& &&
cvtColor(src,src,CV_BGR2GRAY);
equalizeHist(src,dst);
namedWindow(source_window,CV_WINDOW_AUTOSIZE);
imshow(source_window,src);
namedWindow(equalized_window,CV_WINDOW_AUTOSIZE);
imshow(equalized_window,dst);
//show the histogram
int bins = 256;
showHistogram(src, bins,&Original Image Hist&);
showHistogram(dst, bins,&Equalized Image Hist&);
waitKey(0);
原始图像:
原始直方图:
直方图均衡化结果:
均衡化后的直方图:
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 opencv画直方图 的文章

 

随机推荐