zoukankan      html  css  js  c++  java
  • OpenCV基础(三)---图像混合

    图像混合

    图像混合,产生的效果跨越了时间空间.

    原理如下面公式,两张原始图像按权重相加,最终生成新图像.

    下面介绍,两种方法:

      1. 对两幅大小类型一样的图片叠加

      2.创建ROI区域叠加

    函数介绍:addWeighted() 

    函数原型:void addWeighted(InputArray src1, double alpha, InputArray src2,

         double beta, double gamma, OutputArray dst, int dtype = -1);

    函数功能:计算两个数组的加权和。

    函数声明:

    InputArray src1::加权的第一个数组

    double alpha:第一个数组的权重

    InputArray src2:加权的第二个数组

    double beta:第二个数组的权重

    double gamma:计算完权重和,再加上这个值,才是最后的结果

    OutputArray dst:输出数组,与输入数组具有相同大小和通道数

    int dtype = -1: 输出阵列的可选深度;当两个输入数组具有相同的深度时,使用dtype

           可以设置为-1,这将等效于src1.depth()

    方法1:线性混合模式

    代码演示

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 int main(int argc, char** argv) {
     8 
     9     /*载入原图像*/
    10     Mat src1, src2, dst;
    11     src1 = imread("D:/shenjianxin.png");
    12     src2 = imread("D:/xiaobai.png");
    13     if (!src1.data ) {
    14         cout << "could not load image1" << endl;
    15         return false;
    16     }
    17     if (!src2.data) {
    18         cout << "could not load image2" << endl;
    19         return false;
    20     }
    21     imshow("shenjianxin", src1);
    22     imshow("xiaobai", src2);
    23     
    24     /*图像融合*/
    25     double alpha = 0.45;
    26     if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {
    27         addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
    28     }
    29     else {
    30         cout << "could not blend photo" << endl;
    31         return false;
    32     }
    33 
    34     /*显示结果*/
    35     namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
    36     imshow("blend demo", dst);
    37 
    38     waitKey(0);
    39     return 0;
    40 }

    原始图

    效果图

    方法2:ROI区域叠加

    ROI(Region of Interest),即感兴趣区域.

    创建方法有两种,

    方法1: Rect()

       //加载原图片  

      Mat srcImage = imread("src.png"); 

      Mat logoImage = imread("logo.png");        

       //从srcImage中创建ROI区域.  Rect()中, 前两个值为图片的左上角,后两个值为矩形的宽度和高度    

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

    方法2: Range() 

       //加载原图片  

      Mat srcImage = imread("src.png"); 

      Mat logoImage = imread("logo.png");        

       //从srcImage中创建ROI区域.  Range(), 指定了ROI的起始与终止索引

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

     代码演示

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 int main(int argc, char** argv) {
     8 
     9     /*载入原图像*/
    10     Mat srcImage, logoImage;
    11     srcImage = imread("D:/shenjianxin.png");
    12     logoImage = imread("D:/dudou.png");
    13     if (!srcImage.data) {
    14         cout << "could not load srcImage" << endl;
    15         return false;
    16     }
    17     if (!logoImage.data) {
    18         cout << "could not load logo" << endl;
    19         return false;
    20     }
    21     imshow("shenjianxin", srcImage);
    22     imshow("dudou", logoImage);
    23 
    24     //Mat imageROI = srcImage(Range(0, 0 + logoImage.rows), Range(0,0 + logoImage.cols));
    25     Mat imageROI = srcImage(Rect(0,0, logoImage.cols, logoImage.rows));  //定义ROI区域
    26     addWeighted(imageROI, 0.7, logoImage, 0.5, 0, imageROI);
    27  
    28     /*显示结果*/
    29     namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
    30     imshow("blend demo",srcImage);
    31 
    32     waitKey(0);
    33     return 0;
    34 }

    原始图

     

    效果图

  • 相关阅读:
    说说渐进式增强
    Websocket模板
    Echart图表显示单位
    JS配置文件设置,共享变量抽取
    PHP处理字符串的10个简单方法
    C#实现只许一个实例运行(使用mutex类)
    实现PHP基本安全11条
    PHP开发不能违背的安全规则
    Querying a motor position
    log info
  • 原文地址:https://www.cnblogs.com/zmm1996/p/10661822.html
Copyright © 2011-2022 走看看