1. 程式人生 > >【OpenCV】Multiband Blender 用於影象拼縫的平滑

【OpenCV】Multiband Blender 用於影象拼縫的平滑

Multiband

融合兩張影象,最直接的方案是在兩張影象的重合區域用一個平滑漸變的權重對二者加權疊加。該方法的效果並不理想,關鍵原因是我們無法兼顧拼縫附近的局域細節和大尺度上兩張圖片的巨集觀特徵(如光照)。當我們希望局域細節能夠完好拼接時,需要用較小的平滑漸變區;而當我們希望要巨集觀上平滑過渡時,又想要較大的漸變區域。這二者似乎不可調和。
但事實上並非如此。Multi-Band的成功之處就是在於它同時兼顧兩種需求,當融合巨集觀特徵時,採用一個大的平滑漸變區;融合局域細節時,則採用小的平滑漸變區。那如何才能把這兩種情況分開處理呢?很簡單,把影象分解為不同頻帶的分量之加和,影象的巨集觀特徵在它的低頻分量圖裡,而局域特徵在高頻分量圖裡。
所以,Multi-Band演算法的過程大致就是:把影象按照頻率高低展開成一個金字塔,然後高低頻分量各自按照不同的方式平滑加權併疊加,最後把各頻帶分量重新加和,得到最終的融合結果。

演算法流程

  1. 計算輸入影象的高斯金字塔
  2. 將處於同一級的拉普拉斯金字塔進行融合。例如在拼接縫兩側使用簡單的線性融合
  3. 將高層的拉普拉斯金字塔依次擴充套件直至和源影象相同解析度
  4. 將4中得到的影象依次疊加,則得到最終的輸出影象。

MATLAB 實現 可參考 1

OpenCV 例項

Mat imgA, imgB;
Mat maskA, maskB, maskFinal;
Mat multibandResult;

Rect roiDst;
...
...
...
detail::MultiBandBlender blender;
blender.prepare(roiDst);

blender.feed(imgA.clone(), maskA, Point(0
, 0)); blender.feed(imgB.clone(), maskB, Point(0, 0)); blender.blend(multibandResult, maskFinal); //otherwise, result is a gray image multibandResult.convertTo(multibandResult, (multibandResult.type() / 8) * 8); imwrite("result.jpg", multibandResult);

Ref