opencv图像线性混合&imread()

一、图像线性混合

线性混合就是,对两幅图像(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通道

转载于:https://www.cnblogs.com/ww1x/p/10882005.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值