原文:http://blog.csdn.net/Dr_Neo/article/details/44107269

(1)基本运算

两图像相加:

add(InputArray src1,InputArray src2, OutputArray dst, InputArray mask=noArray(),int dtype=-1):如可用add(A,B,C)来计算C=A+B;如果指定了图像掩模mask(注:mask必须为单通道),则运算只在mask对应像素部位null的像素上进行,add(A,B,C,mask)意为if(mask[i]0)c[i]=a[i]+b[i];

addWeighted(InputArray src1,double alpha, InputArray src2, double beta, double gamma,OutputArraydst, int dtype=-1):计算加权和,如addWeighted(A,k1,B,k2,k3,C)表示C=k1*A+k2*B+k3;

scaleAdd(A,k1,B,C)表示C=k1*A+B

减:subtract(A,B,C)表示C=A-B

乘:mutiply(A,B,C,k)表示C=k*A*B

divide(InputArray src1,InputArray src2, OutputArray dst, double scale=1,int dtype=-1):除法,divide(A,B,C,k)表示C=(A*k/B);也可以直接用一个scale来除以array,divide(k,B,C)表示C=k/B

当然还有其他计算符,如log()、exp()

位运算:

bitwise_and(InputArray src1,InputArray src2, OutputArray dst, InputArray mask=noArray()):按位与,bitwise_and(A,B,C,mask)表示if(mask[i])a[i]^b[i]=c[i]

bitwise_not(A,B,mask):按位非,b[i] =~a[i]

bitwise_or(A,B,C):按位或,C=AB

bitewise_xor(A,B,C):按位异或,C=AB

此处需要注意的是,所有这些运算都会调用cv::saturate_cast函数来进行截断操作,以保证输出像素值都在合理的范围之内。另外,OpenCV对c++的很多操作符都进行了重载,所以可以直接使用运算符+,=,*,/,&,|,~,^,<,>等来对图像矩阵进行操作,矩阵求逆m.inv(),矩阵转置m.t(),行列式m.determinant(),向量模v.norm(),向量叉乘v1.cross(v2),向量点积v1.dot(v2)

(2)矩阵操作

calcCovarMatrix():计算协方差矩阵

invert(InputArray src,OutputArray dst, int flags=DECOMP_LU):求逆矩阵

sqrt(InputArray src,OutputArray dst):计算平方根

求绝对值:

abs(const Mat& m):求绝对值,输入参数可是矩阵也可是表达式,如:C=abs(A),C=abs(A-B)

absdiff(InputArray src1,InputArray src2, OutputArray dst):absdiff(A,B,C)等价于C=abs(A-B)

cartToPolar(InputArray x, InputArray y,OutputArray magnitude, OutputArray angle, boolangleInDegrees=false):计算二维矢量的幅值和向角

dct(InputArray src,OutputArray dst, int flags=0):离散余弦变换

dft(InputArray src,OutputArray dst, int flags=0, int nonzeroRows=0):离散傅里叶变换

flip(InputArray src,OutputArray dst, int flipCode):对图像进行翻转,flipCode>0,进行垂直翻转;flipCode=0,进行水平翻转;flipCode<0,同时进行水平、垂直翻转;

(3)比较操作

CheckRange():用来判断输入array中的每个元素是否都处于某一范围内

compare(InputArray A, InputArray B,OutputArray C, int cmpop):根据参数cmpop的值来决定A和B比较的方式,其值有CMP_EQ,CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE,结果输出为C;

min():如C=min(A,B)表示c[i]=min(a[i],b[i])

max():与min()类似

注意,此处所有函数在调用时都要加上命名空间cv::

opencv里面,基本上矩阵、向量能想到的操作都有相对应的函数,非常之多,在此不能一一列出,具体的在opencv的online documentation里面都有。建议大家在实际编程时,遇到跟矩阵相关的运算、操作时都先去查阅一下opencv的online documentation,要是里面有现成的函数就可以直接调用了,没有的再去自己想办法写。有关矩阵操作符的库函数主要集中在opencv_core模块中。

