OpenCV-骨架提取

击不击中变换

算法步骤:

  1. 开三个内存缓冲区,用来保存原图像数据,结构元素H对原图像的腐蚀结果,结构元素M对原图像补集的腐蚀结果
  2. 保存原图像数据,用结构元素H对原图像腐蚀,并保存腐蚀后的结果
  3. 恢复原图像,并对其求补
  4. 用结构元素M对原图像的补进行腐蚀操作,并保存腐蚀后的结果
  5. 求两个腐蚀结果的交集,即击中与击不中的结果

骨架提取

算法步骤:

  1. 获得原图像的首地址及图像的宽和高,并设置循环标志1
  2. 用结构元素腐蚀原图像,并保存腐蚀结果
  3. 设置循环标志为0,如果腐蚀结果中有一个点为255,即原图像尚未被完全腐蚀成空集,则将循环标志设为1.
  4. 用结构元素对腐蚀后的图像进行开运算(消除小的白色区域),并求取腐蚀运算与开运算的差(得到消除的白色区域)
  5. 用[4]中求得的结果与之前求得的骨架进行并集运算,以获得本次循环求得的骨架
  6. 把本次循环中保存的腐蚀结果赋值给原图像
  7. 重复步骤[2]-[6],直到将原图像腐蚀成空集为止。
    最终求得的骨架就是结果。

代码

def skeleton(im):
    """
    骨架提取
    :param im:
    :return:
    """
    thresh, im = cv.threshold(im, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
    # cv.imshow('binary.png', im)  # 控制背景为黑色
    dst = im.copy()

    num_erode = 0

    while True:
        if np.sum(dst) == 0:
            break
        kernel = cv.getStructuringElement(cv.MORPH_CROSS, (4, 4))
        dst = cv.erode(dst, kernel)
        num_erode = num_erode + 1

    skeleton = np.zeros(dst.shape, np.uint8)

    for x in range(num_erode):
        kernel = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
        dst = cv.erode(im, kernel, None, None, x)
        open_dst = cv.morphologyEx(dst, cv.MORPH_OPEN, kernel)
        result = dst - open_dst
        skeleton = skeleton + result
        # cv2.waitKey(1000)
    # cv.imshow("skeleton", skeleton)
    return skeleton

参考链接

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬着棒棒糖闯天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值