漩涡#

图像旋涡是一种非线性图像变形,能产生旋涡效果。本示例描述了在 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{半径} / 5\\\phi = \mathtt{旋转}\\s = \mathtt{强度}\\\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.037 秒)

由 Sphinx-Gallery 生成的图库