漩涡#

图像漩涡是一种非线性图像变形,可以创建漩涡效果。 本示例描述了此变换在 skimage 中的实现,以及底层的扭曲机制。

图像扭曲#

当对图像应用几何变换时,我们通常使用反向映射,即,对于输出图像中的每个像素,我们计算其在输入中的对应位置。 原因是,如果我们反过来做(将每个输入像素映射到其新的输出位置),输出中的某些像素可能会被留空。 另一方面,每个输出坐标在输入图像中(或图像外)都有一个对应的精确位置,即使该位置是非整数,我们也可以使用插值来计算相应的图像值。

执行反向映射#

要在 skimage 中执行几何扭曲,您只需将反向映射提供给 skimage.transform.warp() 函数。 例如,考虑我们要将图像向左移动 50 个像素的情况。 这种偏移的反向映射将是

def shift_left(xy):
    xy[:, 0] += 50
    return xy

对 warp 的相应调用是

from skimage.transform import warp
warp(image, shift_left)

漩涡变换#

考虑输出图像中坐标 \((x, y)\)。 漩涡变换的反向映射首先相对于中心 \((x_0, y_0)\) 计算其极坐标,

\[ \begin{align}\begin{aligned}\theta = \arctan((y-y0)/(x-x0))\\\rho = \sqrt{(x - x_0)^2 + (y - y_0)^2},\end{aligned}\end{align} \]

然后根据以下公式进行转换

\[ \begin{align}\begin{aligned}r = \ln(2) \, \mathtt{radius} / 5\\\phi = \mathtt{rotation}\\s = \mathtt{strength}\\\theta' = \phi + s \, e^{-\rho / r} + \theta\end{aligned}\end{align} \]

其中 radius 表示漩涡范围(以像素为单位),rotation 添加旋转角度,strength 是漩涡程度的参数。 将 radius 转换为 \(r\) 是为了确保在指定半径内变换衰减到 \(\approx 1/1000^{\mathsf{th}}\)

plot swirl
import matplotlib.pyplot as plt

from skimage import data
from skimage.transform import swirl


image = data.checkerboard()
swirled = swirl(image, rotation=0, strength=10, radius=120)

fig, (ax0, ax1) = plt.subplots(
    nrows=1, ncols=2, figsize=(8, 3), sharex=True, sharey=True
)

ax0.imshow(image, cmap=plt.cm.gray)
ax0.axis('off')
ax1.imshow(swirled, cmap=plt.cm.gray)
ax1.axis('off')

plt.show()

脚本的总运行时间:(0 分钟 0.099 秒)

由 Sphinx-Gallery 生成的图库