opencv:图像的算术操作

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

  • 大于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;
}

原文地址:https://www.cnblogs.com/wbyixx/p/12243973.html

时间: 2024-11-12 03:27:36

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

opencv图像原地(不开辟新空间)顺时旋转90度

前一阵朋友碰到这么一道题:将图像原地顺时针旋转90度,不开辟新空间.此题看似平易(题目简短),仔细研究发现着实不容易.经过一番探索后,终于找到了正确的算法,但是当使用opencv实现时,有碰到了困难而且费了一番周折才找到问题所在. 首先,解决这个问题,先简化成原地90度旋转一M×N的矩阵A(注意不是N×N方阵).对于2×3的矩阵A = {1,2,3;4,5,6},其目标为矩阵B = {4,1;5,2;6,3}.因为是原地旋转,这里A和B应指向同一大小为6的内存空间. 这里有这样一个重要的导出公式

OpenCV &mdash;&mdash; 图像局部与部分分割(一)

背景减除 一旦背景模型建立,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了 缺点 -- 该方法基于一个不长成立的假设:所有像素点是独立的 场景建模 新的前景(物体移动的新位置) -- 旧的前景 (物体离开后留下的"空洞")-- 背景 cvInitLineIterator()  和  CV_NEXT_LINE_POINT() 对任意直线上的像素进行采样 // 从视频的一行中读出所有像素的RGB值,收集这些数值并将其分成三个文件 #inc

OpenCV &mdash;&mdash; 图像局部与分割(二)

分水岭算法 将图像中的边缘转化成"山脉",将均匀区域转化为"山谷" 分水岭算法首先计算灰度图像的梯度,这对山谷或没有纹理的盆地(亮度值低的点)的形成有效,也对山头或图像中没有主导线段的山脉(山脊对应的边缘)的形成有效.然后开始从用户指定点或算法得到的点开始"灌注"盆地知道这些区域连在一起.基于这样产生的标记就可以把区域合并到一起,合并后的区域又通过聚集的方式进行分割,好像图像被"填充"起来. cvWatershed 用 Inp

[转]OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

[OpenCV入门教程之十三]OpenCV图像金字塔:高斯金字塔.拉普拉斯金字塔与图片尺寸缩放 2014-05-18 18:58 36007人阅读 评论(54) 收藏 举报 本文章已收录于:  OpenCV知识库 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 这篇文章里,我们将一起探讨图像金字塔的一

Opencv 图像读取与保存问题

本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49737357 本文仅对 Opencv图像读取与保存进行阐述,重在探讨图像读取与保存过程中应注意的细节问题. 1 图像读取 首先看一下,imread函数的声明: // C++: Mat based Mat imread(const string& filename, int flags=1 ); // C: IplImage based

Opencv 图像叠加 添加水印

Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, InputArray mask) const 这个函数可以复制图像到另一个图像或矩阵上,可选参数是掩码 由于叠加的图像大小不一定相等,比如我们这里把一张小照片加到一张大照片上 我们可以在大照片上设置一个和小照片一样大的感兴趣区域 不使用掩码的时候,我们载入一张png,和一张jpg #include <op

FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)

<2>FilterEngine 类解析——OpenCV图像滤波核心引擎 FilterEngine类是OpenCV关于图像滤波的主力军类,OpenCV图像滤波功能的核心引擎.各种滤波函数比如blur, GaussianBlur,到头来其实是就是在函数末尾处定义了一个Ptr<FilterEngine>类型的f,然后f->apply( src, dst )了一下而已. 这个类可以把几乎是所有的滤波操作施加到图像上.它包含了所有必要的中间缓存器.有很多和滤波相关的create系函数的

c++ opencv 图像模糊度检测

参考博客: 1.基于OpenCV的图像模糊与否检测 2.无参考图像的清晰度评价方法 3.无参考图像的清晰度评价方法及c++实现 4.OpenCV 图像清晰度评价(相机自动对焦) 5.图像清晰度评价 原文地址:https://www.cnblogs.com/exciting/p/11423181.html