• Python,图像处理,骨架线,中轴线


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2301_77755930 2024-04-24 21:04 采纳率: 54.5% 浏览 0 首页/ 编程语言 / Python,图像处理,骨架线,中轴线 python 利用Python对以上二值图中白色的纤维目标,在原图绘制中轴线,首先对原图进行轮廓细化处理,提取出骨架线,同时对于骨架线上的毛刺进行去除,只保留主干骨架线,然后将提取的骨架线绘制到原图白色纤维轮廓内部。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 码农阿豪 Java领域优质创作者 2024-04-24 21:21
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      问题分析:
      1. 如何对图片进行轮廓细化处理?
      2. 如何提取出骨架线?
      3. 如何去除骨架线上的毛刺?
      4. 如何将骨架线绘制到原图内部? 解决方案:
      5. 对于二值图像,可以使用opencv中的函数cv2.ximgproc.thinning()进行轮廓细化处理。代码示例:
      import cv2
      img = cv2.imread("image.png", 0)
      thinned_img = cv2.ximgproc.thinning(img, None, cv2.ximgproc.THINNING_ZHANGSUEN)
      
      1. 提取出骨架线,可以使用opencv中的函数cv2.connectedComponents()。可以通过遍历像素的方式,判断其是否为端点或交叉点,然后在骨架线上将其标记为白色像素。
      import numpy as np
      # 寻找端点和交叉点的函数
      def find_junctions(endpoint_img, kernel=None):
          if kernel is None:
              kernel = np.ones((3, 3), np.uint8)
          junctions = np.zeros_like(endpoint_img)
          connected = cv2.connectedComponents(endpoint_img)
          labels = connected[1]
          junction_values = []
          for i in range(1, connected[0]):
              g = (labels == i)
              num = np.sum(g)
              if num == 1:
                  junctions[g] = 1
                  junction_values.append((np.argmax(g) // labels.shape[1], np.argmax(g) % labels.shape[1]))
              elif num > 2:
                  junctions[g] = 1
                  junction_values.append((np.argmax(g) // labels.shape[1], np.argmax(g) % labels.shape[1]))
          junctions = cv2.dilate(junctions, kernel, iterations=1)
          junctions = junctions - endpoint_img
          return junctions, junction_values
      # 提取骨架线的函数
      def get_skeleton(img):
          skel = np.zeros_like(img)
          img = img.copy()
          while True:
              endpoint_img = cv2.morphologyEx(img, cv2.MORPH_HITMISS, np.array([[0, 0, 0], [0, 1, 0], [1, 1, 1]]))
              if np.sum(endpoint_img) == 0:
                  break
              junctions_img, _ = find_junctions(endpoint_img)
              skel = skel + endpoint_img
              img = cv2.subtract(img, endpoint_img)
              img = cv2.subtract(img, junctions_img)
          return skel
      img = cv2.imread("image.png", 0)
      thinned_img = cv2.ximgproc.thinning(img, None, cv2.ximgproc.THINNING_ZHANGSUEN)
      skeleton = get_skeleton(thinned_img)
      
      1. 对于骨架线上的毛刺,可以通过以下代码进行处理:
      def clean_skeleton(skeleton):
          kernel1 = np.array([[-1, -1, -1], [0, 1, 0], [1, 1, 1]], dtype=np.uint8)
          kernel2 = np.array([[1, 1, 1], [0, 1, 0], [-1, -1, -1]], dtype=np.uint8)
          skeleton = cv2.morphologyEx(skeleton, cv2.MORPH_OPEN, kernel1)
          skeleton = cv2.morphologyEx(skeleton, cv2.MORPH_OPEN, kernel2)
          return skeleton
      skeleton = clean_skeleton(skeleton)
      
      1. 将骨架线绘制到原图内部,则可以使用opencv中的函数cv2.drawContours(),示例代码:
      edged = cv2.Canny(img, 50, 150)
      thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 21, 1)
      cv2.drawContours(thresh, [skeleton], 0, (255, 255, 255), -1)
      cv2.imshow("Final Result", thresh)
      cv2.waitKey(0)
      cv2.destroyAllWindows()
      

      展开全部

      评论
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      Vue封装一个按钮组件(不使用框架)
      SVG循环滑动效果
      【案例】分页符el-pagination
      tomcat部署war包访问显示404
      VS使用openFileDialog读写txt和bin文件(C#语言)
      链上治理为何如此重要,波卡Gov 2.0又会如何引领链上治理的发展?
      结对编程 --- 大部分程序员喜欢的编程方式
      GemBox.Bundle 45.X Crack-2022-09
      FANUC机器人电气控制柜内部硬件电路和模块详细介绍
      基于ABP实现DDD--仓储实践
    • 原文地址:https://ask.csdn.net/questions/8094383