前提:输入图像的大小和类型必须一致

越界处理:

  • 大于255,则会减去255
  • 小于0,则等于0

基本计算,加减乘除

#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src1 = imread("f:/temp/images/WindowsLogo.jpg");
Mat src2 = imread("f:/temp/images/LinuxLogo.jpg");
//namedWindow("003-windowsSrc", WINDOW_AUTOSIZE);
//namedWindow("003-linuxSrc", WINDOW_AUTOSIZE);
//imshow("003-windowsSrc", src1);
//imshow("003-linuxSrc", src2); /*
Mat dst1;// **
add(src1, src2, dst1);
imshow("add", dst1); Mat dst2; // 减
subtract(src1, src2, dst2);
imshow("subtract", dst2); Mat dst3; // 乘
multiply(src1, src2, dst3);
imshow("multiply", dst3); Mat dst4; // 除
divide(src1, src2, dst4);
imshow("divide", dst4);
*/
Mat src = imread("f:/temp/images/butterfly.jpg");
imshow("butterfly.jpg", src);
Mat black = Mat::zeros(src.size(), src.type());
black = Scalar(40, 40, 40);
Mat dst;
// 加或减,改变图像的亮度
//add(src, black, dst);
subtract(src, black, dst);
//imshow("dst", dst); Mat dst2;
black = Scalar(127, 127, 127);
// 让两个图像以不同的权重相加,然后加上一个常量的值
// 权重可以给负数
addWeighted(src, 1.2, black, 0.5, 0, dst2);
imshow("dst2", dst2); Mat dst3;
addWeighted(src1, 1, src2, 0.5, 0, dst3);
imshow("src1+src2", dst3); waitKey(0);
destroyAllWindows(); return 0;
}

基本位操作

#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src = imread("f:/images/apple.jpg");
Mat src1 = imread("f:/images/WindowsLogo.jpg");
Mat src2 = imread("f:/images/LinuxLogo.jpg"); imshow("src", src); // 位操作
// 图像取反
Mat m1;
bitwise_not(src, m1, Mat());
imshow("bitwise_not", m1); Mat m2;
Mat mask = Mat::zeros(src.size(), CV_8UC1);
// 参照mask的像素值进行取反
// mask如果全是0的话,则不取反
bitwise_not(src, m2, mask);
imshow("bitwise_not---mask", m2); Mat m3;
Mat mask2 = Mat::zeros(src.size(), CV_8UC1);
int w = src.cols / 2;
int h = src.rows / 2;
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
mask2.at<uchar>(row, col) = 255;
}
}
imshow("mask2", mask2);
bitwise_not(src, m3, mask2);
imshow("m3 bitwise_not", m3); // 与操作
Mat m4;
bitwise_and(src1, src2, m4);
imshow("m4 bitwise_and", m4); // 或操作
Mat m5;
bitwise_or(src1, src2, m5);
imshow("m5 bitwise_or", m5); // 异或操作
Mat m6;
bitwise_xor(src1, src2, m6);
imshow("m6 bitwise_xor", m6); // 参数 mask:取ROI区域
// 位运算的最后一个参数都可以给出一个mask waitKey(0);
destroyAllWindows(); return 0;
}

opencv:图像的算术操作的更多相关文章

  1. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  2. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  3. Opencv 图像叠加 添加水印

    Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, Inp ...

  4. opencv图像读取-imread

    前言 图像的读取和保存一定要注意imread函数的各个参数及其意义,尽量不要使用默认参数,否则就像数据格式出现错误(here)一样,很难查找错误原因的: re: 1.opencv图像的读取与保存; 完

  5. 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放

    在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...

  6. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  7. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  8. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

  9. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

  10. Imagelab-0-QT label显示 opencv 图像

    Imagelab-0-QT label显示 opencv 图像 opencvc++qtimagelab 开始之前 这其实也是opencv 处理图像的系列, 只是想我们在进一步复杂化我们的代码之前, 每 ...

随机推荐

  1. hadoop搭建HA集群之后不能自动切换namenode

    在搭好HA集群之后,想测试一下集群的高可用性,于是先把active的namenode给停掉: hadoop-daemon.sh stop namenode 或者直接kill掉该节点namenode的对 ...

  2. AcWing 272. 最长公共上升子序列

    #include<iostream> using namespace std ; ; int n; int a[N]; int b[N]; int f[N][N]; //f[i][j] / ...

  3. 网络流EK算法模板

    \(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, ...

  4. Linux oracle安装 内核参数讲解

    在安装Oracle的时候需要调整linux的内核参数,但是各参数代表什么含义呢,下面做详细解析. Linux安装文档中给出的最小值: fs.aio-max-nr = 1048576 fs.file-m ...

  5. ISCC2018_leftleftrightright-Writeup

    leftleftrightright(150) 这个题学到了不少东西,值得认真写一下 下载好文件后发现是upx的壳,upx -d直接脱掉后运行,发现是经典的check输入的题目(作为一个linuxer ...

  6. 剑指offer 面试题. 数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  7. NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...

  8. Linux下run文件的直接运行

    比如realplay.run 安装方法如下 chmod +x realplay.run ./realplay.run 然后他就会执行安装了,在过程中可能会要求你输入yes或no 安装完后就可以用了 , ...

  9. NOIP做题练习(day5)

    A - 中位数图 题面 题解 先找出题意中的\(b\)所在的位置. 再以这个位置为中心,向右\(for\)一遍有多少个大于/小于该数的数 大于就\(++cs\) 小于就\(--cs\). 因为这个数是 ...

  10. python SMTP发邮件

    # from email.mime.text import MIMEText from email.header import Header import smtplib # sender = 'zc ...