Opencv学習ノート(十五)——画像融合

4886 ワード

一、ROI領域画像重ね合わせ&画像混合
ROI領域:関心領域(region of interest)を設定し、ROI領域を使用することで処理時間を短縮し、精度を高めることができます.
1 ROI領域を作成する
方法1:表示マトリクス領域Rectを使用して、左上隅座標とマトリクスの長さと幅を指定する.
Mat imageROI;
imageROI = image(Rect(200, 200, logo.cols, logo.rows));

メソッド2:関心のある行または列の範囲(Range)を指定します.Rangeは、終了インデックスを含まない開始インデックスから終了インデックスまでの連続シーケンスを指定します.
Mat imageROI; 
imageROI = image(Range(250,250+logo.rows), Range(200, 200+logo.rows));

2,ROI領域画像の重ね合わせ例:
void ROI_AddImage()
{
    Mat srcImage = imread("G:\\Opencv\\  \\  .jpg");
    Mat logoImage = imread("G:\\Opencv\\  \\my_logo.png");

    //  ROI        
    //Mat imageROI = srcImage(Rect(100, 200, logoImage.cols, logoImage.rows));

    //  ROI        
    Mat imageROI = srcImage(Range(200, 200 + logoImage.rows), Range(100, 100 + logoImage.cols));

    Mat mask = imread("G:\\Opencv\\  \\my_logo.png",0);
    logoImage.copyTo(imageROI, mask);
    namedWindow("<1>  ROI          ");
    imshow("<1>  ROI          ", srcImage);
    waitKey(0); 

}

二、線形混合画像
線形混合動作は,g(x)=(1−a)f 1(x)+af 2(x)がOpencvにおいてaddWeighted関数を用いて実現される,典型的な2元(2入力)画素動作である.
1,計算配列重み付けと関数:addWeighted関数
void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype=-1);

最初のパラメータ、InputArrayタイプのsrc 1は、重み付けが必要な最初の配列を表し、常にMatを記入します.2番目のパラメータ、alphaは、1番目の配列の重みを表す3番目のパラメータ、src 2は、2番目の配列を表し、1番目の配列と同じサイズとチャネル数を持つ必要があります.4番目のパラメータ、betaは、2番目の配列の重み値を表します.5番目のパラメータ、dst、出力の配列、それは入力の2つの配列と同じサイズとチャネル数を持っています.6番目のパラメータ、gamma、重みの合計に加算されたスカラー値.次の式を見ると自然にわかります.7番目のパラメータ、dtype、出力アレイのオプションの深さ、デフォルト値-1があります.2つの入力配列が同じ深さにある場合、このパラメータは-1(デフォルト)に設定されます.すなわち、src 1.depth()に等しいです.
addWeighted関数は2つの配列の重み付け和を計算します:数学の公式で表します:dst = src1[i] *alpha +src2[i]*beta +gama2、線形融合例:
void main()
{
    double alphaValue = 0.5;
    double betaValue;
    Mat srcImage1, srcImage2, dstImage;

    srcImage1 = imread("mogu.jpg");
    srcImage2 = imread("rain.jpg");
    if (!srcImage1.data)
    {
        printf("        !");
    }
    if (!srcImage2.data)
    {
        printf("        !");
    }

    betaValue = 1.0 - alphaValue;
    addWeighted(srcImage1, alphaValue, srcImage2, betaValue, 3.0, dstImage);

    namedWindow("  1");
    imshow("  1", srcImage1);
    namedWindow("  2");
    imshow("  2", srcImage2);
    namedWindow("   ");
    imshow("   ", dstImage); 
    waitKey(0);
}