opencv:图像的算术操作

不打扰是莪最后的温柔 提交于 2020-01-30 22:00:16

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

  • 大于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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!