基於均值座標(Mean-Value Coordinates)的影象融合演算法的具體實現
阿新 • • 發佈:2020-03-07
[TOC]
# 1. 概述
泊松融合是影象融合處理效果最好的演算法,其來自於2004年Siggraph的經典paper:《Poisson Image Editing》。以這篇文章為發端,很多大神提出了一系列的優化演算法。2009年, Zeev Farbman 在的SIGGRAPH上面提出的基於Mean-Value Coordinates方法的泊松融合加速演算法《Coordinates for Instant Image Cloning》(文獻二)。在這篇文章中,泊松方程被轉換成拉普拉斯方程,並且提出了用均值座標Mean-Value Coordinates來近似求解這個方程,從而達到實時運算的效果。
初步瞭解了一下原生的泊松融合演算法和均值座標融合演算法,其原理包含的內涵十分豐富,包含一些諸如列散度、拉普拉斯運算元、梯度場、泊松方程等等數學知識,要完全弄明白確實需要一定的基礎。這裡就重點關注一下根據《Coordinates for Instant Image Cloning》(文獻二)實現影象融合的過程,有機會的話再詳細推導一下其原理。
# 2. 實現
## 2.1. 準備
在OpenCV中,已經收錄了泊松融合演算法,也就是函式seamlessClone():![seamlessClone][imglink1]
這個演算法要求輸入一個源影象,一個目標影象,源影象希望融合到目標影象的位置,以及一個mask影象。這個mask影象也就是一張二值化影象,用來標識影象的ROI(region of interest感興趣區域)。均值座標融合演算法的輸入引數也是一樣的,不過mask影象很難以處理,OpenCV自帶的GUI難以滿足需求。所以我這裡通過QT來做GUI,通過OpenCV將影象顯示到QT窗體上,然後再QT窗體的影象區域內繪製多邊形,多邊形內部即為ROI。可以參考我的這兩篇文章:
[《使用QT顯示OpenCV讀取的圖片》][netlink1]
[《使用QT繪製一個多邊形》][netlink2]
## 2.2. 核心
### 2.2.1. 均值座標(Mean-Value Coordinates)
在論文中提出了一個很重要的概念也就是均值座標(Mean-Value Coordinates)。對於如下多邊形內部的點:![Mean-Value Coordinates][imglink2]
都有一系列與多邊形邊界相關的座標值:![Mean-Value Coordinates][imglink3]
也就是說,只要確定了ROI,也就確定了ROI區域內每個點的均值座標(Mean-Value Coordinates),每個點會有m個值(m為ROI邊界多邊形的頂點)。
### 2.2.2. ROI邊界柵格化
論文中是以ROI邊界多邊形為例的,實際用到影象處理中是不會只用幾個多邊形的節點來計算的,而應該是ROI邊界上連續的點。實際上不用想也知道,影象融合最關鍵的部分就是ROI邊界部分的畫素值。必須要用到ROI邊界上所有的畫素值來計算。
也就是說這裡還需要一個工作,就是將ROI邊界多邊形柵格化,取得其上連續的畫素位置,得到準確的柵格化多邊形邊界。這裡可以參看我的這篇文章[《向量線的一種柵格化演算法》][netlink3]。按照順序逐條將多邊形的邊柵格化,即可以得到ROI的柵格化多邊形邊界。
### 2.2.3. 核心實現
論文給出的演算法虛擬碼如下:![MCV融合][imglink4]
這段演算法描述並不複雜,轉換成自然語言如下:
1. 假設ROI區域內有n個點,其邊界由m個點組成。
2. 那麼可以求每個點的MVC(均值座標),每個點有m個座標值,一共有n個點,MVC就是就是一個n*m的矩陣。
3. 求ROI區域邊界的畫素差diff,顯然其是一個m*1的矩陣。
4. 那麼新影象ROI區域的插值為:r = MVC * diff,矩陣乘法後r為n*1矩陣。
5. 將插值r與原影象g矩陣相加:f = g + r,替換目標影象相應位置的值。
核心部分具體的實現程式碼如下:
```cpp
QTime startTime = QTime::currentTime();
//Step1:找到邊界上所有的畫素點