opencv之直方图的绘制

二维直方图的绘制:
绘制直方图:
1.参数的准备:绘制一个二维H-S直方图 二维的
根据10个参数来准备:
int huebinnum=x 色调直方图直条的数量
int saturationbinNum=y 饱和度直方图直条的数量
int histSize[]={huebinnum,saturationbinNum};//存放每个维度的直方图尺寸的数组,直接用首地址访问

float hueRanges[]={0,180}; 定义色调的范围是0-180
float saturationRanges[]={0,256}; 定义饱和度的变化范围
const float* ranges[]={hueRanges,saturationRanges}; 定义每一维度取值范围的数组

MatND dstHist 定义输出目标的直方图
int channels[]={0,1}//定义所用图片的那个通道进行直方图的绘制 通道0代表的是色调,通道1代表的是饱和度通道
进行直方图的绘制
calcHist(&hsv图片指针类型,1图片的个数,channels通道的索引,Mat(),dstHist输出的目标直方图,2需要计算直方图的维度,histSize存放每个维度直方图尺寸的数组,Ranges每一维度的取值范围的数组,true,false)默认的true表示均匀的直方图,false累计标识符,false表示直方图在配置阶段会被清零

2,寻找最值:minMaxLoc()函数,在数组中找到全局最小值和全局最大值;
double minValue;
double maxValue;
Point a,b;
minMaxLoc(dstHist,&minValue,&maxValue,&a,&b,0);//单一定义的话要取地址,数组定义的话直接取首地址既可以

3.直方图的绘制
二维的绘制:
int scale=10;
Mat histImg=Mat::zeros(saturationbinNumscale,huebinnum10,CV_8UC3); 定义要显示的直方图
for(int hue=0;hue<huebinnum;hue++)
{
for(int saturation=0;saturation<saturationbinNum;saturation++)
{
//获取每个区间的直条值
float binValue=dstHist.at(hue,saturation); 直方图直条的值 区间获取值的 也就是在区间中像素点的个数
int intensity=cvRound();//每个区间的强度大小
//正式进行绘制
rectangle(histImg,Point(huescale,saturationscale),Point((hue+1)*scale-1,(saturation+1)*scale-1),Scalar::all(intensity),FILLED);用强度来代替颜色的画法,为每个区间进行填充颜色
}
}
最后一步就是显示了,既然绘制完成了就进行显示处理:注意显示保持的操作的步骤

实例程序:进行一维直方图的绘制处理:

用calcHist()函数进行直方图的获取

  1. 第一步进行参数的准备处理:
    灰度直方图的绘制:
    1.载入一张灰度图片
    2.定义灰度变量:MatND dstHist存放直方图的二维数组
    int dims=1;
    int size=256;定义直条的数目,灰度等级
    float hranges[]={0,255}; //灰度的范围是多少
    const float *ranges[]={hranges};
    int channel=0;通道0
    calcHist(&载入图像,1,&channel,Mat(),dstHist,dims,&size,ranges);//其他的值默认的

定义直方图的大小 Mat dstImg(size*scale,size,CV_8U,Scalar(0));
2.获取最大值和最小值:
double minValue=0;
double maxValue=0;
minMaxLoc(dstHist,&minValue,&maxValue,0,0);

3.绘制直方图
int hpt=saturate_cast(0.9size);
for(int i=0;i<256;i++)
{
//获取每个灰度值所对应的像素点的个数
float binValue=dstHist.at(i);返回的是个数
//对个数进行量化处理的
int realValue=saturate_cast(binValue
hpt/maxValue);
rectangle(dstImg,Point(i*scale,size-1),Point((i+1)*scale-1,size-realValue),Scalar(0,0,255),FILLED);

}
矩形画好之后就进行显示处理:注意显示保持的操作

一维和二维直方图的绘制程序本人都进行了详细的代码编辑,需要的朋友可以直接找我要!!!

猜你喜欢

转载自blog.csdn.net/nbxuwentao/article/details/86483382