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

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

python+opencv怎么提取二值化图像中闭合的轮廓,图像中有很多噪点和曲线,曲线不是连着闭合的,要提取的物体是个螺钉形状,效果图红框的物体,怎么识别出来框出所在位置
原图:

img


效果图:

img

  • 写回答

6条回答 默认 最新

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

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

    解决方案

    提取二值化图像中闭合的轮廓,可以使用 OpenCV 库中的 findContours 函数。下面是一个示例代码:

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('image.jpg')
    
    # 二值化图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    
    # 找到轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 遍历轮廓
    for contour in contours:
        # 计算轮廓的面积
        area = cv2.contourArea(contour)
        # 计算轮廓的周长
        perimeter = cv2.arcLength(contour, True)
        # 计算轮廓的 solidity
        solidity = cv2.contourArea(contour) / (area * 1.0)
        # 如果轮廓是闭合的,且 solidity 大于 0.5,认为是螺钉形状
        if solidity > 0.5 and perimeter > 100:
            # 绘制轮廓
            cv2.drawContours(img, [contour], -1, (0, 255, 0), 2)
            # 计算轮廓的bounding box
            x, y, w, h = cv2.boundingRect(contour)
            # 绘制bounding box
            cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
    
    # 显示结果
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    这个代码首先读取图像,然后将图像转换为灰度图像,最后使用 findContours 函数找到轮廓。然后遍历轮廓,计算每个轮廓的面积、周长和 solidity,如果轮廓是闭合的,且 solidity 大于 0.5,认为是螺钉形状。最后绘制轮廓和bounding box。

    需要注意的是,这个代码只是一个示例,可能需要根据实际情况进行调整。例如,可以调整 solidity 的阈值,或者使用其他方法来检测螺钉形状。

    评论

报告相同问题?

问题事件

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