一、图像线性混合
线性混合就是,对两幅图像(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#include //隐藏控制台窗口 //#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通道