hilditch细化 实现 python版本

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值