OpenCV之ROI圖像疊加和混合

在之前的博客中,有一篇關於如何把局部區域添加到另一幅圖像的文章:
http://blog.csdn.net/swj110119/article/details/50957691
現在又看到了關於這方面知識更全面的的內容,現在把他們總結出來,也是對這部分內容的加強理解與鞏固。

除了上一篇應用cvSetImageROI函數處理外,還可以通過copyTo( OutputArray m, InputArray mask )函數,即利用掩模mask來實現,原理與cvSetImageROI類似,只是在後者的ROI內容是通過mask的覆蓋區域以及mask中的像素值來決定的,即與mask非零值對應的像素被複制。代碼如下:

#include<opencv.hpp>
#include<highgui.h>
using namespace cv;
int main()
{
    Mat beauty = imread("E:\\project\\images\\beauty.jpg");
    Mat smallplane = imread("E:\\project\\images\\smallplane.png");

    Mat ROI = beauty(Rect(280, 0, smallplane.cols, smallplane.rows));
    //設置掩模爲ROI區域大小相同
    Mat mask = imread("E:\\project\\images\\smallplane.png", 0);
    smallplane.copyTo(ROI, mask);

    imshow("beautyAndSmallplane", beauty);
    waitKey(0);
    return 0;
}

還有一個函數能夠實現這種功能,

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

src1和src2表示兩個尺寸和類型相同的兩個原圖像,dst用來存儲處理後的圖像,alpha、beta和gamma是相應的線性參數,dtype是圖像深度,該函數用數學公式可表示爲:

dst = alpha*src1+beta*src2+gamma

#include<opencv.hpp>
#include<highgui.h>
using namespace cv;
int main()
{

    Mat src1 = imread("E:\\project\\images\\mogu.jpg");
    Mat src2 = imread("E:\\project\\images\\rain.jpg");
    Mat dst;
    double alpha = 0.6;
    addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

這裏寫圖片描述
這裏寫圖片描述
結果展示:
這裏寫圖片描述
如果加載的兩幅圖像大小不一致,可以通過Rect類設置ROI區域來進行局部圖像的融合,核心代碼如下:

imageROI = srcImage1(Rect(100, 200, srcImage2.cols, srcImage2.rows));
    addWeighted(imageROI, alpha, srcImage2, 1 - alpha, 0.0, imageROI);

對於透明度的手動調節,我們可以結合createTrackbar()實現用戶調節。實現如下:

#include<opencv.hpp>
#include<highgui.h>
using namespace cv;

#define WINDOW_NAME "調節透明度"
const int g_maxAlphaValue = 100;
int g_alphaValueSlider;
double g_alphaValue;
double g_betaValue;

Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;

//回調函數
void on_Trackbar(int g_alphaValueSlider,void*)
{
    //計算addWeighted所需參數
    g_alphaValue = (double)g_alphaValueSlider / g_maxAlphaValue;
    g_betaValue = 1 - g_alphaValue;

    addWeighted(g_srcImage1, g_alphaValue, g_srcImage2, g_betaValue, 0, g_dstImage);

    imshow(WINDOW_NAME, g_dstImage);
}
//調節透明度
int main()
{
    g_srcImage1 = imread("E:\\project\\images\\house.jpg");
    g_srcImage2 = imread("E:\\project\\images\\road.jpg");

    g_alphaValueSlider = 50;
    namedWindow(WINDOW_NAME, 1);
    createTrackbar("Alpha", WINDOW_NAME, &g_alphaValueSlider, g_maxAlphaValue, on_Trackbar);

    on_Trackbar(g_alphaValueSlider, 0);
    waitKey(0);
    return 0;
}

素材圖片
這裏寫圖片描述
這裏寫圖片描述
結果圖片:
這裏寫圖片描述

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