opencv图像处理学习(十一)——直方图函数基本介绍

版权声明:不得随意转载 https://blog.csdn.net/qq_35789421/article/details/88918955

对于灰度图像f(x,y),p(k)=r_{k}/r,k\epsilon 0,1,\cdots ,N-1,其中N是图像中所有灰度数,r为图像中的所有像素数,对概率分布p(k)进行累计求和可得图像的累计归一化直方图h(k),即h(k)=\sum_{j}^{k}p(j).

灰度直方图用来描述图像中各个灰度级的像素个数(或该灰度级出现的次数(频率)),图像的横坐标表示灰度级,纵坐标表示图像中该灰度级出现的次数(频率)。

opencv提供了一个简单计算数组集(通常是图像或分割后的通道)的直方图函数calcHist,下面对其接口函数定义进行解释。

void calcHist(const Mat* images,int nimages,const int* channels,InputArray mask,OutputArray hist,int dims,const int* histSize,const float** ranges,bool uniform = true,bool accumulate = false);

参数images表示输入图像源指针,参数nimages表示待计算图像源中图像的个数,参数channels表示需要统计图像的通道维数数组索引,mask表示掩码参数,该参数必须是8bit而且和图像源同尺寸,参数hist表示输出计算的直方图,参数dims表示直方图维度,灰度图像为1,彩色为3,参数histSize表示直方图横坐标的区间数,参数ranges表示每一维灰度级的区间范围,accumulate是累计标志,用于设置是否清除开始分配时的直方图累计标志。

void histImage(int width ,int height,Mat Image_channel,scalar);

其中width是直方图的宽度,height是直方图的高度,Image_channel是图像类型,Scalar是赋值操作

补充归一化函数:

归一化:normalize()函数
功能:缩放和移位数组元素,以便指定的标准(alpha)或最小(alpha)和最大(beta)数组值获得指定的值。
void normalize( InputArray src, OutputArray dst, double alpha=1, double beta=0,
                             int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray());
参数解释:
参数1:InputArray类型的src,输入数组(图像)。
参数2:OutputArray类似的dst,输出数组(图像),与输入图像类型尺寸一样。
参数3:alpha,表示range normalization模式的最小值。有默认值为1。
参数4:beta,表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。有默认值为0。
参数5:normType,表示归一化的类型,可以有以下的取值:
---------------NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
---------------NORM_INF:此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)。
---------------NORM_L1:归一化数组的L1-范数(绝对值的和)。
---------------NORM_L2:归一化数组的(欧几里德)L2-范数。
参数6:有默认值为-1。dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype)。
参数7:操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。

e.g:

const int channels[1]={0};

cosnt int histsize[1]={256};

float pranges[2]={0,255};

const float* ranges[1]={pranges};

cv::MatND hist;//MatND是Mat的别名

cv::calcHist(&ImageGray,1,channels,cv::Mat(),hist,1,histsize,ranges);

int hist_w = 500;

int hist_h = 500;

int nHistSize = 255;

Mat histImage(hist_w ,hist_h ,CV_8UC3,cv::Scalar(0,0,0));

//将图像归一化到[0,histImage.rows]

normalize(hist,hist,0,histImage.rows,cv::NORM_MINMAX,-1,cv::Mat());

猜你喜欢

转载自blog.csdn.net/qq_35789421/article/details/88918955