10. 图像的几何变换#
10.1. 裁剪、调整大小和重新缩放图像#
图像作为 NumPy 数组(如图像的 NumPy 速成课程部分所述),可以通过简单的切片操作来裁剪图像。下面我们裁剪一个 100x100 的正方形,对应于宇航员图像的左上角。请注意,此操作对所有颜色通道都执行(颜色维度是最后一个,第三个维度)
>>> import skimage as ski
>>> img = ski.data.astronaut()
>>> top_left = img[:100, :100]
为了改变图像的形状,skimage.color
提供了几个函数,如重新缩放、调整大小和缩小尺寸中所述。
from skimage import data, color
from skimage.transform import rescale, resize, downscale_local_mean
image = color.rgb2gray(data.astronaut())
image_rescaled = rescale(image, 0.25, anti_aliasing=False)
image_resized = resize(
image, (image.shape[0] // 4, image.shape[1] // 4), anti_aliasing=True
)
image_downscaled = downscale_local_mean(image, (4, 3))
10.2. 投影变换(单应性)#
单应性是欧几里得空间的变换,它保持点的对齐。单应性的特定情况对应于更多属性的保持,例如平行性(仿射变换)、形状(相似变换)或距离(欧几里得变换)。scikit-image 中提供的不同类型的单应性在单应性类型中介绍。
投影变换可以使用显式参数(例如缩放、剪切、旋转和平移)创建
import numpy as np
import skimage as ski
tform = ski.transform.EuclideanTransform(
rotation=np.pi / 12.,
translation = (100, -20)
)
或完整的变换矩阵
matrix = np.array([[np.cos(np.pi/12), -np.sin(np.pi/12), 100],
[np.sin(np.pi/12), np.cos(np.pi/12), -20],
[0, 0, 1]])
tform = ski.transform.EuclideanTransform(matrix)
变换的变换矩阵可作为其tform.params
属性获得。可以通过使用@
矩阵乘法运算符将矩阵相乘来组合变换。
变换矩阵使用齐次坐标,它是欧几里得几何中使用的笛卡尔坐标扩展到更一般的射影几何。特别是,无限远处的点可以用有限坐标表示。
可以使用skimage.transform.warp()
将变换应用于图像
img = ski.util.img_as_float(ski.data.chelsea())
tf_img = ski.transform.warp(img, tform.inverse)
skimage.transform
中的不同变换具有一个estimate
方法,以便根据两组点(源和目标)估计变换的参数,如使用几何变换教程中所述
text = ski.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 = ski.transform.ProjectiveTransform()
tform3.estimate(src, dst)
warped = ski.transform.warp(text, tform3, output_shape=(50, 300))
estimate
方法使用最小二乘优化来最小化源和优化之间的距离。源点和目标点可以手动确定,或者使用skimage.feature
中提供的不同特征检测方法确定,例如
角点检测,
等等。
并在估计变换参数之前使用skimage.feature.match_descriptors()
匹配点。但是,通常会进行虚假匹配,建议使用 RANSAC 算法(而不是简单的最小二乘优化)来提高对异常值的鲁棒性,如使用 RANSAC 进行鲁棒匹配中所述。
显示变换估计应用的示例是
estimate
方法是基于点的,也就是说,它仅使用源图像和目标图像的一组点。对于估计平移(位移),还可以使用基于傅里叶空间互相关的全场方法使用所有像素。此方法由skimage.registration.phase_cross_correlation()
实现,并在图像配准教程中进行了说明。
使用极坐标和对数极坐标变换进行配准教程说明了此全场方法的变体,用于通过首先使用对数极坐标变换来估计旋转。