您的位置:首页 > 运维架构

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,直方图在配置阶段不会被清零

//均匀的直方图
#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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: