重新缩放单应图/图像变形

Rescaling Homographys / Image warping

我正在构建基于 scikit-image 的全景代码。它非常标准,就像

1) 加载和灰度图像

2) ORB检测与匹配

3) RANSAC 单应性搜索(产生 3x3 矩阵)

4) 扭曲和拼接图像

这对我的图像很有效。但是,为了让它在可接受的时间内工作,我必须为 ORB 缩小我的图像。 然后将派生的变换应用于缩小图像会产生良好的效果,但是将它们应用于非缩放图像不起作用。

供参考:缩放是通过 skimage.transform.rescale 以一个恒定比例完成的,转换是 skimage.transform.ProjectiveTransform class 并且变形是通过 skimage.transform.warp

完成的

Q1) 在我的理解中,单应性仅按比例定义。那么为什么我不能以不同的比例使用它们(如果在图像中心进行缩放)

Q2) 有没有办法简单地缩放我的单应性?

估计的单应性 H 是按比例定义的,即当应用于单应性向量 p = [x y z] 时,生成的向量 Hp = [x' y' z'] 表示二维向量 [x'/z' y'/z'].因此,单应性矩阵的任何缩放,比如 kH,都会产生 kHp = [kx' ky' kz'] 或 2D 等价物 [x'/z' y'/z'],与之前相同。

在您描述的场景中,您想要的是重新缩放变换,以便它可以应用于您的原始图像坐标,即使单应性是在按比例缩小的坐标上估计的。

所以,你可以这样做:

from skimage import transform as tf
import numpy as np

# Set up a fake homography as illustration
# This homography is estimated on the scaled down image,
# but we'd 
estimated_tf = tf.ProjectiveTransform(np.arange(9).reshape((3, 3))/10)
print('Estimated:\n', estimated_tf.params)

S_down = tf.SimilarityTransform(scale=0.5)
S_up = tf.SimilarityTransform(scale=2)

full_tf = S_down + estimated_tf + S_up

print('On scaled down coordinates:', estimated_tf([1, 2]))
print('On full coordinates:', full_tf([2, 4]))

产生

Estimated: [[ 0. 0.1 0.2] [ 0.3 0.4 0.5] [ 0.6 0.7 0.8]] On scaled down coordinates: [[ 0.14285714 0.57142857]] On full coordinates: [[ 0.28571429 1.14285714]]