目錄
前言
前一篇文章,我們講到了圖像的顏色空間轉換和類型轉換,那是以後我們可能經常會用到的操作。
今天這篇文章給大家帶來的是圖像的混合,我們將帶領大家一起了解什麼是圖像混合?如何使用opencv進行圖像混合,讓我們一起走進今天的文章看一下吧!
一、圖像混合
1、什麼是圖像混合
圖像混合,怎麼理解呢?假設我們有兩個顏料板,每個顏料板都有m×n個格子,每個格子中有一個顏色,對應位置的,放到一起,攪拌均勻。那我們每個格子都會得到一個新的顏色。
對於圖像來說,我們有兩個大小相同的圖像,我們將對應位置的像素相加,就可以得到一個新的像素,每個格子顏料不同,佔比不同,得到的像素也不同,像素也可以設置比例,兩個像素通過調整比例,可以得到很多的圖像。
2、圖像混合的數學原理
根據上面的理解,我們知道圖像混合就是按照比例將來那個幅圖像對應位置的像素點加起來。
這個很好理解,使用數學公式表達如下:g表示的是混合後的圖像,α表示的是其中一幅圖像所佔比重,那另一幅圖像所佔比重就是1-α。f表示的是用於混合的圖像。
上面這是很簡單的混合,就是直接按比例混合,如果我們想在添點料呢?
這個很好理解,使用數學公式表達如下:g表示的是混合後的圖像,α表示的是其中一幅圖像所佔比重,那另一幅圖像所佔比重就是1-α。f表示的是用於混合的圖像。
3、API - addweight
接下來我們就來說一下這個對應的API,定義如下:
CV_EXPORTS_W void addWeighted(
InputArray src1,
double alpha,
InputArray src2,
double beta,
double gamma,
OutputArray dst,
int dtype = -1
);
函數參數含義如下:
(1)InputArray類型的src1,輸入圖像。
(2)double類型的alpha,輸入圖像src1的alpha值(所佔比重)
(3)InputArray類型的src2,輸入圖像。
(4)double類型的beta,輸入圖像src2的beta值(所佔比重)
(5)double類型的gamma,gamma值,添加到每個和的標量。
(6)OutputArray類型的dst,輸出圖像,其大小和通道數與輸入數組相同。
(7)int類型的dtype ,輸出數組的可選深度;當兩個輸入數組具有相同的深度時,dtype可以設置爲-1,這相當於src1.depth()。默認爲-1。
在使用過程中,我們需要注意:
1.兩個輸入圖像的尺寸和類型必須要一致,所以我們要先檢測,才能做混合。
2.一般最後一個參數都是默認的,採用和輸入圖像相同的深度。
二、代碼實戰
1、代碼分析
我們要獲取兩個圖像,然後將這兩個圖像進行混合。
所以我們要先讀取兩個圖像,保證讀取成功並展示:
Mat ZWJ = imread("./image/YT_ZWJ.png");
Mat ZM = imread("./image/YT_ZM.png");
if (!ZWJ.data && !ZM.data)
{
cout << "ERROR : could not load image.\n";
return -1;
}
imshow("張無忌", ZWJ);
imshow("趙敏", ZM);
然後我們就要考慮混合,混合的時候,我們需要定義幾個參數,根據自己需要,也可以設置固定值,比如:
double alpha = 0.5;
Mat YT;
最後我們需要判斷,兩個輸入圖像類型是否一致,圖像尺寸是否一致,如果一致,我們就進行圖像混合並輸入,如果不一致我們就進行提示。
if (ZWJ.rows == ZM.rows && ZWJ.cols == ZM.cols && ZWJ.type() == ZM.type()) {
addWeighted(ZWJ, alpha, ZM, (1.0 - alpha), 0.0, YT);
imshow("倚天屠龍", YT);
}
else {
cout<<"The size of images is not same.\n";
return -1;
}
2、全部代碼
全部代碼如下:
/*
作者:水亦心
內容:core-圖像混合
時間:2020年5月27日
*/
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat ZWJ = imread("./image/YT_ZWJ.png");
Mat ZM = imread("./image/YT_ZM.png");
if (!ZWJ.data && !ZM.data)
{
cout << "ERROR : could not load image.\n";
return -1;
}
imshow("張無忌", ZWJ);
imshow("趙敏", ZM);
double alpha = 0.5;
Mat YT;
if (ZWJ.rows == ZM.rows && ZWJ.cols == ZM.cols && ZWJ.type() == ZM.type()) {
addWeighted(ZWJ, alpha, ZM, (1.0 - alpha), 0.0, YT);
imshow("倚天屠龍", YT);
}
else {
cout<<"The size of images is not same.\n";
return -1;
}
waitKey(0);
return 0;
}
3、執行結果
執行結果如下: