OpenCV3之——影象線性混合操作、陣列加權和addWeighted()函式
阿新 • • 發佈:2019-02-03
線性混合操作是一種典型的二元(兩個輸入)的畫素操作;
計算陣列加權和: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; }
【原圖】
【兩個影象線性組合效果圖】