去除分叉轮廓

去除分叉轮廓

思路来源于https://blog.csdn.net/weixin_39639550/article/details/111624935,但是使用不同的方法进行实现,实际测试发现仅对特定轮廓有效,不具有通用性,仅供参考。

示例代码

python 复制代码
import numpy as np
import cv2
from copy import deepcopy

def get_contour_remove_fork(mask_path):
    mask = cv2.imread(mask_path, 0)
    # 找到轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    mask_convex = deepcopy(mask)
    # 遍历所有轮廓
    for contour in contours:
        # 计算轮廓的凸包
        hull = cv2.convexHull(contour)

        # 可以选择绘制凸包
        mask_convex = cv2.drawContours(
            mask_convex, [hull], -1, 
            255, -1
        )
    
    mask_convex_remove_raw_contour = deepcopy(mask_convex)
    mask_convex_remove_raw_contour[mask == 255] = 0
    # 腐蚀
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    mask_convex_remove_raw_contour = cv2.erode(
        mask_convex_remove_raw_contour, 
        kernel, iterations=1
    )
    # # 获取最大的轮廓
    contours, _ = cv2.findContours(
        mask_convex_remove_raw_contour, 
        cv2.RETR_EXTERNAL, 
        cv2.CHAIN_APPROX_SIMPLE
    )
    # print(len(contours))
    
    max_contour = max(contours, key=cv2.contourArea)
    # 获取最大轮廓

    # 绘制最大的轮廓
    mask_convex_remove_raw_contour_max_contour = cv2.drawContours(
        np.zeros_like(mask_convex_remove_raw_contour), 
        [max_contour], 
        -1, 
        255, 
        -1
    )

    # 膨胀
    kernel_size = 20
    kernel = cv2.getStructuringElement(
        cv2.MORPH_RECT, (kernel_size, kernel_size)
    )
    mask_convex_remove_raw_contour_dilate = cv2.dilate(
        mask_convex_remove_raw_contour_max_contour, 
        kernel, iterations=1
    )

    # 与原图取交集
    mask_dst = cv2.bitwise_and(mask, mask_convex_remove_raw_contour_dilate)
    return mask_dst
if __name__ == '__main__':
    mask_path = "./test.png"
    mask_remove_fork = get_contour_remove_fork(mask_path)
    mask_remove_fork_path = ".test_remove_fork.png"
    cv2.imwrite(mask_remove_fork_path, mask_remove_fork)

相关图示例

原图

凸包后对原图非零像素对应位置取0

最终效果图

相关推荐
懷淰メ34 分钟前
【AI加持】基于PyQt+YOLO+DeepSeek的安全帽检测系统(详细介绍)
yolo·目标检测·计算机视觉·pyqt·安全帽检测·deepseek·安全帽
西域情歌38 分钟前
YOLO26推理部署教程:图片/视频/摄像头全流程详解
目标检测·计算机视觉·yolo26·星图gpu
星辰徐哥38 分钟前
OpenCV入门:Windows系统下OpenCV的安装与环境配置
人工智能·windows·opencv
光泽雨1 小时前
VM图像处理(图像增强锐化、对比度、Gamma校正、亮度校正)
图像处理·人工智能·计算机视觉
格林威2 小时前
堡盟Baumer VCX系列工业相机供电与触发:网口(GigE) vs USB3.0
开发语言·人工智能·数码相机·计算机视觉·视觉检测·工业相机·高速相机
三毛的二哥2 小时前
BEV:感知抖动问题及解决办法
人工智能·算法·计算机视觉
Jun6262 小时前
【树莓派】opencv水滴接触角测量
人工智能·opencv·计算机视觉
格林威3 小时前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附Python实战演示
开发语言·人工智能·python·数码相机·计算机视觉·视觉检测·工业相机
格林威4 小时前
面阵相机 vs 线阵相机:堡盟与大恒相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
纤纡.4 小时前
解锁 Python 实用编程技巧:线程、视觉识别、正则匹配与装饰器实战
开发语言·python·深度学习·opencv