天天看點

opencv c++ 圖像線性融合opencv c++ 圖像線性融合

opencv c++ 圖像線性融合

線性融合原理:

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

實作代碼

opencv c++ 圖像線性融合opencv c++ 圖像線性融合

輸出結果:

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::resize(src, src, size);

        cv::resize(src1, src1, size);

    }

    //3.圖像混合操作

    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;

}

繼續閱讀