美文网首页
Python:分割叶梗

Python:分割叶梗

作者: 大龙10 | 来源:发表于2025-04-15 06:09 被阅读0次

一、步骤

  1. 导入库:cv2, numpy, matplotlib等。

  2. 读取图像,转灰度。

  3. 高斯模糊。

  4. Canny边缘检测。

  5. 形态学闭运算。

  6. 查找轮廓,找到最大面积的轮廓。

  7. 创建掩膜,绘制该轮廓。

  8. 与原图叠加显示。

二、示例

import cv2
import numpy as np
import matplotlib.pyplot as plt

def extract_main_vein(image_path):
    # 读取图像
    img = cv2.imread(image_path)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 高斯模糊降噪
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    
    # Canny边缘检测
    edges = cv2.Canny(blurred, 50, 150)
    
    # 形态学闭运算(连接断裂部分)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25))
    closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
    
    # 查找轮廓
    contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 筛选最大轮廓(按面积)
    if contours:
        max_contour = max(contours, key=cv2.contourArea)
        
        # 创建掩膜
        mask = np.zeros_like(gray)
        cv2.drawContours(mask, [max_contour], -1, 255, thickness=cv2.FILLED)
        
        # 形态学腐蚀去除细小分支
        erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
        mask_eroded = cv2.erode(mask, erode_kernel, iterations=1)
        
        # 与原图叠加显示
        result = cv2.bitwise_and(img_rgb, img_rgb, mask=mask_eroded)
        
        # 显示结果
        plt.figure(figsize=(12, 6))
        
        plt.subplot(131)
        plt.imshow(img_rgb)
        plt.title('Original Image')
        plt.axis('off')
        
        plt.subplot(132)
        plt.imshow(mask_eroded, cmap='gray')
        plt.title('Main Vein Mask')
        plt.axis('off')
        
        plt.subplot(133)
        plt.imshow(result)
        plt.title('Segmentation Result')
        plt.axis('off')
        
        plt.tight_layout()
        plt.show()
    else:
        print("未检测到轮廓")

# 使用示例
image_path =r'd:/imgs/bak5/my_img01-B2.jpg'
extract_main_vein(image_path)

三、参数调整建议:

  • 高斯模糊核大小((5,5)):可尝试3-15之间的奇数值

  • Canny阈值(50, 150):根据图像对比度调整

  • 闭运算核大小(25,25):根据主梗宽度调整

  • 腐蚀核大小(15,15):根据分支粗细调整

四、注意事项:

  • 确保图像背景与烟叶对比度较高

  • 主梗应保持相对完整的形态

  • 如果效果不理想,可尝试:

    • 调整形态学操作的核大小
    • 修改Canny阈值参数
    • 尝试不同的颜色空间处理(如HSV通道分离)

相关文章

  • python文件分割,列表分割

    问题描述 python分割文件或列表作为多线程,多进程输入 解决方案 文件分割(利用pandas) path为文件...

  • Python 基础语法

    Python 开发环境搭建 Anaconda 安装 Sublime 安装 Python 使用缩进方式分割代码块 模...

  • 使用多个分隔符分隔字符串

    python 多分隔符分隔字符串 python内建split方法不能使用多个分割符来分割字符串,可以使用re模块的...

  • Python 文件读写

    或者 或者使用Python内置函数 .strip() 和 .split()函数,进行分割比如:由于在python...

  • python 分割列表

    输出 [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] 写成方法

  • python日志分割

    按文件大小分割:RotatingFileHandler按时间分割:TimedRotatingFileHandler

  • 竖着的茶叶梗

    还记得小时候,和奶奶在一起是最幸福的时光。 奶奶会在午后泡一壶茉莉花茶。浓浓的茶汤,香气四溢。每次都会有茶梗随着长...

  • 红薯叶梗的回忆

    刚刚看到一篇关于红薯叶梗的文章,突然让我想起了小时候隔壁的那个姐姐。 还清晰记得第一次吃炒红薯叶,是在隔壁一个姐姐...

  • TensorFlow 计算机图像视觉算法模型

    目标跟踪轨迹/目标检测/实例分割/语义分割 由于需要使用 python 开发,使用到机器学习和深度学习框架。作为小...

  • Ansible 开发Filters插件之【split】

    需求 实现python的字符串分割 实现re的正则表达式分割 Filter 类 所有的filter类都是上诉构造 ...

网友评论

      本文标题:Python:分割叶梗

      本文链接:https://www.haomeiwen.com/subject/ujdnvjtx.html