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

效果图:

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


阿里嘎多学长整理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 的阈值,或者使用其他方法来检测螺钉形状。