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

矩阵和图像操作(7)

2013年01月22日 ⁄ 综合 ⁄ 共 2451字 ⁄ 字号 评论关闭

cvMerge

  1. void cvMerge(  
  2.     const CvArr* src0,  
  3.     const CvArr* src1,  
  4.     const CvArr* src2,  
  5.     const CvArr* src3,  
  6.     CvArr* dst  
  7. ); 

【67】

cvMerge()是cvSplit()的逆运算。数组src0,src1,src2,和src3将被合并到数组dst中。当然,dst应该与源数组具有相同的数据类型和尺寸,但它可以有两个,三个或四个道道。未使用的源图像参数可设置为NULL。

cvMin和cvMinS

  1. void cvMin(  
  2.     const CvArr* src1,  
  3.     const CvArr* src2,  
  4.     CvArr* dst  
  5. );  
  6. void cvMinS(  
  7.     const CvArr* src,  
  8.     double value,  
  9.     CvArr* dst  
  10. ); 

cvMin()计算数组src1和src2中相对应的每一对像素中的最小值。而cvMaxS(),将数组src与常量标量value进行比较。同样的,如果mask非空的话,那么只有与mask的非0参数相对应的dst中的元素进行计算。

cvMinMaxLoc

  1. void cvMinMaxLoc(  
  2.     const CvArr* arr,  
  3.     double*      min_val,  
  4.  
  5.  
  6.  
  7.     double*      max_val,  
  8.     CvPoint*     min_loc = NULL,  
  9.     CvPoint*     max_loc = NULL,  
  10.     const CvArr* mask    = NULL 
  11. ); 

该例程找出数组arr中的最大值和最小值,并且(有选择性地)返回它们的地址。计算出的最大值和最小值赋值给max_val和min_val。或者,如果极值的位置参数非空,那极值的位置便会写入min_loc和max_loc。

通常,如果参数mask非空,那么只有图像arr中与参数mask中的非零的像素相对应的部分才被考虑。cvMinMaxLoc()例程仅仅处理单通道数组,如果有一个多通道的数组,则应该使用cvSetCOI()来对某个特定通道进行设置。

cvMul

  1. void cvMul(  
  2.     const CvArr* src1,  
  3.     const CvArr* src2,  
  4.     CvArr* dst,  
  5.     double scale=1 
  6. ); 

【68】

cvMul()是一个简单的乘法函数。它将src1中的元素与src2中相对应的元素相乘,然后把结果赋给dst。如果mask是空,那么与其中0元素相对应的dst元素都不会因此操作而改变。OpenCV中没有函数cvMulS(),因为该功能已经由函数cvScale()或cvCvtScale()提供。

除此之外,有一件事情要记住:cvMul()执行的是元素之间的乘法。有时候,在进行矩阵相乘时,可能会错误使用cvMul(),但这无法奏效;记住,cvGEMM()才是处理矩阵乘法的函数,而不是cvMul()。

cvNot

  1. void cvNot(  
  2.     const CvArr* src,  
  3.  
  4.  
  5.  
  6.     CvArr*       dst  
  7. ); 

函数cvNot()会将src中的每一个元素的每一位取反,然后把结果赋给dst。因此,一个值为0x00的8位图像将被映射到0xff,而值为0x83的图像将被映射到0x7c。

cvNorm

  1. double cvNorm(  
  2.     const CvArr* arr1,  
  3.     const CvArr* arr2  = NULL,  
  4.     int  norm_type = CV_L2,  
  5.     const CvArr* mask  = NULL 
  6.     ); 

这一函数可于计算一个数组的各种范数,当为该函数提供了两个数组作为参数时,可选用各种不同的公式来计算相对的距离。在前一种情况下,计算的范数如表3-9所示。

表3-9:当arr2 =NULL时,对于不同的norm_type由cvNorm()计算范数的公式

norm_type

结果

CV_C

CV_L1

CV_L2

如果第二个数组参数arr2非空,那么范数的计算将使用不同的公式,就像两个数组之间的距离。 前三种情况的计算公式如表3-10所示,这些范数是绝对范数;在后三个情况下,将会根据第二个数组arr2的幅度进行重新调整。【69~70】

表3-10:arr2非空,且norm_type不同值时函数cvNorm()计算范数的计算公式

norm_type

结果

CV_C

CV_L1

CV_L2

CV_RELATIVE_C

CV_ RELATIVE_L1

CV_ RELATIVE_L2

在所有情况下,arr1和arr2必须具有相同的大小和通道数。当通道数大于1时,将会对所有通道一起计算范数(即是说,在表3-9和表3-10中,不仅是针对x和y,也针对通道数求和)。

cvNormalize

  1. cvNormalize(  
  2.     const CvArr*    src,  
  3.     CvArr*          dst,  
  4.     double          a           = 1.0,  
  5.     double              b           = 0.0,  
  6.     int                 norm_type   = CV_L2,  
  7.     const CvArr*    mask        = NULL 
  8. ); 

与许多OpenCV函数一样,cvNormalize()的功能比表面看更多。根据norm_type的不同值,图像src将被规范化,或者以其他方式映射到dst的一个特定的范围内。表3-11列举了norm_type可能出现的值。

表3-11:函数cvNormalize()的参数norm_type可能的值

 

续表

 

抱歉!评论已关闭.