tutorial_code\Histograms_Matching\calcBackProject_Demo1.cpp
void mixChannels (constMat* src , int nsrc ,Mat* dst , int ndst , constint* fromTo , size_t npairs );
从输入中拷贝某通道到输出中特定的通道。
src——输入矩阵,可以为一个也可以为多个,但是矩阵必须有相同的大小和深度.
nsrcs——输入矩阵的个数。
dst——输出矩阵,可以为一个也可以为多个,但是所有的矩阵必须事先分配空间(如用create),大小和深度须与输入矩阵等同.
ndsts——输出矩阵的个数。
fromTo——设置输入矩阵的通道对应输出矩阵的通道,规则如下:
首先用数字标记输入矩阵的各个通道。输入矩阵个数可能多于一个并且每个矩阵的通道可能不一样,第一个输入矩阵的通道标记范围为:0 ~ src[0].channels()-1,第二个输入矩阵的通道标记范围为:src[0].channels()~src[0].channels()+src[1].channels()-1,以此类推;
其次输出矩阵也用同样的规则标记,第一个输出矩阵的通道标记范围为:0 ~ dst[0].channels()-1,第二个输入矩阵的通道标记范围为:dst[0].channels()~ dst[0].channels()+dst[1].channels()-1,以此类推;
最后,数组fromTo的第一个元素即fromTo[0]应该填入输入矩阵的某个通道标记,而fromTo的第二个元素即fromTo[1]应该填入输出矩阵的某个通道标记,这样函数就会把输入矩阵的fromTo[0]通道里面的数据复制给输出矩阵的fromTo[1]通道。fromTo后面的元素也是这个道理,总之就是一个输入矩阵的通道标记后面必须跟着个输出矩阵的通道标记。
npairs——即参数fromTo中的有几组输入输出通道关系,其实就是参数fromTo的数组元素个数除以2.
Mat与MatND
简单的说,Mat特指2维矩阵,MatND是多维矩阵(>=3维);
Mat对象提供了size()、channels()和depth()等方法分别获得图像的大小、通道数和数值类型。上面的例子中,图像img的宽为512个像素,高为393个像素,有3个通道(channels),即图像中的每个像素的颜色用三个数值表示。每个通道的数值类型(depth)的编号为0,0表示无符号8bit整数。
MatND对象使用size和step属性保存每个轴的长度和每个轴的字节偏移量,它们和NumPy数组的shape和strides属性类似。但是这两个属性都是长度固定为32的整数数组。
void calcHist(constMat* images, int nimages, const int* channels,InputArray mask, OutputArray hist, int dims, constint* histSize, const float** ranges, bool uniform=true,bool accumulate=false )
计算图像直方图
onst Mat* images:输入图像
int nimages:输入图像的个数
const int* channels:需要统计直方图的第几通道
InputArray mask:掩膜,,计算掩膜内的直方图 ...Mat()
OutputArray hist:输出的直方图数组
int dims:需要统计直方图通道的个数
const int* histSize:指的是直方图分成多少个区间,,,就是 bin的个数
const float** ranges: 统计像素值得区间
bool uniform=true::是否对得到的直方图数组进行归一化处理
bool accumulate=false:在多个图像时,是否累计计算像素值得个数
void normalize(InputArray src,OutputArray dst,double alpha=1, doublebeta=0, int norm_type=NORM_L2,int dtype=-1, InputArray mask=noArray() )
归一化输入数组
src 输入数组
dst 输出数组,支持原地运算
alpha range normalization模式的最小值
beta range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
normType 归一化的类型,可以有以下的取值:
NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
NORM_L1 : 归一化数组的L1-范数(绝对值的和)
NORM_L2: 归一化数组的(欧几里德)L2-范数
Dtype dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).
mask 操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。
calcBackProject(&hue, a, b, hist, backproj, &ranges, 1, true );
a 源图像的数目
b 用于计算反向投影值的通道列表
hist 输入直方图
backproj 单通道反向投影图像
&ranges 每一维直方图bin的范围
绘制图像直方图
int w = 400; int h = 400;
int bin_w = cvRound( (double) w / histSize );
Mat histImg = Mat::zeros( w, h, CV_8UC3 );
for( int i = 0; i < bins; i ++ )
{ rectangle( histImg, Point( i*bin_w, h ), Point( (i+1)*bin_w, h - cvRound( hist.at<float>(i)*h/255.0 ) ), Scalar( 0, 0, 255 ), -1 ); }
imshow( "Histogram", histImg );