使用OpenCV实现数字识别时如何过滤检测到的无关轮廓
针对OpenCV数字识别轮廓过滤与准确率提升的解决方案
一、无关噪声轮廓过滤方案
- 轮廓尺寸过滤:统计测试样本中数字的合理面积、宽高比区间,遍历轮廓时直接筛除不符合区间的无效轮廓,可过滤90%以上的细碎噪声轮廓,参考代码加在
x,y,w,h = cv.boundingRect(c)之后:
area = cv.contourArea(c) aspect_ratio = w / float(h) # 阈值可根据自身数据集调整,以下为手写数字通用参考值 if not (20 < area < 1000 and 0.4 < aspect_ratio < 2.2): continue
- 阈值后形态学处理:自适应阈值生成后加开运算(先腐蚀再膨胀),直接消除细碎噪点,参考代码加在
thresh生成之后:
kernel = np.ones((2,2), np.uint8) thresh = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=1)
- 自适应阈值参数动态调整:不要固定blockSize,可根据图像分辨率自适应选择,比如分辨率低于600*400用3,高于该分辨率用5/7,C值也可根据图像平均亮度微调,避免光照不均带来的额外噪点。
二、RETR_EXTERNAL仍出现嵌套轮廓的原因与解决
该现象不属于层级嵌套,本质是阈值处理后数字边缘断裂,原本属于同一个数字的轮廓断裂为多个独立的最外层轮廓,因此会被RETR_EXTERNAL全部检测到,修复方案:
- 形态学处理环节增加一次闭运算(先膨胀再腐蚀),填补数字边缘的小缺口,避免轮廓断裂:
thresh = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel, iterations=1)
- 若仍存在多框同个数字的问题,可增加轮廓重叠判断:计算两个轮廓的交并比,交并比超过0.6的保留面积更大的轮廓即可。
三、识别准确率低的优化方案
当前预处理未对齐训练集规则、未做畸变矫正,是识别错误的核心原因,优化点如下:
- 增加轮廓中心对齐:提取数字轮廓的矩计算中心坐标,pad时将数字对齐到图像中心,而非直接四周补边。
- 增加倾斜矫正:计算轮廓最小外接矩形的倾斜角度,将数字转正后再做resize,避免倾斜带来的特征偏差。
- 若使用MNIST数据集训练模型,需保证预处理逻辑与MNIST对齐:MNIST样本为黑底白字、周围保留2px留白,预处理不一致会导致识别准确率大幅下降。
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

