一、图像线性混合

线性混合就是,对两幅图像(f0(x)和f1(x))或两段视频(同样为(f0(x)和f1(x))产生时间上的画面叠化(cross-dissolve)效果,就像幻灯片放映和电影制作中的那样。函数表示为:

1、opencv函数-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()。dst = src1 

addWeighted函数计算如下两个数组(src1和src2)的加权和,得到结果输出给第四个参数。即addWeighted函数的作用可以被表示为为如下的矩阵表达式为: dst = src1[I]*alpha+ src2[I]*beta + gamma;

2、实例代码

#include <opencv2/opencv.hpp>
#include <iostream>
//隐藏控制台窗口  
//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
using namespace std;
using namespace cv;

int main()
{
    Mat src1, src2, dst;//创建Mat数组,等待存储图片
    src1 = imread("1.jpg");
    src2 = imread("2.jpg");
    //图2尺寸缩放到与图1相同
    resize(src2, src2, src1.size());
    //将图1与图2线性混合
    addWeighted(src1, 0.5, src2, 0.5, 0, dst);

    //显示图片
    imshow("src1图", src1);
    imshow("src2图", src2);
    imshow("混合后的图片", dst);
    waitKey(0);//等待按键响应后退出,0改为5000就是5秒后自动退出。

    destroyAllWindows();
    return 0;

}

 

二、imread(const string& filename, int flags=1)

函数的第二个参数可设置读入图像的方式,函数默认以RGB三波段形式读入图像,即flags=1,而需读入一幅灰度图则需要设置flags=0,以8bit单通道的形式读入。

flag=-1时,8位深度,原通道

flag=0时,8位深度,1通道

flag=1时,8位深度,3通道

flag=2时,原深度,1通道

flag=3时,原深度,3通道

posted on 2019-05-17 16:26  苏州城外啲微笑  阅读(190)  评论(0)    收藏  举报