我在Skimage网站上关注this example。该代码对原始图像进行了分段仿射转换,生成的图像如下图所示。
我试图通过访问变换矩阵索引来跟踪图像上的某些特定点如何在变换之前和之后移动。检查我的代码here
我定义了find_map_index()
来找到转换矩阵中点的索引
我还定义了find_linspace_index()
将指定的点放在最近的网格点上。
我能够生成一个看起来像我想要的图像,如下所示。蓝点是原始的,绿色的星是产生的位置。
我的问题是为什么我必须使用tform.inverse
out = warp(image, tform.inverse, output_shape=(rows + 100, cols))
而不是tform
?
out = warp(image, tform, output_shape=(rows + 100, cols))
此外,如何在不调整大小以适应原始图像大小的情况下获得未剪辑的图像,网站示例中就是这种情况?转换似乎在图像边界上映射原始大小之外的点。
非常感谢。
答案 0 :(得分:1)
要回答问题的第一部分 - 您需要使用逆变换,因为原始变换是从输入图像到输出图像的正向映射。
在创建扭曲图像时,您位于输出图像的空间中,并且对于输出图像中的每个像素,您希望在输入图像中找到相应的位置,并使用逆变换来查找它。见skimage documentation for warp
此方法可确保输出图像中的每个像素都有一个值。
===========================
对于提到裁剪的问题的第二部分,正如上面提到的文档显示,当输出图像中的点来自输入图像的图像范围之外时,您有许多选项。下面将详细介绍numpy.pad
中的相应定义然而,因为您所指的特定示例是分段仿射变换,所以也可以构造为使得两个图像的边界周围的区域是固定的 - 即,该区域中的变换是单位矩阵,所以这个地区的积分不会扭曲。但是,我不确定这个例子中是否就是这种情况。