计算C范数时,数组src将被进行比例变标,使其中绝对值最大的值等于a。当计算L1范数成L2范数时,该数组也将被缩放,如使其范数为a。如果norm_type的值设置为CV_MINMAX,那么将会对数组的所有的值进行转化,使它们线性映射到a和b之间(包括a和b)。
与以前一样,如果参数mask非空,那么只有与掩码非0值对应的像素会对范数的计算有贡献,并且只有那些像素会被cvNormalize()改变。
cvOr和cvOrS
- void cvOr(
- const CvArr* src1,
- const CvArr* src2,
- CvArr* dst,
- const CvArr* mask=NULL
- );
- void cvOrS(
- const CvArr* src,
- CvScalar value,
- CvArr* dst,
- const CvArr* mask = NULL
- );
这两个函数将对数组src1进行按位或计算。在函数cvOr()中,dst中的每一个元素都是是由src1和src2中相对应的元素按位做或运算的结果。在cvOrS()函数中,将对src和常量value进行或运算。像往常一样,如果mask非空,则只计算dst中与mask中非0元素对应的元素。
该函数支持所有的数据类型,但在cvOr()中,src1和src2必须有相同的数据类型。如果数组元素是浮点类型,则使用浮点按位表示形式。
cvReduce
- CvSize cvReduce(
- const CvArr* src,
- CvArr* dst,
- int dim,
- int op = CV_REDUCE_SUM
- );
约简是指使用一些op所代表的组合规则,对输入的矩阵src的每一行(或列)进行系统的转化,使之成为成向量dst,直到只剩一行(或列)为止(见表3-12)。 参数op决定如何进行约简,总结如表3-13所示。【71】
表3-12:参数op在cvReduce()中所代表的转化操作
op的值 | 结果 |
CV_REDUCE_SUM | 计算所有向量的总和 |
CV_REDUCE_AVG | 计算所有向量的平均值 |
CV_REDUCE_MAX | 计算所有向量中的最大值 |
CV_REDUCE_MIN | 计算所有向量中的最小值 |
表3-13:参数dim在cvReduce()中控制转化的方向
dim的值 | 结果 |
+1 | 合并成一行 |
0 | 合并成一列 |
-1 | 转化成对应的dst |
cvReduce()支持浮点型的多通道数组。它也允许在dst中使用比src更高精度的数据类型。这关键在于要有正确的CV_REDUCE_SUM和CV_REDUCE_AVG参数,否则那里可能有溢出和累积问题。
cvRepeat
- void cvRepeat(
- const CvArr* src,
- CvArr* dst
- );
这一函数是将src的内容复制到dst中,重复多次,直到dst没有多余的空间。具体而言,dst相对于src可以是任何大小。它可能比src大或小,它们在大小和维数之间不需要有任何的数值关系。
cvScale
- void cvScale(
- const CvArr* src,
- CvArr* dst,
- double scale
- );
从宏观上讲,函数cvScale()实际上是cvConvertScale()的一个宏,它会将shift参数设置为0.0。因此,它可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种。
cvSet 和 cvSetZero
- void cvSet(
- CvArr* arr,
- CvScalar value,
- const CvArr* mask = NULL
- );
【72】
这些函数能将数组的所有通道的所有值设置为指定的参数value。该cvSet()函数接受一个可选的参数:如果提供参数,那么只有那些与参数mask中非0值对应的像素将被设置为指定的值。函数cvSetZero()仅仅是cvSet(0.0)别名。
cvSetIdentity
- void cvSetIdentity( CvArr* arr );
cvSetIdentity()将会把数组中除了行数与列数相等以外的所有元素的值都设置为0;行数与列数相等的元素的值都设置为1。cvSetIdentity()支持所有数据类型,甚至不要求数组的行数与列数相等。
cvSolve
- int cvSolve(
- const CvArr* src1,
- const CvArr* src2,
- CvArr* dst,
- int method = CV_LU
- );
基于cvInvert()函数cvSolve()为求解线性方程组提供了一条捷径。它的计算公式如下:
C=argminx||A·X-B||
其中A是一个由src1指定的方阵,B是向量src2,然后C是由cvSolve()计算的结果,目标是寻找一个最优的向量X。最优结果向量X将返回给dst。cvInvert()支持同样的方法(前述);不过只支持浮点类型的数据。该函数将会返回一个整型值,当返回的值是一个非0值的话,这表明它能够找到一个解。
应当指出的是,cvSolve()可以用来解决超定的线性方程组。超定系统将使用所谓的伪逆方法进行解决,它是使用SVD方法找到方程组的最小二乘解的。
cvSplit
- void cvSplit(
- const CvArr* src,
- CvArr* dst0,
- CvArr* dst1,
- CvArr* dst2,
- CvArr* dst3
- );
有些时候处理多通道图像时不是很方便。在这种情况下,可以利用cvSplit()分别复制每个通道到多个单通道图像。如果需要,cvSplit()函数将复制src的各个通道到图像dst0,dst1,dst2和dst3中。目标图像必须与源图像在大小和数据类型上相匹配,当然也应该是单通道的图像。
如果源图像少于4个通道(这种情况经常出现),那么传递给cvSplit()的不必要的目标参数可设置为NULL。【73】
cvSub, cvSubS和cvSubRS
- void cvSub(
- const CvArr* src1,
- const CvArr* src2,
- CvArr* dst,
- const CvArr* mask = NULL
- );
- void cvSubS(
- const CvArr* src,
- CvScalar value,
- CvArr* dst,
- const CvArr* mask = NULL
- );
- void cvSubRS(
- const CvArr* src,
- CvScalar value,
- CvArr* dst,
- const CvArr* mask = NULL
- );