现在的位置: 首页 > 综合 > 正文

矩阵和图像操作(8)

2013年05月14日 ⁄ 综合 ⁄ 共 3143字 ⁄ 字号 评论关闭

计算C范数时,数组src将被进行比例变标,使其中绝对值最大的值等于a。当计算L1范数成L2范数时,该数组也将被缩放,如使其范数为a。如果norm_type的值设置为CV_MINMAX,那么将会对数组的所有的值进行转化,使它们线性映射到a和b之间(包括a和b)。

与以前一样,如果参数mask非空,那么只有与掩码非0值对应的像素会对范数的计算有贡献,并且只有那些像素会被cvNormalize()改变。

cvOr和cvOrS

  1. void cvOr(  
  2.     const CvArr*    src1,  
  3.     const CvArr*    src2,  
  4.     CvArr*          dst,  
  5.     const CvArr* mask=NULL 
  6. );  
  7. void cvOrS(  
  8.     const CvArr*    src,  
  9.     CvScalar        value,  
  10.     CvArr*          dst,  
  11.     const CvArr*    mask  = NULL 
  12. ); 

这两个函数将对数组src1进行按位或计算。在函数cvOr()中,dst中的每一个元素都是是由src1和src2中相对应的元素按位做或运算的结果。在cvOrS()函数中,将对src和常量value进行或运算。像往常一样,如果mask非空,则只计算dst中与mask中非0元素对应的元素。

该函数支持所有的数据类型,但在cvOr()中,src1和src2必须有相同的数据类型。如果数组元素是浮点类型,则使用浮点按位表示形式。

cvReduce

  1. CvSize cvReduce(  
  2.     const CvArr*    src,  
  3.     CvArr*          dst,  
  4.     int                 dim,  
  5.     int                 op = CV_REDUCE_SUM 
  6. ); 

约简是指使用一些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

  1. void cvRepeat(  
  2.     const CvArr*    src,  
  3.     CvArr*          dst  
  4. ); 

这一函数是将src的内容复制到dst中,重复多次,直到dst没有多余的空间。具体而言,dst相对于src可以是任何大小。它可能比src大或小,它们在大小和维数之间不需要有任何的数值关系。

cvScale

  1. void cvScale(  
  2.     const CvArr*    src,  
  3.     CvArr*          dst,  
  4.     double          scale  
  5. ); 

从宏观上讲,函数cvScale()实际上是cvConvertScale()的一个宏,它会将shift参数设置为0.0。因此,它可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种。

cvSet 和 cvSetZero

  1. void cvSet(  
  2.     CvArr*          arr,  
  3.     CvScalar        value,  
  4.     const CvArr*    mask   = NULL 
  5. ); 

【72】

这些函数能将数组的所有通道的所有值设置为指定的参数value。该cvSet()函数接受一个可选的参数:如果提供参数,那么只有那些与参数mask中非0值对应的像素将被设置为指定的值。函数cvSetZero()仅仅是cvSet(0.0)别名。

cvSetIdentity

  1. void cvSetIdentity( CvArr* arr ); 

cvSetIdentity()将会把数组中除了行数与列数相等以外的所有元素的值都设置为0;行数与列数相等的元素的值都设置为1。cvSetIdentity()支持所有数据类型,甚至不要求数组的行数与列数相等。

cvSolve

  1. int cvSolve(  
  2.     const CvArr*    src1,  
  3.     const CvArr*    src2,  
  4.     CvArr*          dst,  
  5.     int                 method = CV_LU 
  6. ); 

基于cvInvert()函数cvSolve()为求解线性方程组提供了一条捷径。它的计算公式如下:

C=argminx||A·X-B||

其中A是一个由src1指定的方阵,B是向量src2,然后C是由cvSolve()计算的结果,目标是寻找一个最优的向量X。最优结果向量X将返回给dst。cvInvert()支持同样的方法(前述);不过只支持浮点类型的数据。该函数将会返回一个整型值,当返回的值是一个非0值的话,这表明它能够找到一个解。

应当指出的是,cvSolve()可以用来解决超定的线性方程组。超定系统将使用所谓的伪逆方法进行解决,它是使用SVD方法找到方程组的最小二乘解的。

cvSplit

  1. void cvSplit(  
  2.     const CvArr*    src,  
  3.     CvArr*          dst0,  
  4.     CvArr*          dst1,  
  5.     CvArr*          dst2,  
  6.  
  7.     CvArr*          dst3  
  8. ); 

有些时候处理多通道图像时不是很方便。在这种情况下,可以利用cvSplit()分别复制每个通道到多个单通道图像。如果需要,cvSplit()函数将复制src的各个通道到图像dst0,dst1,dst2和dst3中。目标图像必须与源图像在大小和数据类型上相匹配,当然也应该是单通道的图像。

如果源图像少于4个通道(这种情况经常出现),那么传递给cvSplit()的不必要的目标参数可设置为NULL。【73】

cvSub, cvSubS和cvSubRS

  1. void cvSub(  
  2.     const CvArr*    src1,  
  3.     const CvArr*    src2,  
  4.     CvArr*          dst,  
  5.     const CvArr*    mask  = NULL 
  6. );  
  7. void cvSubS(  
  8.     const CvArr*    src,  
  9.     CvScalar        value,  
  10.     CvArr*          dst,  
  11.     const CvArr*    mask  = NULL 
  12. );  
  13. void cvSubRS(  
  14.     const CvArr*    src,  
  15.     CvScalar        value,  
  16.     CvArr*              dst,  
  17.     const CvArr*    mask  = NULL 
  18. ); 

抱歉!评论已关闭.