一.addweighted函數作用
addweighted()是OpenCV庫中用于圖像處理的函數,主要功能是將兩個輸入圖像(尺寸和類型相同)按照指定的權重進行加權疊加(圖像融合),并添加一個標量值(如亮度調整)。它常用于實現圖像混合、特效疊加、亮度調節等視覺效果,在計算機視覺應用中廣泛用于創建透明效果、淡入淡出過渡或圖像增強等場景。
1.函數定義
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst);
參數:
? ?src1: 第一個輸入圖像(數組),必須是相同尺寸和類型(如8位無符號整型)的圖像
? ?alpha: 第一個圖像的權重系數(double類型),決定 src1 在融合中的貢獻程度。例如,α=0.5 表示 ? ? ? ? ? ? ? ? ? ? ? ? ? ? src1 占據50%權重
? ?src2: 第二個輸入圖像(數組),尺寸和通道數必須與 src1 完全匹配
? ?beta: 第二個圖像的權重系數(double類型),決定 src2 在融合中的貢獻程度。例如,
β=0.5表示 src2 占據50%權重
? ?gamma: 標量值(double類型),添加到每個像素上,常用于調整輸出圖像的全局亮度。例如,γ=0 不改變亮度,γ>0 增加亮度。
? ?dst: 輸出圖像(數組),尺寸和類型與輸入相同,存儲融合結果。
函數執行的運算是基于每個像素點的線性加權和。數學公式如下:
dst(i,j)=α×src1(i,j)+β×src2(i,j)+γ? ? ? ? ? ? 簡化公式就是:dst=α?src1+β?src2+γ
src1(i,j)?和?src2(i,j)src2(i,j)?分別表示兩個輸入圖像在位置?(i,j)(i,j)?的像素值。
α?是第一個圖像的權重(浮點數)。
β?是第二個圖像的權重(浮點數)。
γ是添加到每個像素的標量值(通常用于調整整體亮度)。
dst(i,j)dst(i,j)?是輸出圖像在位置?(i,j)(i,j)?的像素值。 公式確保結果通過?saturate_cast<uchar>
?處理(防止像素值溢出255),避免無效的像素值
權重和與?γγ的作用:α?和?β?之和通常為1以實現平滑融合(如?α+β=1),但并非絕對要求。γ?可獨立調整亮度,這類似于在融合后加一個常數偏移
2.例子
c++中
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
? ? // 讀取圖像
? ? Mat img1 = imread("image1.jpg", IMREAD_COLOR);
? ? Mat img2 = imread("image2.jpg", IMREAD_COLOR);
? ? Mat dst; ?// 輸出圖像
? ? // 調用addWeighted:alpha=0.1, beta=0.9, gamma=10(增加少量亮度)
? ? addWeighted(img1, 0.1, img2, 0.9, 10, dst);
? ? // 保存輸出
? ? imwrite("output.jpg", dst);
? ? return 0;
}
二.實戰
在實戰中,我們兩個圖片的融合分為兩個情況,一種是兩張照片大小不一樣,一種是大小一樣
大小一樣的我們就可以只用使用addweighted函數融合,不需要建立感興趣區,大小不一樣的則需要。
int main(int argc, char * argv[])
{//命令行中選入照片Mat src1=imread(argv[1]);//src1原圖像的數據Mat src2=imread(argv[2]); //src2是LOGO圖像的數據//判斷src1長度和src2是否相同,若不同則進行以下操作if(src1.size!=src2.size)//不相同就需要建立感興趣區{Mat image_roi=src1(Rect(30,30,src2.cols,src2.rows));//在原圖像中截取一個可感興趣區域,感興趣區域double alpha =0.4;//alpha第一個圖像的權重值,這里是0.4double beta = 1-alpha;//beta是第二個圖像權重值,1- alpha = 0.6,第二個圖像的清晰度較高int gama =0;//gamma默認為0,>0就是增強光感addWeighted(image_roi,alpha,src2,beta,gama,image_roi);//調用addWeighted對src1和src2進行圖像融合imwrite("addweighted_norsamesize.jpg",src1);}else//大小一樣,是融合之后生成一張新的照片{double alpha = 0.4;//alpha第一個圖像的權重值,這里是0.4double beta = 1 - alpha;//beta是第二個圖像權重值,1- alpha = 0.6,第二個圖像的清晰度較高int gamma = 0; Mat dst;addWeighted(src1, alpha , src2, beta, gamma, dst); //調用addWeighted對src1和src2進行圖像融合imwrite("addweighted_samesize.jpg", dst);}