我想做的事情类似于图像分析中使用特征的标准“图像注册”。
我想找到在另一个B中转换一组2D坐标A的最佳转换。 但我想添加一个额外的约束,即转换是'刚性/欧几里德变换'意味着没有缩放但只有平移和旋转。 通常允许缩放我会这样做:
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')
答案 0 :(得分: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
获取)来拒绝异常值。
答案 1 :(得分:0)
skimage现在在转换模块中提供原生支持。
http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.estimate_transform
比我发现的OpenCV容易一些。有一系列功能可以涵盖所有用例。