1. 程式人生 > >Opencv學習筆記:addWeighted函式(影象融合)

Opencv學習筆記:addWeighted函式(影象融合)

addWeighted函式
  • 融合圖片尺寸不變 1、函式作用 作用:實現兩幅圖片的(疊加)線性融合; 2、函式原型

    void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)

    src1:第一幅圖片(背景圖片); alpha:第一幅圖片的權重; src2:第二幅圖片(需要融合的圖片); beta:第二幅圖片的權重; gamma:一個作用到加權和後的影象上的標量, 可以理解為加權和後的影象的偏移量; (計算兩個陣列的加權和 (dst =alphasrc1 + beta

    src2 + gamma)) dst:融合後的圖片(輸出圖片); dtype:輸出陣列的可選深度,有預設值-1。(筆者認為是第二幅圖片的深度)

  • 融合圖片尺寸改變 此處引用該部落格

resize函式:主要用於調整影象的大小; 函式原型

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );

src:輸入需要改變大小的圖片; dst:輸出改變大小後的圖片; dsize:輸出影象的大小。如果這個引數不為0,那麼就代表將原影象縮放到這個Size(width,height)指定的大小;如果這個引數為0,那麼原影象縮放之後的大小就要通過下面的公式來計算:

         dsize = Size(round(fx*src.cols), round(fy*src.rows))

其中,fx和fy就是下面要說的兩個引數,是影象width方向和height方向的縮放比例。

fx:width方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.width/src.cols來計算;

fy:height方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.height/src.rows來計算;

interpolation:這個是指定插值的方式,影象縮放之後,肯定畫素要進行重新計算的,就靠這個引數來指定重新計算畫素的方式,有以下幾種:

  • INTER_NEAREST - 最鄰近插值
  • INTER_LINEAR - 雙線性插值,如果最後一個引數你不指定,預設使用這種方法
  • INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. INTER_CUBIC - 4x4畫素鄰域內的雙立方插值 INTER_LANCZOS4 - 8x8畫素鄰域內的Lanczos插值

使用注意事項:

  1. dsize和fx/fy不能同時為0,要麼你就指定好dsize的值,讓fx和fy空置直接使用預設值,就像

                  resize(img, imgDst, Size(30,30));
    

要麼你就讓dsize為0,指定好fx和fy的值,比如fx=fy=0.5,那麼就相當於把原圖兩個方向縮小一倍!

  1. 至於最後的插值方法,正常情況下使用預設的雙線性插值就夠用了。

幾種常用方法的效率是:最鄰近插值>雙線性插值>雙立方插值>Lanczos插值;

但是效率和效果成反比,所以根據自己的情況酌情使用。

  1. 正常情況下,在使用之前dst影象的大小和型別都是不知道的,型別從src影象繼承而來,大小也是從原影象根據引數計算出來。但是如果你事先已經指定好dst影象的大小,那麼你可以通過下面這種方式來呼叫函式: