备注
单击 here 下载完整的示例代码或通过活页夹在浏览器中运行此示例
使用几何变换¶
在这个例子中,我们将看到如何在图像处理环境中使用几何变换。
import math
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage import transform
基础知识¶
支持几种不同的几何变换类型:相似性、仿射、投影和多项式。有关可用的转换类型的教程,请参见 同形异义词的类型 。
几何变换可以使用显式参数(例如,缩放、剪切、旋转和平移)或变换矩阵来创建。
首先,我们使用显式参数创建转换:
tform = transform.SimilarityTransform(scale=1, rotation=math.pi/2,
translation=(0, 1))
print(tform.params)
输出:
[[ 6.123234e-17 -1.000000e+00 0.000000e+00]
[ 1.000000e+00 6.123234e-17 1.000000e+00]
[ 0.000000e+00 0.000000e+00 1.000000e+00]]
或者,您可以通过转换矩阵本身定义转换:
matrix = tform.params.copy()
matrix[1, 2] = 2
tform2 = transform.SimilarityTransform(matrix)
然后可以使用这些变换对象在源坐标系和目标坐标系之间应用正向和反向坐标变换:
输出:
[[6.123234e-17 3.000000e+00]]
[[ 0.000000e+00 -6.123234e-17]]
图像扭曲¶
几何变换也可用于扭曲图像:
text = data.text()
tform = transform.SimilarityTransform(scale=1, rotation=math.pi/4,
translation=(text.shape[0]/2, -100))
rotated = transform.warp(text, tform)
back_rotated = transform.warp(rotated, tform.inverse)
fig, ax = plt.subplots(nrows=3)
ax[0].imshow(text, cmap=plt.cm.gray)
ax[1].imshow(rotated, cmap=plt.cm.gray)
ax[2].imshow(back_rotated, cmap=plt.cm.gray)
for a in ax:
a.axis('off')
plt.tight_layout()

参数估计¶
除了上面提到的基本功能外,您还可以使用最小二乘法估计几何变换的参数。
这可以特别用于图像配准或校正,其中您在两个图像中有一组控制点或同源/对应点。
让我们假设我们想要识别一张照片上的字母,这张照片不是从正面拍摄的,而是以特定的角度拍摄的。在最简单的平面纸面上,字母被投影扭曲。简单的匹配算法将无法匹配这样的符号。这个问题的一种解决方案是扭曲图像,以便消除失真,然后应用匹配算法:
text = data.text()
src = np.array([[0, 0], [0, 50], [300, 50], [300, 0]])
dst = np.array([[155, 15], [65, 40], [260, 130], [360, 95]])
tform3 = transform.ProjectiveTransform()
tform3.estimate(src, dst)
warped = transform.warp(text, tform3, output_shape=(50, 300))
fig, ax = plt.subplots(nrows=2, figsize=(8, 3))
ax[0].imshow(text, cmap=plt.cm.gray)
ax[0].plot(dst[:, 0], dst[:, 1], '.r')
ax[1].imshow(warped, cmap=plt.cm.gray)
for a in ax:
a.axis('off')
plt.tight_layout()
plt.show()

上述估计有赖于对应点的准确选择。另一种方法称为 RANSAC algorithm 在对应点不是完全准确的情况下非常有用。请参阅 基于RANSAC的稳健匹配 教程,了解如何在SCRKIT-IMAGE中使用这种方法的深入描述。
脚本的总运行时间: (0分0.199秒)