opencv之直方图计算及绘制

图像直方图概述
直方图是对数据进行统计的一种方法,可以直观表现图像某属性的数据(频率)分布情况,包括灰度直方图,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(&img,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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值