calcHist函数的channels参数和narrays以及dims共同来确定用于计算直方图的图像;
首先dims是最终的直方图维数,narrays指出了arrays数组中图像的个数,其中每一幅图像都可以是任意通道的【只要最终dims不超过32即可】
Channels为图像通道数,rgb为三个通道也就是2(012),
如果channels参数为0,则narrays和dims必须相等,否则弹出assert,此时计算直方图的时候取数组中每幅图像的第0通道。
当channels不是0的时候,用于计算直方图的图像是arrays中由channels指定的通道的图像,channels与arrays中的图像的对应关系,如channels的参数说明的,将arrays中的图像从第0幅开始按照通道摊开排列起来,然后channels中的指定的用于计算直方图的就是这些摊开的通道;
意思是本来index=r*256*256+g*256+b
顺序为rgb(opencv为bgr,所以应该为2 1 0)
假设有arrays中只有一幅三通道的图像image,那么narrays应该为1,如果是想计算3维直方图【最大也只能是3维的】,想将image的通道2作为第一维,通道0作为第二维,通道1作为第三维,则可以将channels设置为channesl={2,0,1};这样calcHist函数计算时就按照这个顺序来统计直方图。
可以看出channels不为0时narrays可以和dims不相等,只要保证arrays中至少有channels指定的通道就可以。
Opencv 计算直方图主要在函数calcHist_8u里面,而其中又有一个重要的函数
calcHistLookupTables_8u()。他会计算出_tab[],这个数组表示每个数应该处于的位置index。比如1 2 3 4 5 6 ;均匀3个size的直方图,那么1 2的index=0,3 4的index=1;5 6的index=2;直接通过hist[index[image[I,j]]]即可得到直方图,大大的加快了速度,
对于多维情况同样如此,二维计算方法应该是ima