opencv学习笔记(十五)——图像融合

一、ROI区域图像叠加&图像混合

ROI区域:设置感兴趣区域(region of interest);
使用ROI区域可以减少处理时间,增加精度。

1,创建ROI区域

方法一:使用表示矩阵区域Rect,它指定左上角坐标和矩阵的长和宽;

Mat imageROI;
imageROI = image(Rect(200, 200, logo.cols, logo.rows));

方法二:指定感兴趣行或列的范围(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) f1(x) + af2(x)
在Opencv中使用addWeighted函数实现。

1,计算数组加权和函数:addWeighted函数

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

第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第六个参数,gamma, 一个加到权重总和上的标量值。看下面的式子自然会理解。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

addWeighted函数计算两个数组的加权和:
用数学公式表示就是:dst = src1[i] *alpha +src2[i]*beta +gama

2,线性融合实例:

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);
}

你可能感兴趣的:(opencv)