如何去除图像中多余小轮廓,仅保留四个橙色圆环轮廓?
解决方案
核心优化方向
要精准保留四个橙色圆环轮廓,需从掩码降噪和轮廓筛选两个环节入手:
- 先通过形态学操作清理掩码中的微小噪声
- 再按轮廓面积阈值过滤,只保留对应圆环的大轮廓
优化后代码
import cv2 from google.colab.patches import cv2_imshow img = cv2.imread("rings.png") hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 橙色HSV范围(可根据实际图像微调) mask = cv2.inRange(hsv, (10, 100, 20), (25, 255, 255)) # 形态学开运算:先腐蚀后膨胀,消除掩码中小噪点 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) mask_clean = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 提取最外层轮廓(避免提取圆环内部的小轮廓) contours, hierarchy = cv2.findContours(mask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 按面积过滤轮廓:只保留面积足够大的轮廓(噪声轮廓面积远小于圆环) filtered_contours = [] area_threshold = 1000 # 可根据图像实际尺寸微调 for cnt in contours: if cv2.contourArea(cnt) > area_threshold: filtered_contours.append(cnt) # 绘制筛选后的目标轮廓 result_img = cv2.drawContours(img.copy(), filtered_contours, -1, (0,255,0), 2) cv2_imshow(mask_clean) cv2_imshow(result_img)
关键细节说明
- 形态学开运算:5x5矩形核能高效清除掩码中的微小白点噪声,避免这些噪点被识别为无效轮廓
- 轮廓提取模式:
cv2.RETR_EXTERNAL仅提取最外层轮廓,跳过圆环内部的空心区域轮廓 - 面积阈值:根据你的图像尺寸调整数值,确保刚好过滤掉所有小噪声,同时保留四个圆环轮廓
内容的提问来源于stack exchange,提问作者EpicGamer123
相关产品推荐
相关产品推荐

