骨架
表示一个平面区域的结构形状的一种重要方法是将它简化为图形,这种简化可以通过一种细化(也称为骨架化)算法得到该区域的骨架来实现。细化是一种形态学变形,在提取中轴线的图像处理问题中,细化起着核心作用。为了产生一个区域的中轴的表示,提出了许多典型的算法,这些算法都是通过迭代一个区域的边界点的细化过程,删除这些点时需要服从如下约束条件:(1)不能删除端点,(2)不能破坏连接性,(3)不能导致区域的过度腐蚀。
因此,细化算法的一次迭代由如下步骤组成:(1)标记将被删除的边界点;(2)删除做了标记的点;(3)继续标记将被删除的剩余的边界点;(4)删除标记过的点。反复应用这个基本过程,直到再也没有被删除的点为止,此时算法终止,生成了该区域的骨架。
Zhang-Suen细化算法
首先定义像素点的8邻域如下图(前景为1,背景为0):
# 定义像素点周围的8邻域
# P9 P2 P3
# P8 P1 P4
# P7 P6 P5
def neighbours(x,y,image):
img = image
x_1, y_1, x1, y1 = x-1, y-1, x+1, y+1
return [ img[x_1][y],img[x_1][y1],img[x][y1],img[x1][y1], # P2,P3,P4,P5
img[x1][y], img[x1][y_1], img[x][y_1], img[x_1][y_1] ] # P6,P7,P8,P9
N(p1)表示与1相邻的8个像素点中,为前景像素点的个数。
for x in range(1, rows - 1):
for y in range(1, columns - 1):
P2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)
S(P1)表示从P2 ~ P9中出现0~1的累计次数,其中0表示背景,1表示前景。
# 计算邻域像素从0变化到1的次数
def transitions(neighbours):
n = neighbours + neighbours[0:1] # P2,P3,...,P8,P9,P2
return sum( (n1, n2) == (0, 1) for n1, n2 in zip(n, n[1:]) ) # (P2,P3),(P3,P4),...,(P8,P9),(P9,P2)
Zhang-Suen细化算法的整个迭代过程分为两步: