hilditch细化 实现 python版本
没找到python实现,照着定义原理实现下了
hilditch细化原理
这里就不说原理,过程简单,不做阐述了,自行百度
直接上实现呗
def get_8count(list_zhou9):
"""
把通阈
:param list_zhou9:
:return:
"""
list_zhou9 = [1 - one for one in list_zhou9]
count = list_zhou9[6] - list_zhou9[6] * list_zhou9[7] * list_zhou9[0]
count += list_zhou9[0] - list_zhou9[0] * list_zhou9[1] * list_zhou9[2]
count += list_zhou9[2] - list_zhou9[2] * list_zhou9[3] * list_zhou9[4]
count += list_zhou9[4] - list_zhou9[4] * list_zhou9[5] * list_zhou9[6]
return count
def sum_static(b_list):
sum_ = 0
for i, one in enumerate(b_list):
if one != -1:
sum_ += 1
else:
copy = one
b_list[i] = 0
if get_8count(b_list) == 1:
sum_ += 1
b_list[i] = copy
return sum_
def neighbours(h, w, image):
"""
八通域的三种分类,目标,背景,选中(为了每轮计算)三种
:param h:
:param w:
:param image:
:return:
"""
h_1, w_1, h1, w1 = h - 1, w - 1, h + 1, w + 1
postiton_xy = [[h, w1], [h_1, w1], [h_1, w], [h_1, w_1], [h, w_1], [h1, w_1], [h1, w], [h1, w1]]
b_list = [-1 if image[x, y] == 128 else 1 if image[x, y] == 255 else 0 for x, y in
postiton_xy]
return b_list
def hiliditch(img_src):
"""
hiliditch,细化方法
:param img_src: 输入为操作图片的二值图,0为背景,255为目标像素
:return: 硒化后的二至图片
"""
rows, columns = img_src.shape[:2]
Image_Thinned = img_src.copy()
is_continue = True
while is_continue:
is_continue = False
for h in range(1, rows - 1):
for w in range(1, columns - 1):
[x1, x2, x3, x4, x5, x6, x7, x8] = neighbours(h, w, Image_Thinned)
b_list = [x1, x2, x3, x4, x5, x6, x7, x8]
func_1 = Image_Thinned[h, w] == 255 # 即当前像素必须为前景点
func_2 = 1 - abs(x1) + 1 - abs(x3) + 1 - abs(x5) + 1 - abs(x7) >= 1 # 当前像素为边界点,即东西南北四个点至少有一个b[i]=0
func_3 = sum([abs(one) for one in b_list]) >= 2 # 条件表示不能删除端点
func_4 = sum([1 if one == 1 else 0 for one in b_list]) > 1 # 条件表示不能删除端点
func_5 = get_8count(b_list) == 1 # 连通性
func_6 = sum_static(b_list) == 8 #
if func_1 and func_2 and func_3 and func_4 and func_5 and func_6:
Image_Thinned[h, w] = 128
is_continue = True
for h in range(1, rows - 1):
for w in range(1, columns - 1):
if Image_Thinned[h, w] == 128:
Image_Thinned[h, w] = 0
return Image_Thinned