在piecewiseAffineTransformation之后跟踪点的位置

时间:2017-03-22 07:48:24

标签: image-processing matplotlib computer-vision transform scikit-image

我在Skimage网站上关注this example。该代码对原始图像进行了分段仿射转换,生成的图像如下图所示。

image resulted from the website example

我试图通过访问变换矩阵索引来跟踪图像上的某些特定点如何在变换之前和之后移动。检查我的代码here

我定义了find_map_index()来找到转换矩阵中点的索引

我还定义了find_linspace_index()将指定的点放在最近的网格点上。

我能够生成一个看起来像我想要的图像,如下所示。蓝点是原始的,绿色的星是产生的位置。 image resulted from my code in gist

我的问题是为什么我必须使用tform.inverse

out = warp(image, tform.inverse, output_shape=(rows + 100, cols))

而不是tform

out = warp(image, tform, output_shape=(rows + 100, cols))

此外,如何在不调整大小以适应原始图像大小的情况下获得未剪辑的图像,网站示例中就是这种情况?转换似乎在图像边界上映射原始大小之外的点。

非常感谢。

1 个答案:

答案 0 :(得分:1)

要回答问题的第一部分 - 您需要使用逆变换,因为原始变换是从输入图像到输出图像的正向映射。

在创建扭曲图像时,您位于输出图像的空间中,并且对于输出图像中的每个像素,您希望在输入图像中找到相应的位置,并使用逆变换来查找它。见skimage documentation for warp

此方法可确保输出图像中的每个像素都有一个值。

===========================

对于提到裁剪的问题的第二部分,正如上面提到的文档显示,当输出图像中的点来自输入图像的图像范围之外时,您有许多选项。下面将详细介绍numpy.pad

中的相应定义
  • 常数 - 具有恒定值的垫
  • edge - 边缘值为数组
  • 的垫
  • symmetric - 具有沿阵列边缘镜像的矢量反射的垫片
  • reflect - 在每个轴的矢量的第一个和最后一个值上镜像的矢量反射的垫片
  • wrap - 沿着轴包含矢量的垫。第一个值用于填充结尾,而结束值用于填充开头

然而,因为您所指的特定示例是分段仿射变换,所以也可以构造为使得两个图像的边界周围的区域是固定的 - 即,该区域中的变换是单位矩阵,所以这个地区的积分不会扭曲。但是,我不确定这个例子中是否就是这种情况。