【拜小白opencv】6-两幅图像融合简单实现1;addWeighted()函数;两幅图像尺寸相同时;

来源:互联网 发布:网络交友的弊端300字 编辑:程序博客网 时间:2024/05/16 15:37

博主力求用最简单的语言将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些错误,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

 如果本人写的能给读者带来一点点的帮助,我就很开心了。


======================分割线===================


在图像处理的操作中经常会遇到将两幅图像融合成一张图像的问题,在opnecv里利用addWeighted()函数可以很容易实现这个功能。

  • addWeighted()函数中,输入两个图像image1 和 image2。
  • 两个图像可以是任何象素类型,只要它们的类型相同。它们可以是单通道或是三通道,只要它们相符。
  • 且图像尺寸大小必须相同,否则编译会出错!!!


1.addWeighted()函数

此函数的作用是将两幅图像进行融合。计算两个数组的加权和(dst = alpha*src1 + beta*src2 + gamma)。

首先看一下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()。

官方文档解释说明如下:

https://docs.opencv.org/master/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a19

公式表达即为;
  •       dst = src1[I] * alpha + src[2] * beta + gamma; 

============================分割线==========================

代码演示

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace cv;using namespace std;int main(){//【0】定义相关变量 Mat dog, ac;//【1】读取原始图像并检查图像是否读取成功  dog = imread("D:\\OutPutResult\\ImageTest\\adog.jpg");ac = imread("D:\\OutPutResult\\ImageTest\\ac.jpg");if (dog.empty() && ac.empty())//检验两幅图像是否同时存在{cout << "读取图像有误,请重新输入正确路径!\n";return -1;}//【3】显示原始图像namedWindow("图像1dog");//创建窗口imshow("图像1dog", dog);//显示窗口namedWindow("图像2ac");imshow("图像2ac", ac);//【4】利用addWeighted()函数对两幅图像进行融合addWeighted(dog, 0.6, ac, 0.4, 0., dog);//最后融合效果显示在dog图像上。/*若不想毁坏原始dog图像,也可建立一个与dog图像类型尺寸一样的新图像,将融合后的图像保存到上面。建立方法:Mat newImage(dog.size(), dog.type());//newImage与dog类型尺寸相同*/namedWindow("图像1与图像2融合效果图");imshow("图像1与图像2融合效果图", dog);//【5】保持等待状态  waitKey();return 0;}


======================分割线=====================


=====================分割线==================

程序说明

注意:要融合的两个图像的尺寸与类型必须一致!!!

但处理图像过程中,往往会遇到两幅图像尺寸不一致情况怎么办呢?
别着急,下一节,我将介绍两种方法去解决。

=====================END======================
阅读全文
0 0
原创粉丝点击