1. 程式人生 > >Python-OpenCV教程-8-影象金字塔融合

Python-OpenCV教程-8-影象金字塔融合

影象金字塔融合演算法主要用在兩幅影象的拼接中。兩幅有重合區域的圖片,如果直接個根據位置來拼接,那麼由於兩幅圖片自身的差異,拼接完的圖片上會有很明顯的拼接線存在。

解決這個問題,最簡單的方法是對兩幅圖片的重合區域的畫素進行加權相加(這個操作可以理解為一種羽化的處理效果)。

fblend

設定一個權重w,就有公式:PB(i,j) = (1-w)*PA(i,j) + w*PB(i,j)可以計算重合區域融合後的畫素值。

但是,這種簡單的羽化對兩幅圖片的質量要求非常高,很對情況下並不能得到一個理想的效果。

因此,很多情況下,我們會選擇稍微複雜的影象金字塔融合演算法來處理這個重合區域。

先簡單描述一下整個演算法的流程,然後再具體介紹

1.用待處理的影象生成一系列的高斯金字塔影象。

2.根據高斯金字塔影象,計算出拉普拉斯金字塔影象。

3.根據高斯金字塔影象和拉普拉斯金子塔影象去重建重合區域的融合後的影象。

建立高斯金字塔的過程如下:

先對原影象進行高斯濾波,再去掉濾波之後的影象的的偶數行和偶數列(這樣,這幅影象大小就是原影象的1/4了)。不斷重複這個過程,直到達到要求的金子塔層數。(層數越高,那幅圖就越小,這裡定義第0層最高)

Gaussian Pyramid

建立拉普拉斯金子塔的過程如下:

首先,我們要用高層的高斯金字塔影象去重建(expand)低層的影象。這裡,我們假定用第0層的影象去重建第1層的影象,由於0層影象的大小是1層影象的1/4,所以我們必須對0層影象進行插值,使它達到1層影象的大小。這裡,一般用0去作為偶數行和偶數列加入到原影象中,然後再進行高斯濾波。(注意,這裡得到的重建後的第一層的影象跟原來的第一層的影象肯定不一樣,因為高斯濾波丟失的資訊是不可逆的)。

Gaussian Pyramid

得到了重建後的1層影象,然後我們用原來的1層影象減去這個重建的影象,就得到了這一層的拉普拉斯金字塔影象。然後還是不斷重複這個過程,就可以的得到整個的拉普拉斯影象金字塔了。

Laplacian Pyramid

得到融合影象的過程如下:

用第n層的高斯金字塔影象加上第n層的拉普拉斯金字塔影象,然後用高斯插值的方法對這幅相加完的影象重建它第n-1層的影象。然後再用這個重建完的第n-1層的影象加上第n-1層影象的拉普拉斯金字塔影象,去重建第n-2層的影象...不斷重複這個過程直到影象的大小合適。

fig1

fig2

fig3

在python中,向下建立低層金子塔影象的函式是cv2.pyrDown(),重建高層金字塔影象的函式是cv2.pyrUp()。