opencv c++ 图像线性融合

opencv c++ 图像线性融合

线性融合原理:

F(x) = (1-alpha) * f0(x) + alpha*f1(x) + gamma;

 

实现代码

opencv c++ 图像线性融合

输出结果:

opencv c++ 图像线性融合

 

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


int main(int argc, char** argv) {

    
    cv::String imgPath = "F:/软件开发/qt开发/08opencv/opencv素材/Image/";
    cv::String fileName = "Luffy.png";
    cv::String fileName1 = "opencvlog.jpg";
    //cv::String fileName = "mybaby.png";

    cv::String pathFile = imgPath + fileName;
    cv::String pathFile1 = imgPath + fileName1;
    cv::Mat  src, src1;

    src = cv::imread(pathFile);  // 采用默认方式读取图像
    src1 = cv::imread(pathFile1);
    if (src.data == NULL || src1.data==NULL) {
        printf("图像赌徒失败\n");
        return -1;
    }
    //cv::imshow("1. 默认读图", src); 
    cv::imshow("src", src);
    cv::imshow("src1", src1);

    // 1. 图像切片
    cv::Mat matROI;
    matROI = src1(cv::Rect(0, 0, src.rows, src.cols));
    //std::cout << "size of matROI:" << matROI << std::endl;
    cv::imshow("图像切片", matROI);

    // 2. 图像大小调整
    if (src.size() != src1.size()) {
        int maxr = cv::max(src.size[0], src1.size[0]);
        int maxc = cv::max(src.size[1], src1.size[1]);
        cv::Size size = cv::Size(maxr, maxc);
        /*  重定义图像大小
        CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
                          Size dsize, double fx = 0, double fy = 0,
                          int interpolation = INTER_LINEAR );
        */
        cv::resize(src, src, size);
        cv::resize(src1, src1, size);
    }
    //3.图像混合操作
    /*
    CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype = -1);
    */
    double alpha = 0.5;
    double beta = 1-alpha;
    double gamma = 0;
    cv::Mat dst;
    cv::addWeighted(src,alpha,src1, beta, gamma, dst);
    cv::imshow("dst", dst);

    cv::waitKey(0);
    system("pause");
    return 0;
}