框架化

骨架化将二进制对象减少到1个像素宽的表示形式。这对于特征提取和/或表示对象的拓扑是有用的。

skeletonize 通过对图像进行连续传递来工作。在每一遍中,在不中断相应对象的连通性的条件下,识别并移除边界像素。

from skimage.morphology import skeletonize
from skimage import data
import matplotlib.pyplot as plt
from skimage.util import invert

# Invert the horse image
image = invert(data.horse())

# perform skeletonization
skeleton = skeletonize(image)

# display results
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 4),
                         sharex=True, sharey=True)

ax = axes.ravel()

ax[0].imshow(image, cmap=plt.cm.gray)
ax[0].axis('off')
ax[0].set_title('original', fontsize=20)

ax[1].imshow(skeleton, cmap=plt.cm.gray)
ax[1].axis('off')
ax[1].set_title('skeleton', fontsize=20)

fig.tight_layout()
plt.show()
original, skeleton

张氏法与李氏法

skeletonize [Zha84] 工作方式是连续通过图像,删除对象边框上的像素。这将继续进行,直到不能删除更多的像素。图像与掩码相关,该掩码为每个像素分配范围内的数字 [0...255] 对应于其8个相邻像素的每个可能的图案。然后使用查找表为像素分配0、1、2或3的值,这些值在迭代期间被选择性地移除。

skeletonize(..., method='lee') [Lee94] 使用八叉树数据结构检查像素的3x3x3邻域。该算法通过迭代扫描图像,并在每次迭代中移除像素,直到图像停止变化。每次迭代由两个步骤组成:首先,组装待移除的候选列表;然后顺序地重新检查该列表中的像素,以更好地保持图像的连通性。

请注意,李的方法 [Lee94] 被设计用于3D图像,并被自动选择用于这些图像。为了说明的目的,我们将该算法应用于2-D图像。

Zha84

一种用于细化数字图案的快速并行算法,张天元,孙振英,《计算机科学通讯》,1984年3月,第27卷,第3期。

Lee94(1,2)

李东中,R.L.Kashyap和Chu C.N.Chu,通过3-D中面/轴细化算法建立骨架模型。计算机视觉,图形与图像处理,56(6):462-478,1994。

import matplotlib.pyplot as plt
from skimage.morphology import skeletonize

blobs = data.binary_blobs(200, blob_size_fraction=.2,
                          volume_fraction=.35, seed=1)

skeleton = skeletonize(blobs)
skeleton_lee = skeletonize(blobs, method='lee')

fig, axes = plt.subplots(1, 3, figsize=(8, 4), sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(blobs, cmap=plt.cm.gray)
ax[0].set_title('original')
ax[0].axis('off')

ax[1].imshow(skeleton, cmap=plt.cm.gray)
ax[1].set_title('skeletonize')
ax[1].axis('off')

ax[2].imshow(skeleton_lee, cmap=plt.cm.gray)
ax[2].set_title('skeletonize (Lee 94)')
ax[2].axis('off')

fig.tight_layout()
plt.show()
original, skeletonize, skeletonize (Lee 94)

中轴骨架化

对象的中轴是在对象边界上具有多个最近点的所有点的集合。它通常被称为 拓扑骨架 ,因为它是对象的1个像素宽的骨架,具有与原始对象相同的连接性。

这里,我们使用中轴变换来计算前景对象的宽度。作为函数 medial_axis 返回除中轴(带有关键字参数)之外的距离变换 return_distance=True ),则可以使用此函数计算中轴上所有点到背景的距离。这给出了对象的局部宽度的估计。

对于分支较少的骨架, skeletonize 应该是首选。

from skimage.morphology import medial_axis, skeletonize

# Generate the data
blobs = data.binary_blobs(200, blob_size_fraction=.2,
                          volume_fraction=.35, seed=1)

# Compute the medial axis (skeleton) and the distance transform
skel, distance = medial_axis(blobs, return_distance=True)

# Compare with other skeletonization algorithms
skeleton = skeletonize(blobs)
skeleton_lee = skeletonize(blobs, method='lee')

# Distance to the background for pixels of the skeleton
dist_on_skel = distance * skel

fig, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(blobs, cmap=plt.cm.gray)
ax[0].set_title('original')
ax[0].axis('off')

ax[1].imshow(dist_on_skel, cmap='magma')
ax[1].contour(blobs, [0.5], colors='w')
ax[1].set_title('medial_axis')
ax[1].axis('off')

ax[2].imshow(skeleton, cmap=plt.cm.gray)
ax[2].set_title('skeletonize')
ax[2].axis('off')

ax[3].imshow(skeleton_lee, cmap=plt.cm.gray)
ax[3].set_title("skeletonize (Lee 94)")
ax[3].axis('off')

fig.tight_layout()
plt.show()
original, medial_axis, skeletonize, skeletonize (Lee 94)

形态稀疏

形态细化,在 thin 函数,其工作原理与 skeletonize :在每次迭代时从边框中删除像素,直到在不改变连接的情况下不能删除任何像素。不同的去除规则可以加速骨架化,并产生不同的最终骨架。

这个 thin 函数还采用可选的 max_iter 关键字参数来限制细化迭代的次数,从而生成相对较厚的骨架。

from skimage.morphology import skeletonize, thin

skeleton = skeletonize(image)
thinned = thin(image)
thinned_partial = thin(image, max_iter=25)

fig, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(image, cmap=plt.cm.gray)
ax[0].set_title('original')
ax[0].axis('off')

ax[1].imshow(skeleton, cmap=plt.cm.gray)
ax[1].set_title('skeleton')
ax[1].axis('off')

ax[2].imshow(thinned, cmap=plt.cm.gray)
ax[2].set_title('thinned')
ax[2].axis('off')

ax[3].imshow(thinned_partial, cmap=plt.cm.gray)
ax[3].set_title('partially thinned')
ax[3].axis('off')

fig.tight_layout()
plt.show()
original, skeleton, thinned, partially thinned

输出:

/scikit-image/doc/examples/edges/plot_skeleton.py:175: FutureWarning:

`max_iter` is a deprecated argument name for `thin`. It will be removed in version 1.0. Please use `max_num_iter` instead.

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

Gallery generated by Sphinx-Gallery