今天用到opencv求解矩阵的协方差矩阵,无意中发现了一个问题,写出来供大家参考。

[cpp] view plaincopy
  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std;
  4. using namespace cv;
  5. void displayMat(Mat& mat)
  6. {
  7. for (int i = 0;i<mat.rows;i++)
  8. {
  9. for (int j = 0;j<mat.cols ;j++)
  10. {
  11. printf("%f  ",mat.at<double>(i,j));
  12. }
  13. printf("\n");
  14. }
  15. }
  16. int main()
  17. {
  18. double data[5][4] = { 1, 2, 3 , 4 ,
  19. 5, 6, 7 , 8 ,
  20. 9, 0, 1 , 3 ,
  21. 2, 4, 6 , 8 ,
  22. 1, 3, 5 , 9
  23. };
  24. Mat mat(5,4,CV_64FC1) ;
  25. for (int i =0;i<mat.rows;i++)
  26. {
  27. for (int j = 0;j<mat.cols ;j++)
  28. {
  29. mat.at<double>(i,j) = data[i][j];
  30. }
  31. }
  32. Mat covMat;
  33. Mat meanMat;
  34. calcCovarMatrix(mat,covMat,meanMat,CV_COVAR_NORMAL|CV_COVAR_ROWS);
  35. cout<<"cov:"<<endl;
  36. //打印矩阵
  37. displayMat(covMat);
  38. cout<<"mean:"<<endl;
  39. displayMat(meanMat);
  40. return 0;
  41. }

实验结果:

[cpp] view plaincopy
  1. cov:
  2. 47.200000  -11.000000  -15.200000  -19.200000
  3. -11.000000  20.000000  21.000000  19.000000
  4. -15.200000  21.000000  23.200000  23.200000
  5. -19.200000  19.000000  23.200000  29.200000
  6. mean:
  7. 3.600000  3.000000  4.400000  6.400000

只看这个结果你肯定不会发现任何问题,下面让我们看看matlab中的结果

[cpp] view plaincopy
  1. data=[1, 2, 3 , 4;
  2. 5, 6, 7 , 8;
  3. 9, 0, 1 , 3;
  4. 2, 4, 6 , 8;
  5. 1, 3, 5 , 9 ];
  6. >> cov(data)
  7. ans =
  8. 11.8000   -2.7500   -3.8000   -4.8000
  9. -2.7500    5.0000    5.2500    4.7500
  10. -3.8000    5.2500    5.8000    5.8000
  11. -4.8000    4.7500    5.8000    7.3000
  12. >> cov(data)*4
  13. ans =
  14. 47.2000  -11.0000  -15.2000  -19.2000
  15. -11.0000   20.0000   21.0000   19.0000
  16. -15.2000   21.0000   23.2000   23.2000
  17. -19.2000   19.0000   23.2000   29.2000

这次你肯定会发现问题了,是的,OpenCV中求得的协方差矩阵要比matlab中的大4倍!

经过我多次实验的出结论:opencv中求得的协方差矩阵比matlab中的大(n-1)倍!(n是矩阵的行数)

不知道是什么原因,有知道的大神可以说一下。

