原作者:Chris Tralie :http://blog.csdn.net/u011534057/article/details/68922197 簡介
泊松影像編輯是一種全自動的“無縫融合”兩張映像的技術,由Microsoft Research UK的Patrick Perez,Michel Gangnet, and Andrew Blake在論文“Poisson Image Editing”中首次提出。為了更好的瞭解它所解決的問題,我們看下面這個例子:
如果我們想把這張同學合影映像……
與大白鯊映像……
融合在一起:
直接融合顯然效果很糟糕,問題所在:看起來太假。兩張映像都有水,但是水的陰影不一樣,一個偏藍一個偏綠,切割映像的邊緣因此非常明顯。我們可以在Photoshop或者GIMP中進行一些簡單的嘗試,把大白鯊調亮一點,但是無論怎樣調整,邊界還是清晰可見。有沒有一種方法能夠自動的無縫拼合這兩張映像,然後得到這樣的效果:
當然,既然我已經寫到這了,答案就是泊松影像編輯。在這個教程的目標是通過一種簡單可操作的方式來解釋這個演算法。事不宜遲,讓我們開始討論一下泊松影像編輯背後的一些數學原理。 在邊界條件下進行梯度匹配
泊松編輯的全部內容可以歸結到一個非常簡單的想法。為了更好地說明,我們先仔細的定義一下我們的問題:我們改變的映像是A(背景映像),我們剪下和粘貼的映像是B(前景映像):
在將前景映像B粘貼到背景映像A中的時候,我們的訴求是:允許映像B改變顏色,但是仍然能夠保留B的完整的“細節”。細節包括映像B中全部的邊緣、角點、過度等等。如果你學習過數位影像處理課程的話,你已經知道了從映像中提取這些細節的一些方法,這些方法的第一步都是計算映像的梯度。映像的梯度是描述映像的一種數學表達,描述的是像素與相鄰像素的相對變化(本質上是像素與其相鄰像素的差值)。我們需要尋找的就是相對描述子,因為映像A與映像B之間的不統一主要是因為他們顏色上的絕對差。 因此,更為嚴格的泊松影像編輯的目標是:允許改變絕對資訊(映像B的顏色),但是在粘貼之後儘可能的保留映像B的相對資訊(映像梯度)。下面就是鯊魚映像的梯度,相對資訊大概就長這個樣子:
如果將映像梯度孤立的去看,它是缺乏約束的。做個類比,我讓你在紙上畫一個路徑,只告訴你:“向前走2cm,向左轉30度,向前走300cm”,但是我沒有告訴你起始位置。你畫的路線可能開始於任何一個位置任何方向,仍然滿足我的描述。有梯度約束的相對資訊跟這個是一個道理。我們需要固定指定像素的RGB值,然後求解我們的問題,才能讓我們的映像B更加像映像A。我們將映像B的邊緣像素固定,其像素值為映像A的像素值,然後求解其餘的在選取內的像素值,約束是保持映像B的原始梯度。下一節我會給出一些具體的公式,如何求解的具體推導,希望現在你至少知道了我們需要做什麼。 離散解和基於疏鬆陣列的實現
現在讓我列出來解決這個問題的公式。約定:被粘貼的映像是A,剪下和粘貼的是映像B,求解得到的新的粘貼映像是H(H是B的升級,能更好的與A融合)。最簡單的部分:邊界限制。我們之前已經提到了,H的邊界應該與A的邊界完全一致,所以我們可以匹配選取內部的像素,向內地融合他們,用數學表示:
H(x,y)=A(x,y)∀(x,y)∈∂B
我們已經知道了H邊界的解(同樣也是B的邊界)。
現在我們需要求解H內部的像素值。我們希望內部像素的梯度值等於B內部像素的梯度值。一個點上映像梯度的簡單定義:該像素與所有像素的差值的和。
|∇B(x,y)|=4B(x,y)–B(x−1,y)–B(x+1,y)–B(x,y−1