备注
单击 here 下载完整的示例代码或通过活页夹在浏览器中运行此示例
旋流¶
图像旋转是一种创建漩涡效果的非线性图像变形。此示例描述了此转换在 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}}}}\) 在指定的半径内。

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秒)