旋流

图像旋转是一种创建漩涡效果的非线性图像变形。此示例描述了此转换在 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}\begin{split}\\theta=\\arctan(y/x)\end{split}\\{(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{强度}\\\begin{split}\\theta‘=\Phi+s\,e^{-\\rho/r+\\theta}\end{split}\end{aligned}\end{align} \]

哪里 strength 是表示漩涡大小的参数, radius 指示漩涡范围(以像素为单位)和 rotation 添加旋转角度。中国的转型 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.058秒)

Gallery generated by Sphinx-Gallery