2

我想做類似於圖像分析中使用特徵的標準「圖像配準」。使用python估計歐幾里德變換

我想找到轉換一組二維座標A在另一個B中的最佳轉換。但我想添加一個額外的約束,因爲轉換是'剛性/歐幾里德轉換​​'這意味着沒有縮放但只有翻譯和旋轉。 通常情況下,允許縮放,我會做:

from skimage import io, transform 
destination = array([[1.0,2.0],[1.0,4.0],[3.0,3.0],[3.0,7.0]]) 
source = array([[1.2,1.7],[1.1,3.8],[3.1,3.4],[2.6,7.0]]) 
T = transform.estimate_transform('similarity',source,destination) 

我相信estimate_transform引擎蓋下只是解決了一個最小二乘問題。 但我想添加沒有縮放的約束。

有沒有在skimage或其他軟件包中解決這個問題的任何函數? 可能我需要用scipy,CVXOPT或cvxpy編寫我自己的優化問題。 任何幫助來短語/實現這個優化問題?

編輯: 我的實現得益於斯特凡範德沃爾特回答

from matplotlib.pylab import * 
from scipy.optimize import * 

def obj_fun(pars,x,src): 
    theta, tx, ty = pars 
    H = array([[cos(theta), -sin(theta), tx],\ 
     [sin(theta), cos(theta), ty], 
     [0,0,1]]) 
    src1 = c_[src,ones(src.shape[0])] 
    return sum((x - src1.dot(H.T)[:,:2])**2) 

def apply_transform(pars, src): 
    theta, tx, ty = pars 
    H = array([[cos(theta), -sin(theta), tx],\ 
     [sin(theta), cos(theta), ty], 
     [0,0,1]]) 
    src1 = c_[src,ones(src.shape[0])] 
    return src1.dot(H.T)[:,:2] 

res = minimize(obj_fun,[0,0,0],args=(dst,src), method='Nelder-Mead') 

回答

2

有了額外的約束,你不再求解線性最小二乘問題,所以你必須使用SciPy的公司之一最小化功能。你最小化的內部將設立一個矩陣H:

H = np.array([[np.cos(theta), -np.sin(theta), tx], 
       [np.sin(theta), np.cos(theta), ty], 
       [0, 0, 1]]) 

然後,你會計算所有數據點的距離

|x_target - H.dot(x_source)| 

,總結錯誤。現在,您可以將成本函數發送給最小化函數。您可能還想使用RANSAC(skimage.measure.ransac)來拒絕異常值。

+0

謝謝你的回答我實現它,它的工作原理。 – Gioelelm 2014-10-26 18:22:03

+0

我忽略了一些細節,例如齊次座標等,所以很容易使它起作用的榮譽! – 2014-10-26 22:52:54