重新缩放单应图/图像变形
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]]
我正在构建基于 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]]