前言常用
1.在OpenCV中定義了好多函數用來操作圖像矩陣,有兩個矩陣相加的,相減的,混合的,下面我使用QT加OpenCV演示圖像融合這個函數。
2.我的IDE是Qt creator,OpenCV的版本是3.30,系統環境是Linux。
矩陣操作
1.圖像融合
OpenCV圖像融合所用的函數是addWeighted()。
函數原型:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
參數說明:
第一個參數:src1,表示進行加權操作的第一個圖像對象,即輸入圖片1;
第二個參數:double型的alpha,表示第一個圖像的加權係數,即圖片1的融合比例;
第三個參數:src2,表示進行加權操作的第二個圖像對象,即輸入圖片2;
第四個參數:double型的beta,表示第二個圖像的加權係數,即圖片2的融合比例。很多情況下,有關係 alpha+beta=1.0;
第五個參數:double型的gamma,表示一個作用到加權和後的圖像上的標量,可以理解爲加權和後的圖像的偏移量;
第六個參數:dst,表示兩個圖像加權和後的圖像,尺寸和圖像類型與src1和src2相同,即輸出圖像;
第七個參數:輸出陣列的可選深度,有默認值-1。當兩個輸入數組具有相同的深度時,這個參數設置爲-1(默認值),即等同於src1.depth()。
(1)圖像融合有兩種方式,第一種是全部融合,要求輸入圖像大小是一樣的。
void addImage(Mat &one_cv_img,Mat& two_cv_img, Mat &dst)
{
if(one_cv_img.empty() && two_cv_img.empty())
{
cout << "請先打開圖像!" << endl;
}
if(one_cv_img.size() != two_cv_img.size())
{
cv::resize(one_cv_img, one_cv_img, Size(two_cv_img.cols, two_cv_img.rows));
}
addWeighted(two_cv_img, 0.3, one_cv_img, 0.7, 0, dst);
}
輸入的兩張圖像大小不一,按第二張來縮放第一張圖像。
輸入的圖像:
輸出的結果:
(2)第二是感興趣(ROI)區域融會。
void addImageRoi(Mat &one_cv_img,Mat& two_cv_img, Mat &dst)
{
if(one_cv_img.empty() && two_cv_img.empty())
{
cout << "請先打開圖像!" << endl;
return;
}
//判斷大小
if ((one_cv_img.cols < two_cv_img.cols) || (one_cv_img.rows < two_cv_img.rows))
{
cout<<"ROI區域大於原圖"<<endl;
return;
}
dst = one_cv_img.clone();
Mat image_roi;
//在dst上選定一個與要融合圖像大小一樣的區域
image_roi = dst(Rect(100, 100, two_cv_img.cols, two_cv_img.rows));
//將選定區域imageROI和logoImage按0.3:0.7混合,結果存放到選定區域ImageROI
addWeighted(image_roi, 0.3, two_cv_img, 0.7, 0.0, image_roi);
imshow("roi",dst);
}
第一張輸入的圖像,下面可以看到圖像尺寸,注意,第一張圖像一定要比第二張圖像大。
第二張輸入的圖像:
輸出結果圖像: