wordpress 获取头像地址,seo项目,南通做网站优化的公司,如何做自己个人网站直方图计算-split, calcHist, normalize 广义直方图示例目标分离通道计算直方图绘制计算结果归一化绘制 最终结果 广义直方图
直方图的横坐标除了可以是图片中的强度值#xff0c;也可以是任何其他我们想要观察的特征。例如#xff0c;下面的图片矩阵中包含了0-255的强度值也可以是任何其他我们想要观察的特征。例如下面的图片矩阵中包含了0-255的强度值 如果想观察每个宽度为16的强度值区间上的频数分布我们就可以将横坐标分成下面的区间 [ 0 , 255 ] [ 0 , 15 ] ∪ [ 16 , 31 ] ∪ . . . . . ∪ [ 240 , 255 ] r a n g e b i n 1 ∪ b i n 2 ∪ . . . . . ∪ b i n n 15 [0, 255] [0, 15] \cup [16, 31] \cup ..... \cup [240, 255] \\ range bin_1 \cup bin_2 \cup ..... \cup bin_{n15} [0,255][0,15]∪[16,31]∪.....∪[240,255]rangebin1∪bin2∪.....∪binn15 这样就可以得到类似于下图的直方图 直方图中的元素的定义如下
维数(dims)即想要观察的参数的数量比如上例中只观察灰度图中每个像素的强度值因此dims 1组数(bins)每个维度中的数据被分组的数量比如上例中分了16组区间所以bins 16全距(range)被观察的数据的总区间比如上例中range [0, 255]
如果你相观察的参数不止一个比如说2个即dims 2那就需要画一个3维的图了。
示例
目标
导入图片分离通道用split函数将图片分离为R, G, B3个矩阵数据计算直方图用calcHist函数对分离出来的3个矩阵分别计算直方图绘制计算结果
分离通道
split函数其原型如下
void cv::split( const Mat src,Mat* mvbegin)该函数将多通道的矩阵数组分成多个单通道的矩阵数组其中 src为要进行通道分离的原矩阵mvbegin为接收分离结果的数组的指针该数组的长度要和原矩阵的通道数相同 该函数还有以下更便利的重载版本第2个参数不再是指针而是多维数组
void cv::split( InputArray m,OutputArrayOfArrays mv)在本例中的应用如下
Mat src{ imread(lena.jpg) }; //导入图片vectorMat bgr_planes; //接收通道分离结果的向量
split(src, bgr_planes); //通道分离之后bgr_planes中的3个元素分别是b,g, r,3个通道的数据矩阵原图是 512 × 512 512 \times 512 512×512的3通道矩阵在VS调试中可以看到分离出来的结果bgr_planes中分别有3个元素而每个元素也是 512 × 512 512 \times 512 512×512的矩阵。 至此通道分离完成接下来对每个通道进行直方图计算。
计算直方图
计算直方图用的函数是calcHist该函数有3个版本这里选择比较常用的一个版本其原型如下
void cv::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 ) imagesconst Mat*类型可以是一个图片矩阵的指针也可以是图片矩阵的数组代表需要计算直方图的图片nimages第1个参数中包含的图片数量channelsconst int*类型可以是一个整数常量也可以是整数数组代表对应图片中需要进行计算的通道索引从0开始。如果数组的话也就是说有多张图片且每张图片中需要有多个通道被计算那么这个参数可能遵循以下写法 [ i m a g e s [ 0 ] . c h a n n e l s ( ) − 1 , i m a g e s [ 0 ] . c h a n n e l s ( ) , i m a g e s [ 0 ] . c h a n n e l s ( ) i m a g e s [ 1 ] . c h a n n e l s ( ) − 1 , . . . , ∑ i m a g e s [ n ] . c h a n n e l s ( ) ] [images[0].channels()-1, images[0].channels(), \\ images[0].channels()images[1].channels()-1, ... , \sum images[n].channels() ] [images[0].channels()−1,images[0].channels(),images[0].channels()images[1].channels()−1,...,∑images[n].channels()]mask可以不指定如果指定则其中的矩阵必须是与对应图片具有相同尺寸且是8位的数据类型从而给图片提供了一个掩码hist输出结果dims直方图的维数必须是正数且不能超过32histSize直方图每个维度的组数rangesconst float **类型所以必须是一个数组的住宿。代表直方图每个维度的全距如果是均匀分布的直方图那每个维度只需要提供最大值和最小值就行了即 m i n m a x {min max} minmax注意是左闭右开的区间如果不是均匀分布的直方图则需要提供每组的最小值及最后一组的最大值即KaTeX parse error: Expected }, got EOF at end of input: …{histSize[i]-1}uniform是否为均匀分布accumulate是否允许覆盖即不清除之前的直方图 该函数也有其他重载版本参数即原理基本与上述版本相同这里就不赘述了。 乍一看这个函数非常复杂事实也确实如此。但是在本例中因为我们将一个3通道的矩阵分离成3个单通道的矩阵然后分别对它们进行计算所以事情就变得相对简单了。我们直接看代码和注释吧
int histSize{ 256 }; //定义直方图中的组数为256即每个强度值一组//定义直方图中的全距
float range[]{ 0, 256 }; //表示全距的区间左闭右开
const float* histRange[]{ range }; //由于直方图只有一个维度所以数组只有一个元素bool uniform{ true }; //均匀分布
bool accumulate{ false }; //不允许覆盖Mat b_hist, g_hist, r_hist; //接收计算结果的矩阵
//b通道的直方图计算
calcHist(bgr_planes[0], //b通道矩阵因为形参是指针类型所以要加取址符1, //只有b通道一个矩阵相当于只有一张图片所以nimages 10, //矩阵中只有一个通道所以只有一个通道索引且从0开始channels 0Mat(), //空矩阵代表不使用掩码b_hist, //接收计算结果的矩阵1, //直方图只有一个维度即b的强度值的频数分布dims 1histSize, //直方图的组数因为是指针类型所以要加取址符histRange, //直方图的全距因为这里只有1个维度、1个矩阵所以该数组包含一个区间uniform, //均匀分布accumulate); //不允许覆盖
//g通道的直方图计算
calcHist(bgr_planes[1], 1, 0, Mat(), g_hist, 1, histSize, histRange, uniform, accumulate);
//r通道的直方图计算
calcHist(bgr_planes[2], 1, 0, Mat(), r_hist, 1, histSize, histRange, uniform, accumulate);对于单通道的矩阵来说很多需要传入数组的形参只要传入字面量就行了所以简化了很多。 在Image watch中查看计算结果 可以看到每个通道的计算结果都是 1 × 256 1 \times 256 1×256的矩阵代表原图中每个通道上从0到255这256个强度值的频数。
绘制计算结果
归一化
在绘制直方图的之前需要对数据进行归一化从而使数据的值域能够适应直方图尺寸。这就要用到normalize函数其原型如下
void cv::normalize( InputArray src,InputOutputArray dst,double alpha 1,double beta 0,int norm_type NORM_L2,int dtype -1,InputArray maxk noArray())alpha值域归一化中的值域最小值beta值域归一化中的值域最大值norm_type归一化类型dtype输出矩阵的数据类型默认为-1即与原矩阵保持一致mask掩码矩阵可选 这里我们定义的直方图的尺寸是 512 × 400 512 \times 400 512×400而直方图的计算结果肯定会有超出512的数值所以必须进行归一化处理
int hist_w{ 512 }, hist_h{ 400 }; //直方图的长和宽Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0)); //用来绘制直方图的图片//对直方图计算结果进行归一化处理
normalize(b_hist, b_hist,0, //归一化之后值域的最小值 alpha 0histImage.rows, //归一化之后值域的最大值 alpha 400NORM_MINMAX, //归一化类型-1, //输出结果类型与原矩阵一致Mat()); //空矩阵代表不是用掩码
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());归一化之后3个通道的计算结果的值域都在0到400之间。
绘制
绘制直方图的基本思路是将每个通道中的计算结果频数结果转换成点的坐标横坐标为强度值纵坐标为结果值即频数然后将每个点和前一个点进行连线最后组成一条完整的折线。具体实现方法如下
int bin_w{ cvRound(static_castdouble(hist_w / histSize)) }; //每组的宽度即组距
for (int i{ 1 }; i histSize; i) {line(histImage,//前一个点Point(bin_w * (i - 1), hist_h - cvRound(b_hist.atfloat(i - 1))),//当前点注意原点在图的左上角Point(bin_w * (i), //组距X当前索引当前点的横坐标hist_h - cvRound(b_hist.atfloat(i))), //图的高度-当前的频数值当前点的纵坐标Scalar(255, 0, 0), 2, 8, 0);line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(g_hist.atfloat(i - 1))),Point(bin_w * (i), hist_h - cvRound(g_hist.atfloat(i))),Scalar(0, 255, 0), 2, 8, 0);line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(r_hist.atfloat(i - 1))),Point(bin_w * (i), hist_h - cvRound(r_hist.atfloat(i))),Scalar(0, 0, 255), 2, 8, 0);
}最终结果 右边就是左图的直方图计算结果。横坐标是0-255的每个强度值纵坐标分别为R, G, B3个通道的强度值频数。 文章转载自: http://www.morning.knmp.cn.gov.cn.knmp.cn http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn http://www.morning.cwgn.cn.gov.cn.cwgn.cn http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn http://www.morning.rzcbk.cn.gov.cn.rzcbk.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.qwmpn.cn.gov.cn.qwmpn.cn http://www.morning.lctrz.cn.gov.cn.lctrz.cn http://www.morning.swkzr.cn.gov.cn.swkzr.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.dpruuode.cn.gov.cn.dpruuode.cn http://www.morning.pqqzd.cn.gov.cn.pqqzd.cn http://www.morning.rpwm.cn.gov.cn.rpwm.cn http://www.morning.fkwp.cn.gov.cn.fkwp.cn http://www.morning.zfhwm.cn.gov.cn.zfhwm.cn http://www.morning.bqfpm.cn.gov.cn.bqfpm.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.ryywf.cn.gov.cn.ryywf.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.mnwmj.cn.gov.cn.mnwmj.cn http://www.morning.sgtq.cn.gov.cn.sgtq.cn http://www.morning.rtlg.cn.gov.cn.rtlg.cn http://www.morning.wffxr.cn.gov.cn.wffxr.cn http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.nsppc.cn.gov.cn.nsppc.cn http://www.morning.wblpn.cn.gov.cn.wblpn.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.xmttd.cn.gov.cn.xmttd.cn http://www.morning.tlyms.cn.gov.cn.tlyms.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.bxqtq.cn.gov.cn.bxqtq.cn http://www.morning.rytps.cn.gov.cn.rytps.cn http://www.morning.pnmgr.cn.gov.cn.pnmgr.cn http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.lnbcg.cn.gov.cn.lnbcg.cn http://www.morning.rhfbl.cn.gov.cn.rhfbl.cn http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn http://www.morning.mhnxs.cn.gov.cn.mhnxs.cn http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn http://www.morning.yqwsd.cn.gov.cn.yqwsd.cn http://www.morning.nmfxs.cn.gov.cn.nmfxs.cn http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.ybyln.cn.gov.cn.ybyln.cn http://www.morning.sggzr.cn.gov.cn.sggzr.cn http://www.morning.jtfsd.cn.gov.cn.jtfsd.cn http://www.morning.zxfdq.cn.gov.cn.zxfdq.cn http://www.morning.qpsdq.cn.gov.cn.qpsdq.cn http://www.morning.horihe.com.gov.cn.horihe.com http://www.morning.mldrd.cn.gov.cn.mldrd.cn http://www.morning.rbjp.cn.gov.cn.rbjp.cn http://www.morning.brsgw.cn.gov.cn.brsgw.cn http://www.morning.dfltx.cn.gov.cn.dfltx.cn http://www.morning.yesidu.com.gov.cn.yesidu.com http://www.morning.pmwhj.cn.gov.cn.pmwhj.cn http://www.morning.mytmn.cn.gov.cn.mytmn.cn http://www.morning.ysskn.cn.gov.cn.ysskn.cn http://www.morning.pzbjy.cn.gov.cn.pzbjy.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.mjats.com.gov.cn.mjats.com http://www.morning.ttxnj.cn.gov.cn.ttxnj.cn http://www.morning.gqwpl.cn.gov.cn.gqwpl.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.qckwj.cn.gov.cn.qckwj.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn http://www.morning.tbkqs.cn.gov.cn.tbkqs.cn http://www.morning.wwkdh.cn.gov.cn.wwkdh.cn http://www.morning.syhwc.cn.gov.cn.syhwc.cn http://www.morning.wwsgl.com.gov.cn.wwsgl.com http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.wfqcs.cn.gov.cn.wfqcs.cn