刘虾 2025-06-02 06:03 采纳率: 49.4%
浏览 13
已结题

python+opencv怎么提取二值化图像中闭合的轮廓

python+opencv怎么提取二值化图像中闭合的轮廓,图像中有很多噪点和曲线,曲线不是连着闭合的,要提取的物体是个螺钉形状的,我用形态学梯度形成轮廓,螺钉在图像呈t字形,不是真的t字形,下面不是尖尖的,形状就是图片红框那种,下面螺柱是白色填充的,怎么识别出来画出所在位置

img

img

img

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-06-02 06:03
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    提取二值化图像中闭合的轮廓

    你可以使用 OpenCV 库中的 findContours 函数来提取轮廓,然后使用 approxPolyDP 函数来近似轮廓,最后使用 isContourConvex 函数来判断轮廓是否闭合。

    以下是一个示例代码:

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
    
    # 二值化图像
    _, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    
    # 形态学梯度
    grad = cv2.morphologyEx(thresh, cv2.MORPH_GRADIENT, np.ones((3, 3)))
    
    # 提取轮廓
    contours, _ = cv2.findContours(grad, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 近似轮廓
    approx_contours = []
    for contour in contours:
        epsilon = 0.02 * cv2.arcLength(contour, True)
        approx = cv2.approxPolyDP(contour, epsilon, True)
        approx_contours.append(approx)
    
    # 判断轮廓是否闭合
    closed_contours = []
    for approx in approx_contours:
        if cv2.isContourConvex(approx):
            closed_contours.append(approx)
    
    # 绘制闭合轮廓
    cv2.drawContours(img, closed_contours, -1, (0, 255, 0), 2)
    cv2.imshow('Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    这个代码首先读取图像,然后将图像二值化,接着使用形态学梯度来提取轮廓。然后使用 findContours 函数来提取轮廓,使用 approxPolyDP 函数来近似轮廓,最后使用 isContourConvex 函数来判断轮廓是否闭合。最后绘制闭合轮廓。

    需要注意的是,这个代码只是一个示例,可能需要根据实际情况进行调整。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月13日
  • 修改了问题 6月2日
  • 修改了问题 6月2日
  • 创建了问题 6月2日