我想做一些类似于图像分析中使用特征的标准“图像配准”的事情。
我想找到将一组 2D 坐标 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 编写自己的优化问题。对短语/实现这个优化问题有什么帮助吗?
编辑:感谢 Stefan van der Walt,我的实现
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')