矩阵和图像操作(9)

cvSub()是一个简单的减法函数,它对数组src2和src1对应的元素进行减法运算,然后把结果赋给dst。如果数组mask非空,那么dst中元素对应位置的mask中的0元素不会因此而改变。相关的函数cvSubS()执行相类似的功能,但它会对src的每一个元素减去一个常量value。函数cvSubRS()的功能和cvSubS()相似,但不是src的每个元素减去一个常量,而是常量减去的src中的每一元素。

cvSum

 
 
  1. CvScalar cvSum(  
  2.     CvArr* arr  
  3. ); 

【75】

cvSum()计算数组arr各个通道的所有的像素的总和。注意,函数的返回类型是CvScalar,这意味着cvSum()提供多通道数组计算。在这种情况下,每个通道的和都会赋给类型为CvScalar的返回值中相应的分量。

cvSVD

 
 
  1. void cvSVD(  
  2.     CvArr* A,  
  3.     CvArr* W,  
  4.     CvArr* U     = NULL,  
  5.     CvArr* V     = NULL,  
  6.     int    flags = 0 
  7. ); 

奇异值分解(SVD)是将一个m×n的矩阵A按如下公式分解:

 

其中,W是一个对角矩阵,U和V分别是m×m和n×n的酉矩阵。当然,矩阵W也是一个m×n的矩阵,所以在这里的"对角线"是指任何行数和列数不相等的位置的元素值一定是0。因为W必须是对角矩阵,OpenCV允许它表示为一个m×n阶矩阵或一个n×1向量(在这种情况下,该向量将只包含对角线上的"奇异"值)。

对于函数cvSVD()来说,U和V是可选参数,如果它们的值设置为NULL,则不会返回它们的内容。最后的参数flags可以是表3-14所示三个选项中任何一个或全部(视情况进行布尔型或计算合并)。

表3-14:cvSVD()中flags参数的取值

参数

结果

CV_SVD_MODIFY_A

允许改变矩阵A

CV_SVD_U_T

返回UT而不是U

CV_SVD_V_T

返回VT而不是V

cvSVBkSb

 
 
  1. void cvSVBkSb(  
  2.     const CvArr* W,  
  3.     const CvArr* U,  
  4.     const CvArr* V,  
  5.     const CvArr* B,  
  6.     CvArr* X,  
  7.     int    flags = 0 
  8. );  

这个函数一般不会被直接调用。与刚才所描述的cvSVD()一起,本函数构成了基于SVD的方法cvInvert()和cvSolve()的基础。也就是说,如果你想自己实现矩阵求逆,可用这两个函数(这可以为你节省在cvInvert()或cvSolve()中为临时矩阵分配的一大堆内存空间)。【75】

函数cvSVBkSb()对矩阵A进行反向替代计算,A已分解为矩阵U,W和V(即SVD)的结构中描述出来。矩阵X的结果可由如下公式计算得出:

 

矩阵B是可选的,如果设置为NULL,它将会被忽略。当 时矩阵W*中的对角线元素定义如下:

 

ε这个值是一个奇异性阈值,一个非常小的数值,通常与W的对角线元素的总和成正比(即 )。

cvTrace

 
 
  1. CvScalar cvTrace( const CvArr* mat ); 

矩阵的迹是对角线元素的总和。在OpenCV中,该功能在函数cvGetDiag()基础上实现,因此输入的数组不需要是方阵。同样支持多通道数组,但是数组mat必须是浮点类型。

cvTranspose与cvT

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

cvTranspose()将src中每一个元素的值复制到dst中行号与列号相调换的位置上。这个函数不支持多通道数组;然而,如果你用两通道数组表示复数,那么记住一点:cvTranspose()不执行复共轭(依靠函数cvXorS()是实现该功能的一个快速方法,它可以直接翻转数组中虚数部分中的符号位)。宏cvT()是函数cvTranspose()的缩写。

cvXor和cvXorS

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

【76】

这两个函数在数组src1上按位进行异或(XOR)运算。在函数cvXor()中,dst的每个元素是由src1和src2中对应的元素按位进行异或运算所得到的。在函数cvXorS()中,是与常量value进行按位异或运算。再次说明,如果参数mask非空,则只计算与mask中非0值相对应的dst元素。

计算支持所有的数据类型,但src1和src2在函数cvXor()中必须是相同的数据类型。如果数组的元素是浮点类型的,那么使用浮点数的二进制表示。

cvZero

 
 
  1. void cvZero( CvArr* arr ); 

这个函数会将数组中的所有通道的所有元素的值都设置为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值