如何使用Python对图片进行边缘细化

1. 什么是边缘细化?

边缘细化是指对二值图像进行处理,将尽可能多的边缘信息保留下来,同时又能使图像变得简单,去除冗余信息。

边缘细化的应用

在数字图像处理中,边缘是一个重要的概念,它是图像中像素强度变化的位置,常常被用于图像分割、特征提取、形状分析和目标识别等领域。而边缘细化就是为了更好的提取图像边缘,减少噪声,保留更多的边缘信息。

2. Python如何进行边缘细化?

2.1 使用Python图像处理库

Python有很多图像处理库,例如Pillow、OpenCV、Scikit-Image等,这些库都内置了边缘细化的算法,可以直接调用。

其中Scikit-Image是一个很好的图像处理库,提供了多种边缘细化的算法,包括Zhang-Suen算法、中轴线算法、快速并行细化算法等。 下面使用Scikit-Image演示如何进行边缘细化。

先安装Scikit-Image:

$ pip install scikit-image

接着导入Scikit-Image库。

from skimage import io, morphology

import matplotlib.pyplot as plt

import numpy as np

%matplotlib inline

2.2 针对特定算法的边缘细化算法

如果不想使用图像处理库,也可以自己实现边缘细化算法。常见的边缘细化算法有Zhang-Suen算法、中轴线算法、快速并行细化算法等。

下面我们对Zhang-Suen算法进行简要介绍:

Zhang-Suen算法是基于模板的图像细化算法,采用迭代方式提取图像骨架。它有以下两个步骤:

步骤一:从左到右、从上到下遍历源图像,根据模板定义的条件逐个将像素点标记为要删掉的像素点。

步骤二:从左到右、从上到下遍历源图像,根据模板定义的条件逐个将像素点标记为要删掉的像素点。

因为Zhang-Suen算法比较简单且易于理解,所以它是比较流行的图像边缘细化算法之一。以下是使用Zhang-Suen算法细化的示例代码:

def ZhangSuenThinning(image):

"""

Function that performs Zhang-Suen thinning on given binary image.

"""

while True:

markers = np.zeros_like(image)

# step 1 markers

mask1 = np.logical_and((image == 1), (morphology.binary_hit_or_miss(image, np.array([[0, 0, 0], [0, 1, 0], [1, 1, 1]])) == 0))

markers[mask1] = 1

# step 2 markers

mask2 = np.logical_and((image == 1), (morphology.binary_hit_or_miss(image, np.array([[1, 0, 0], [1, 1, 0], [1, 0, 0]])) == 0))

markers[mask2] = 1

# step 3 candidate pixels

candidates = np.logical_and((image == 1), (morphology.binary_thinning(image, iterations=1, method='zhangsuen') == 1))

# step 4 pixel deletion

to_delete = np.logical_and(candidates, np.logical_or(markers == 1, (morphology.binary_hit_or_miss(image, np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])) == 1)))

image[to_delete] = 0

# step 5 candidates for deletion

candidates = np.logical_and((image == 1), (morphology.binary_thinning(image, iterations=1, method='zhangsuen') == 1))

# step 6 deletion

to_delete = np.logical_and(candidates, np.logical_or(markers == 1, (morphology.binary_hit_or_miss(image, np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])) == 1)))

image[to_delete] = 0

if np.sum(to_delete) == 0:

break

return image

3. 示例代码

这里我们使用Scikit-Image库实现边缘细化的示例。下面是代码:

img = io.imread("test.png", as_gray=True)

# 去噪

img = morphology.opening(img,morphology.disk(1))

# 边缘细化

img = morphology.skeletonize(img)

plt.imshow(img, cmap='gray')

plt.show()

运行代码,如下图所示:

左边是原图像,右边是边缘细化后的图像。

4. 总结

本文简单介绍了边缘细化的概念,介绍了Python中实现边缘细化的方法,包括使用图像处理库和使用特定算法,同时也给出了一段简单的示例代码。希望本文对大家理解和应用边缘细化有所帮助。

后端开发标签