您好,登錄后才能下訂單哦!
本篇文章為大家展示了C++ 中怎么利用OpenCV實現線性混合操作,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
線性混合操作
即可以把兩張圖像混合成一張圖像的操作.
圖像線性混合的數學原理
G(x)=(1-a)F(x)+aQ(x)
注意事項:
1,a的取值范圍為0到1之間
2,F(x)和Q(x)為參與混合的兩幅圖像,G(x)表示輸出圖像
3,通過對兩幅圖像的每個像素值做線性加權得到最終的輸出圖像
4,兩幅圖像的大小和類型必須完全一致,如果把圖像當成一個矩陣
則兩個矩陣相加的前提是維度必須一致,否則沒有相加的意義。
addWeighted函數
在OpenCV中用于線性混合操作的API為addWeighted函數
void
addWeighted(InputArray src1,
double
alpha, InputArray src2,
double
beta,
double
gamma, OutputArray dst,
int
dtype=-1);
第一個參數,InputArray類型的src1,表示需要加權的第一個數組,常常填一個Mat。
第二個參數,alpha,表示第一個數組的權重
第三個參數,src2,表示第二個數組,它需要和第一個數組擁有相同的尺寸和通道數。
第四個參數,beta,表示第二個數組的權重值。
第五個參數,dst,輸出的數組,它和輸入的兩個數組擁有相同的尺寸和通道數。
第六個參數,gamma,一個加到權重總和上的標量值。看下面的式子自然會理解。
第七個參數,dtype,輸出陣列的可選深度,有默認值-1。;當兩個輸入數組具有相同的深度時,這個參數設置為-1(默認值),即等同于src1.depth()。
代碼演示
新建項目
新建一個項目opencv-0006,配置屬性(VS2017配置OpenCV通用屬性),然后在源文件寫入#include和main方法.
加載圖片
然后我們加載圖像用于顯示出來,我們這次需要兩個數據源,所以加載了兩張圖像
然后我們顯示一下看看效果
OK,顯示圖片沒有問題。
addWeighted線性混合操作
我們在操作addWeighted的時候,兩個數據源必須是相同大小的圖像,所以我在們操作之前先輸出一個下看看兩個圖像的高度和寬度是否一致.
運行后發現兩個圖像的寬度差了一個,那在執行addweighted的時候肯定會報錯了.所以我們要加一行調整的代碼,如果判斷寬度和高度有一個不一致,那就把第二個圖像按第一個圖像的大小進行縮放
圖像縮放的API為resize
CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
Size dsize, double fx=0, double fy=0,
int interpolation=INTER_LINEAR );
接下來我們加入縮放的判斷,把src2的圖像轉換成src1的大小
這樣我們就可以進行線性混合操作了
其中定義的alpha就是兩個圖像的權重,我們用了0.5比重,第二個圖像就要用到1-0.5效果了,就是說兩個比重加起來要等于1.
我們看一下顯示效果
中間的圖像就是我們通過線性混合操作生成的圖片,接下來我們改一下權重,看看顯示的效果.
將第一個圖像的權重改為0.2,顯示的效果為
明顯可以看出第二張圖顯示的比較清晰.
我們再把第一個圖的權重改為0.7
上述內容就是C++ 中怎么利用OpenCV實現線性混合操作,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。