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

越界处理:

  • 大于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. phpstorm汉化包

    链接:https://pan.baidu.com/s/1dG7AWI87dOJJezra9veFrA 提取码:btmf 下载后放到lib目录中 即可

  2. 题解【洛谷P2070】刷墙

    题面 将每一次移动的距离进行差分,前缀和判断移动的距离是否\(\geq 2\)即可. #include <bits/stdc++.h> #define itn int #define gI ...

  3. 转载:TDM协议

    转自http://www.wangdali.net/i2s/ 1. PCM简介 PCM (Pulse Code Modulation) 是通过等时间隔(即采样率时钟周期)采样将模拟信号数字化的方法.图 ...

  4. [P4550] 收集邮票 - 概率期望,dp

    套路性地倒过来考虑,设\(f[i]\)表示拥有了\(i\)种票子时还需要多少次购买,\(g[i]\)表示还需要多少钱 推\(g[i]\)递推式时注意把代价倒过来(反正总数一定,从顺序第\(1\)张开始 ...

  5. ORA-00904: "I_LEVEL": invalid identifier

    问题描述 ORA-00904: "I_LEVEL": invalid identifier 标示符无效

  6. js 时间延迟

    dojosetTimeout(dojo.hitch(this, function(){ this.onClickCount(); }), 3000); 普通应用在js中,延迟执行函数有两种,setTi ...

  7. [CF]Round514

    A Cashier 题意:一个人,一天的工作时长为\(L\),从第\(t_i\)时刻开始有长度为\(l_i\)的工作,他想在工作间隙抽烟,抽一根要\(a\)分钟,问能抽几根. 直接模拟. B Forg ...

  8. python hashlib 详解

    1.概述 摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

  9. 《CSS揭秘》》

    1,透明边框 默认状态下,背景会延伸到边框区域的下层.这样就在半透明的黑色边框中透出了这个容器自己的纯白色背景. 谢天谢地,从w3c的背景与边框第三版开始,我们可以通过 background-clip ...

  10. laravel-middleware中间件常用使用方法

    介绍 中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求.例如,Laravel 包含一个中间件,验证您的应用程序的用户身份验证.如果用户未被认证,中间件会将用户重定向到登录界面.然而,如果用 ...