1. 程式人生 > >opencv影象線性混合操作

opencv影象線性混合操作

影象線性混合的數學原理

G(x)=(1-a)F(x)+aQ(x)

注意事項:

1,a的取值範圍為0到1之間

2,F(x)和Q(x)為參與混合的兩幅影象,G(x)表示輸出影象

3,通過對兩幅影象的每個畫素值做線性加權得到最終的輸出影象

4,兩幅影象的大小和型別必須完全一致,如果把影象當成一個矩陣

則兩個矩陣相加的前提是維度必須一致,否則沒有相加的意義。

示例

第一幅參與混合的影象


第二幅參與混合的影象


混合結果


通過混合產生了煙雨朦朧的效果

程式碼實現

#include <opencv2\core\core.hpp>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main(int argc, char** args)
{
	Mat src1, src2, dst;
	src1 = imread("mogu.jpg");
	src2 = imread("rain.jpg");
	if (!src1.data)
	{
		printf("影象載入錯誤");
		return -1;
	}

	if (!src2.data)
	{
		printf("影象載入錯誤");
		return -1;
	}

	double alpha = 0.5;//混合權重
	//混合的兩幅影象寬高和型別必須完全一致
	if (src1.rows==src2.rows
		&&src1.cols==src2.cols
		&&src1.type()==src2.type())
	{
		addWeighted(src1,alpha,src2,(1.0-alpha),0.0,dst);//線性混合
		//add(src1,src2,dst);//相加
		//multiply(src1,src2,dst);//相乘
		imshow("原圖-1", src1);
		imshow("原圖-2",src2);
		imshow("混合後的圖",dst);
	}
	else{
		printf("兩幅影象的大小或者型別不一致,不能混合!");
		return -1;
	}

	waitKey(0);
	return 0;
}