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

python+opencv怎么提取二值化图像中闭合的轮廓,图像中有很多噪点和曲线,曲线不是连着闭合的,要提取的物体是个螺钉形状的

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

img

img

  • 写回答

5条回答 默认 最新

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

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

    解决方案

    提取二值化图像中闭合的轮廓,需要考虑噪点和曲线的影响。下面是一些可能有用的步骤:

    1. 形态学处理:使用形态学操作来去除噪点和小的不规则形状。例如,使用 cv2.morphologyEx 函数,使用 cv2.MORPH_OPEN 操作来去除噪点。
    2. 轮廓检测:使用 cv2.findContours 函数来检测轮廓。设置 mode 参数为 cv2.RETR_EXTERNAL 可以检测外部轮廓。
    3. 轮廓过滤:使用轮廓的属性来过滤不想要的轮廓。例如,使用 cv2.arcLength 函数来计算轮廓的长度,如果长度小于某个阈值,可以认为是噪点。
    4. 轮廓拟合:使用轮廓拟合算法来拟合螺钉形状的轮廓。例如,使用 cv2.approxPolyDP 函数来拟合轮廓。

    下面是一个简单的示例代码:

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
    
    # 形态学处理
    kernel = cv2.getStructElement(cv2.MORPH_ELLIPSE, (3, 3))
    img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)
    
    # 轮廓检测
    contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 轮廓过滤
    for contour in contours:
        area = cv2.contourArea(contour)
        if area < 100:  # 设置阈值
            continue
        # 轮廓拟合
        approx = cv2.approxPolyDP(contour, 0.02 * cv2.arcLength(contour, True), True)
        if len(approx) > 4:  # 设置阈值
            cv2.drawContours(img, [approx], -1, (0, 255, 0), 2)
    
    # 显示结果
    cv2.imshow('Result', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    这个示例代码中,我们首先使用形态学处理来去除噪点,然后检测轮廓,过滤不想要的轮廓,最后使用轮廓拟合算法来拟合螺钉形状的轮廓。

    评论

报告相同问题?

问题事件

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