python - 用 python 估计欧几里德变换

标签 python image-processing scikit-image homogenous-transformation

我想做一些类似于图像分析中使用特征的标准“图像配准”的事情。

我想找到将一组二维坐标 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 Answer

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')

最佳答案

有了这个额外的约束,您将不再解决线性最小二乘问题,因此您将不得不使用 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 形式提供)来拒绝异常值。

关于python - 用 python 估计欧几里德变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574303/

相关文章:

python - 为什么我无法使用 SMTP 服务器发送超过 10 封电子邮件 (OUTLOOK)

python - 使用for循环python打印三角形金字塔图案

python - hadoop-streaming:当 mapred.reduce.tasks=1 时,reducer 似乎没有运行

linux - Linux 上的图像处理和识别实现。如何?

python - 如何从 HFS 分割图像中提取轮廓

python - 比较python中的LBP

opencv - 如何在 python 中获取平面图的外部轮廓?

image-processing - 我怎样才能得到一条完整的中轴线,其垂直线穿过它?

python - tensorflow 无效参数错误 : You must feed a value for placeholder tensor with dtype float

image - Matlab 可以显示多少个灰度级?