1. 程式人生 > >OpenCV3之——影象線性混合操作、陣列加權和addWeighted()函式

OpenCV3之——影象線性混合操作、陣列加權和addWeighted()函式

       線性混合操作是一種典型的二元(兩個輸入)的畫素操作;

       計算陣列加權和:addWeighted()函式

//函式原型
void addWeighted(InputArray src1,double alpha,InputArray src2,double beta,double gamma,OutputArray dst,int dtype=-1);

第一個引數:InputArray型別的src1表示需要加權的第一個陣列,常常填一個Mat

第二個引數:double型別的alpha,表示第一個陣列的權重

第三個引數:InputArray型別的src2表示需要加權的第二個陣列,他需要和第一個陣列擁有相同的尺寸和通道數

第四個引數:double型別的beta,表示第二個陣列的權重

第五個引數:double型別的gamma,一個加到權重總和上的標量值

第六個引數:OutputArray型別的dst,輸出的陣列,他和輸入的兩個陣列擁有相同的尺寸和通道數

第七個引數:int型別的dtype,預設值為-1,當兩個輸入的陣列擁有相同的深度時,這個引數設定為-1

dst = src1[i] * alpha + src2[i] * beta + gamma;

其中i為多維陣列的索引值,當遇到多通道陣列時,每個通道都需要獨立的進行處理

注意:當輸出的陣列深度為CV_32S時,這個函式不再適用

影象線性組合例項:

#include <opencv2/opencv.hpp>
using namespace cv;

//-------------LinearBlending()函式,實現影象線性混合----
bool LinearBlending() {
	//定義一些區域性變數
	double alphaValue = 0.5;
	double betaValue;
	Mat srcImage2, srcImage3, dstImage;

	//讀取影象(兩幅影象需為同樣的型別和尺寸)
	srcImage2 = imread("mogu.jpg");
	srcImage3 = imread("rain.jpg");
	if (!srcImage2.data) {
		std::cout << "讀取srcImage2錯誤!" << std::endl;
		return false;
	}
	if (!srcImage3.data) {
		std::cout << "讀取srcImage3錯誤!" << std::endl;
		return false;
	}

	//做影象混合加權操作
	betaValue = (1.0 - alphaValue);
	addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);//加權線性混合

	//建立並顯示原圖視窗
	namedWindow("<2>線性混合示例【原圖】",1);
	imshow("<2>線性混合示例【原圖】", srcImage2);

	namedWindow("<3>線性混合示例【效果圖】");
	imshow("<3>線性混合示例【效果圖】", dstImage);

	return true;
}
int main() {
	if (LinearBlending())
		std::cout << "線性混合例項演示成功!" << std::endl;
	else
		std::cout << "線性混合例項演示失敗!" << std::endl;

	waitKey(0);
	return 0;
}

【原圖】


【兩個影象線性組合效果圖】