OpenCV-C++ 图像混合

这一部分简单介绍一下,两张图像之间的混合操作:

  • 线性混合
  • 相乘
  • 相加

线性混合

计算表达式如下:

[g(x) = alpha f_0(x) + (1- alpha)f_1(x) ]

代码如下:

Mat src = imread("/home/chen/dataset/lena.jpg");  // 读取第一张图像
Mat src2 = imread("/home/chen/dataset/peppers.tiff");  // 读取第二张图像

// 图像混合
if ((src.size() == src2.size()) && (src.type() == src2.type())){
    Mat dst = Mat(src.size(), src.type());
    double alpha = 0.7;
    addWeighted(src, alpha, src2, (1-alpha), 0, dst);
    namedWindow("dst", WINDOW_AUTOSIZE);
    imshow("dst", dst);
} else {
    printf("error
");
    return -1;
}

结果如下:

相乘/相加

除了两张图像的线性组合,也可以将两张图像直接相乘或者相加,如下:

add(src, src2, dst);
multiply(src, src2, dst);

最后,完整代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){

    // 读取图像
    Mat src = imread("/home/chen/dataset/lena.jpg");
    if (src.empty()){
        printf("could not load image.
");
        return -1;
    }
    namedWindow("scr", WINDOW_AUTOSIZE);
    imshow("src", src);

    Mat src2 = imread("/home/chen/dataset/peppers.tiff");
    if (src2.empty()){
        printf("could not load image.
");
        return -1;
    }
    namedWindow("src2", WINDOW_AUTOSIZE);
    imshow("src2", src2);

    // 图像混合
    if ((src.size() == src2.size()) && (src.type() == src2.type())){
        Mat dst = Mat(src.size(), src.type());
        double alpha = 0.7;
        addWeighted(src, alpha, src2, (1-alpha), 0, dst);
        // add(src, src2, dst);
        // multiply(src, src2, dst);
        namedWindow("dst", WINDOW_AUTOSIZE);
        imshow("dst", dst);
    } else {
        printf("error
");
        return -1;
    }
    waitKey(0);
    return 0;
}
原文地址:https://www.cnblogs.com/chenzhen0530/p/14619545.html