OpenCV提取轮廓生成mask后多余尖峰的去除方法咨询
轮廓提取后Mask多余尖峰去除方法
你提到的边缘残留尖峰可以通过以下两种简便方法处理,改动量都很小:

方案1:Mask形态学开运算(优先推荐,代码改动最小)
开运算逻辑是先腐蚀再膨胀,可以在几乎不改变主体轮廓面积的前提下,直接消除边缘的小型突出尖峰,仅需在绘制完mask后增加3行代码即可:
# 你原有绘制mask的代码保持不变 cv2.drawContours(mask, [cnt], 0, 255, -1) # 新增:开运算消除尖峰,核大小和迭代次数可以根据尖峰大小调整 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2) # 后续按位操作等原有逻辑保持不变 color = cv2.bitwise_and(img, img, mask=mask)
如果尖峰比较小,把核改成(3,3)、迭代次数设为1即可。
方案2:轮廓多边形近似(直接修剪轮廓,可控性更高)
如果不想修改生成后的mask,也可以在提取轮廓后直接对轮廓做平滑处理,去掉小的凸起拐点:
cnt = cntsSorted[n] # 新增:轮廓近似,epsilon参数越大平滑力度越强,一般取轮廓周长的0.001-0.01即可 epsilon = 0.005 * cv2.arcLength(cnt, True) approx_cnt = cv2.approxPolyDP(cnt, epsilon, True) # 用近似后的轮廓绘制mask cv2.drawContours(mask, [approx_cnt], 0, 255, -1)
如果需要保留轮廓的凹形特征不要选凸包处理,上面两种方案都不会改变轮廓的凹区特征。
内容的提问来源于stack exchange,提问作者jtodić
相关产品推荐
相关产品推荐

