Python中如何查找二值图像外轮廓凸起的起伏并去除多余凸起
二值图像柄状凸起去除解决思路
以下是可直接落地的实现思路:
- 连通域特征过滤法
调用cv2.connectedComponentsWithStats()接口统计所有前景连通域的面积、长宽比、最小外接矩形占空比特征,柄状凸起的面积远小于主目标、且长宽比远高于主目标,设定对应阈值过滤掉不符合主目标特征的连通域,将过滤掉的区域填充为背景色即可实现凸起去除。该方法适合凸起与主目标无大面积粘连的场景。 - 形态学操作法
针对边缘细长凸起,可选用形态学开运算:先用尺寸略大于凸起宽度的矩形/十字形结构元素做腐蚀,消除边缘细凸起,再用同尺寸结构元素做膨胀恢复主目标的原有尺寸。如果凸起形状规则,也可使用cv2.morphologyEx()搭配MORPH_HITMISS击中击不中变换,自定义匹配凸起形状的结构元素,精准识别并消除目标凸起。 - 轮廓优化法
先用cv2.findContours()提取主目标的外轮廓,若主目标本身为近似凸形,直接调用cv2.convexHull()生成凸包,用凸包区域替换原前景区域即可消除所有边缘不规则凸起;若主目标允许少量轮廓平滑,也可调用cv2.approxPolyDP()对轮廓做多边形拟合,剔除轮廓上对应凸起的微小拐点,再重新填充拟合后的轮廓得到目标结果。 - 距离变换法
先对二值前景做距离变换得到每个像素到最近背景点的距离值,设置阈值保留距离值高于阈值的核心前景区域,再对核心区域做适当膨胀恢复主目标的近似尺寸。细长凸起区域的像素距离背景更近,距离变换值普遍低于阈值,会在第一步被过滤,该方法无需提前知道凸起的精确形状,适配性较强。
内容的提问来源于stack exchange,提问作者Apurva Sinha
相关产品推荐
相关产品推荐

