OpenCV圖像處理使用筆記(四)——圖像融合

前言常用

1.在OpenCV中定義了好多函數用來操作圖像矩陣,有兩個矩陣相加的,相減的,混合的,下面我使用QT加OpenCV演示圖像融合這個函數。
2.我的IDE是Qt creator,OpenCV的版本是3.30,系統環境是Linux。

矩陣操作

1.圖像融合
OpenCV圖像融合所用的函數是addWeighted()。
函數原型:

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

參數說明:
第一個參數:src1,表示進行加權操作的第一個圖像對象,即輸入圖片1;
第二個參數:double型的alpha,表示第一個圖像的加權係數,即圖片1的融合比例;
第三個參數:src2,表示進行加權操作的第二個圖像對象,即輸入圖片2;
第四個參數:double型的beta,表示第二個圖像的加權係數,即圖片2的融合比例。很多情況下,有關係 alpha+beta=1.0;
第五個參數:double型的gamma,表示一個作用到加權和後的圖像上的標量,可以理解爲加權和後的圖像的偏移量;
第六個參數:dst,表示兩個圖像加權和後的圖像,尺寸和圖像類型與src1和src2相同,即輸出圖像;
第七個參數:輸出陣列的可選深度,有默認值-1。當兩個輸入數組具有相同的深度時,這個參數設置爲-1(默認值),即等同於src1.depth()。
(1)圖像融合有兩種方式,第一種是全部融合,要求輸入圖像大小是一樣的。

void addImage(Mat &one_cv_img,Mat& two_cv_img, Mat &dst)
{
    if(one_cv_img.empty() && two_cv_img.empty())
    {
        cout << "請先打開圖像!" << endl;
    }
    if(one_cv_img.size() != two_cv_img.size())
    {
        cv::resize(one_cv_img, one_cv_img, Size(two_cv_img.cols, two_cv_img.rows));
    }
    addWeighted(two_cv_img, 0.3, one_cv_img, 0.7, 0, dst);
}

輸入的兩張圖像大小不一,按第二張來縮放第一張圖像。
輸入的圖像:
在這裏插入圖片描述
在這裏插入圖片描述
輸出的結果:
在這裏插入圖片描述
(2)第二是感興趣(ROI)區域融會。

void addImageRoi(Mat &one_cv_img,Mat& two_cv_img, Mat &dst)
{
    if(one_cv_img.empty() && two_cv_img.empty())
    { 
        cout << "請先打開圖像!" << endl;
        return;
    }

    //判斷大小
    if ((one_cv_img.cols < two_cv_img.cols) || (one_cv_img.rows < two_cv_img.rows))
    {
        cout<<"ROI區域大於原圖"<<endl;
        return;
    }
    dst = one_cv_img.clone();
    Mat image_roi;
    //在dst上選定一個與要融合圖像大小一樣的區域
    image_roi = dst(Rect(100, 100, two_cv_img.cols, two_cv_img.rows));
    //將選定區域imageROI和logoImage按0.3:0.7混合,結果存放到選定區域ImageROI
    addWeighted(image_roi, 0.3, two_cv_img, 0.7, 0.0, image_roi);

    imshow("roi",dst);
}

第一張輸入的圖像,下面可以看到圖像尺寸,注意,第一張圖像一定要比第二張圖像大。
在這裏插入圖片描述
第二張輸入的圖像:
在這裏插入圖片描述
輸出結果圖像:
在這裏插入圖片描述

發佈了69 篇原創文章 · 獲贊 38 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章