openCV 图像相加,位运算,协方差,绝对值,比较相关推荐

  1. c通过位运算求绝对值_初中数学归类总结(四)有理数的乘除乘方及混合运算...

    学习了有理数的加减运算以后,再来进行有理数的乘除,就比较容易理解和运算了. 首先我们来看有理数的乘法法则:两数相乘,同号得正,异号得负,并把绝对值相乘:任何数与零相乘,积仍为0.有理数乘法法则和有理数 ...

  2. 【OpenCV 例程200篇】20. 图像的按位运算

    [OpenCV 例程200篇]20. 图像的按位运算 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 函数 cv2.b ...

  3. 【OpenCV 例程200篇】20. 图像的按位运算(cv2.bitwise)

    专栏地址:『youcans 的 OpenCV 例程 200 篇』 文章目录:『youcans 的 OpenCV 例程200篇 - 总目录』 [youcans 的 OpenCV 例程200篇]20. 图 ...

  4. OpenCV笔记之六(3)——图像处理之图像位运算与图像掩膜

    3.图像位运算 位运算在图像处理,特别是掩膜中有着极其重要的作用,主要有与.或.异或以及非等操作. Operation Function AND cv2.bitwise_and OR cv2.bitw ...

  5. OpenCV:03图像的算数运算

    文章目录 掩膜 图像的算数运算 加法运算 利用掩膜遮盖相加结果 减法运算 乘法运算 除法运算 图片的融合 OpenCV的逻辑运算(位运算) 与运算`&` 花图像与十字掩膜做`与运算` 或运算` ...

  6. 【CV 向】了解 OpenCV 中的算术与位运算

    文章目录 引言 1. 利用 NumPy 创建图像 2. 算术运算 2.1 加法与减法 2.2 乘法与除法 3. 位运算 3.1 与运算 3.2 或运算 3.3 异或运算 3.4 非运算 结论 引言 P ...

  7. python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

    问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...

  8. 【OpenCV图像处理】一、图像相加、相减、相乘与相除的实现【转载】

    看完了数字图像处理后,从头开始使用opencv进行相关内容的实现,使用的环境是VS2013+OpenCV2.4.9. 1.图像相加 加运算就是两幅图像对应像素的灰度值或彩色分量进行相加.主要有两种用途 ...

  9. 小强学Python+OpenCV之-1.4.4掩膜mask及位运算

    原文:http://blog.csdn.net/eric_pycv/article/details/72887748 问题引入 在1.4.3裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁 ...

最新文章

  1. 深度学习中GPU和显存分析
  2. visual studio内置“iis”组件提取及二次开发
  3. 使用Spring2.5的Autowired实现注释型的IOC(转载)
  4. WebSocket-java实现
  5. Qt::Key_Return和Qt::Key_Enter区别
  6. .NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码
  7. How to uninstall Internet Explorer 7
  8. 计算机领域数据集下载链接
  9. PHP 快速解决跨域问题
  10. 大地测量学基础 | 时间系统
  11. java消除噪声数据,高光谱图像去噪相关资源汇总(常用对比算法+数据集+评价指标)...
  12. mysql将数字月份替换成文月份_mysql必知必会--使用数据处理函数
  13. 项目管理有妙招,看懂你的项目健康状态和完整度
  14. 家长会计算机教师致辞,家长会教师致辞最新
  15. 【初识数据结构】手把手教会你时间复杂度的计算方法
  16. 学习新的计算机语言的方法
  17. iOS NSDate与NSTimeInterval之间的互转
  18. OpenCV学习常用网址
  19. ibm服务器如何查看内存型号,ibmx3650m4不识别|认不出内存怎么办|内存安装规则要求...
  20. error: void value not ignored as it ought to be

热门文章

  1. Linux系统时间和时序,什么是时序竞态 Linux系统时序竞态问题分析
  2. 9型转x型 cobol_【科研模型100例32】A型/X型分子筛
  3. 电源上的sense什么意思_冷知识:电源开关上的这两个标识有什么含义?
  4. 微信小程序python自动化测试_微信小程序的自动化测试框架
  5. php邮件通知,邮件通知设置
  6. word文档无法连接服务器,sql数据库无法连接服务器解决办法绝对有效
  7. IDEA注释模板,动作要快,姿势要帅!
  8. 不想 CRUD 干到老,就来看看这篇 OOM 排查的实战案例!
  9. 前瞻:Spring Boot 2.4.0 第二个里程碑版本发布
  10. 开源|阿里巴巴的国产JDK Dragonwell:龙井