opencv之直方图计算及绘制
2017-06-16 20:06
337 查看
图像直方图概述
直方图是对数据进行统计的一种方法,可以直观表现图像某属性的数据(频率)分布情况,包括灰度直方图,RGB直方图等
相关 概念及函数
&&dims :需要统计的特征数目 ,如只统计灰度值—dims=1,统计RGB值 –dims=3
&&bins:每个特征空间子区域段的数目,也可以称为组距(简单理解为直方图分成几个柱子组成)
&&range:每个特征空间的取值范围,如灰度值取值范围[0,255]
计算直方图函数 :calcHist()
void calcHist(const Mat *images,int nimages,const int *channels,InputArray mask,OutputArray hist,int dims,const int *hisSize,const float**ranges,bool uniform=ture,bool accumulate=false)
&& images :const Mat *类型,输入数组(或者数组集),需要有相同的深度和尺寸 多张图片
&&nimages:输入数组的个数,即第一个参数中存放图像个数
&&channels :需要统计通道的索引,表示要使用哪个通道或多个通道(属性)
&&mask:可选的操作掩码,如果不为空,则必须为8位,并且与图像有一样的大小尺寸
&&hist:输出的目标直方图
&&dims:需要计算的直方图维度,必须是正数 类似于通道数
&&histSize:存放每个维度的直方图尺寸的数组,即bins
&&ranges:表示每一维数值的取值范围
&&uniform:直方图是否均匀的标识符 默认值true
&&accumulate:累计标识符,默认值false,若为true,直方图在配置阶段不会被清零
//不均匀灰度直方图
Mat img=imread(“1.png”,0);//以灰度方式打开
imshow(“src”,img);
Mat dstHist;//定义存储直方图变量
int channels=0;
int hisSize[1]={5};
float hranes[6]={0,50,100,150,200,256};
const float *ranges[1]={hranges};
int size=256;
//计算直方图
calcHist(&img,1,&channels,Mat(),dstHist,1,histSize,ranges,false);
//(RGB三色直方图)
int channels_r={0};
//计算B通道直方图
calcHist(&src,1,channels_r,Mat(),hist_r,1,hist_size,ranges);
int channels_g[]={1};
calcHist(&src,1,channel_g,Mat(),hist_g,1,hist_size,ranges);
int channels_b[]={2};
calcHist(&src,1,channels_b,Mat(),hist_b,1,hist_size,ranges);
//(BG)二维直方图
int Bins=256,Gbins=256;
int histSize[]={Bbins,Gbins};
float hranges[]={0,256} ;
float sranges[]={0,256};
const float *ranges[]={hranges,sranges};
Mat hist;
int channels[]={0,1};
calcHist(&srx,1,channels,Mat(),hist,2,histSize,ranges);
直方图是对数据进行统计的一种方法,可以直观表现图像某属性的数据(频率)分布情况,包括灰度直方图,RGB直方图等
相关 概念及函数
&&dims :需要统计的特征数目 ,如只统计灰度值—dims=1,统计RGB值 –dims=3
&&bins:每个特征空间子区域段的数目,也可以称为组距(简单理解为直方图分成几个柱子组成)
&&range:每个特征空间的取值范围,如灰度值取值范围[0,255]
计算直方图函数 :calcHist()
void calcHist(const Mat *images,int nimages,const int *channels,InputArray mask,OutputArray hist,int dims,const int *hisSize,const float**ranges,bool uniform=ture,bool accumulate=false)
&& images :const Mat *类型,输入数组(或者数组集),需要有相同的深度和尺寸 多张图片
&&nimages:输入数组的个数,即第一个参数中存放图像个数
&&channels :需要统计通道的索引,表示要使用哪个通道或多个通道(属性)
&&mask:可选的操作掩码,如果不为空,则必须为8位,并且与图像有一样的大小尺寸
&&hist:输出的目标直方图
&&dims:需要计算的直方图维度,必须是正数 类似于通道数
&&histSize:存放每个维度的直方图尺寸的数组,即bins
&&ranges:表示每一维数值的取值范围
&&uniform:直方图是否均匀的标识符 默认值true
&&accumulate:累计标识符,默认值false,若为true,直方图在配置阶段不会被清零
//均匀的直方图 #include"opencv/opencv.hpp" using namespace cv; void main() { Mat img=imread("1.jpg",0);//用灰度图来打开 imshow("src",img); Mat dstHist;//定义存储直方图的变量//或者MatND dstHist ; int dims=1;//需要统计的特征数目(在这只统计灰度) float haranges[]={0,256};//范围(0,256)注意是最大值加1 const float* ranges[]={hranges}; int bins=256; int channels=0;//灰度值默认第0通道 //计算直方图 不用掩码给一个空 calcHist(&im 4000 g,1,&channels,Mat(),dstHist,dims,&bins,ranges); int scale=1; Mat dstImg(bins*scale,bins*1,CV_8UC3,Scalar(0));//定义直方图输出图像 double minValue=0; double maxValue=0; minMacLoc(dstHist,&minValue,&maxValue,0,0);//统计最大值和最小值 返回他的值和位置 用来定义高度 int hpt=saturate_cast<int>(0.9*bins);//设置最大值并防止溢出 int j=0; for(int i=0;i<256;i++) { float binValue=dstHsist.at<float>(i); if(i>250) cout<<"i="<<i<<"--Value="<<binValue<<endl; int realValue=saturate_cast<int>(binValue*hpt/maxValue);//做一个归一化的操作 0-1的范围 等变量的变小 cout<<"i="<<i<<"--Value="<<realValue<<endl; // line(dstimg,Point(i*scale,bins-1),Point(i*scale,bins-realValue),Scalar(0,255,0),1,8); // rectangle(dstimg,Point(i*scale,bins-1),Point(i+1)*scale-1,bins-realValue,Scalar(0,255,0),1); //自己可以画宽点 } }
//不均匀灰度直方图
Mat img=imread(“1.png”,0);//以灰度方式打开
imshow(“src”,img);
Mat dstHist;//定义存储直方图变量
int channels=0;
int hisSize[1]={5};
float hranes[6]={0,50,100,150,200,256};
const float *ranges[1]={hranges};
int size=256;
//计算直方图
calcHist(&img,1,&channels,Mat(),dstHist,1,histSize,ranges,false);
//(RGB三色直方图)
int channels_r={0};
//计算B通道直方图
calcHist(&src,1,channels_r,Mat(),hist_r,1,hist_size,ranges);
int channels_g[]={1};
calcHist(&src,1,channel_g,Mat(),hist_g,1,hist_size,ranges);
int channels_b[]={2};
calcHist(&src,1,channels_b,Mat(),hist_b,1,hist_size,ranges);
//(BG)二维直方图
int Bins=256,Gbins=256;
int histSize[]={Bbins,Gbins};
float hranges[]={0,256} ;
float sranges[]={0,256};
const float *ranges[]={hranges,sranges};
Mat hist;
int channels[]={0,1};
calcHist(&srx,1,channels,Mat(),hist,2,histSize,ranges);
相关文章推荐
- OpenCV环境下计算并绘制HSV空间的H-S的二维联合直方图
- python opencv入门 直方图计算、绘制、分析(22)
- opencv图像直方图的计算及绘制
- opencv学习之(五)-直方图计算和绘制图像直方图
- opencv(18)---直方图计算以及绘制
- OpenCV环境下计算并绘制灰度直方图的源码!
- opencv学习之(五)-直方图计算和绘制图像直方图
- 【OpenCV学习笔记】二十一、直方图计算及绘制(一)
- 【OpenCV学习笔记】二十二、直方图计算及绘制(二)
- 利用OpenCV的calcHist绘制灰度直方图、H-S直方图的源码及说明
- C++使用opencv实现彩色直方图计算
- OpenCV2编程手册笔记之 4.2计算图像的直方图
- 利用OpenCV计算并绘制灰度直方图 (转载)
- 图像相似度计算之直方图方法OpenCV实现
- 【OpenCV】直方图计算
- opencv直方图创建CreateHist、计算cvCalcHist和访问的汇总
- 有关opencv的学习(9)—计算图像直方图
- opencv 绘制图像直方图
- opencv3 绘制BGR三色直方图
- 图像相似度计算之直方图方法OpenCV实现