OpenCV如何绘制无填充轮廓?解决数字提取的填充问题
解决OpenCV绘制数字轮廓时填充内部封闭区域的问题
针对0、8这类带封闭区域的数字,使用cv.FILLED填充轮廓会导致内部被填满的问题,你可以通过以下两种方法解决:
方法1:直接绘制轮廓线条而非填充
放弃使用cv.FILLED,改为设置合适的thickness参数(数值根据图像尺寸调整,比如2或3),这样只会绘制轮廓的边缘线条,不会填充内部区域:
cv.drawContours(black_img, [contour_num], -1, (255, 255, 255), thickness=2)
方法2:利用轮廓层级区分内外轮廓,实现空心填充
如果需要保留填充后的数字形状但挖空内部封闭区域,可以通过轮廓层级(hierarchy)筛选外轮廓和内轮廓,先填充外轮廓为白色,再用黑色填充内轮廓:
- 查找轮廓时指定
cv.RETR_CCOMP模式以获取完整的层级信息:
contours, hierarchy = cv.findContours(gray_img, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
- 遍历轮廓并根据层级判断类型,分别处理:
black_img = np.zeros_like(gray_img) for idx, contour in enumerate(contours): # hierarchy[0][idx][3] == -1 表示当前是外轮廓 if hierarchy[0][idx][3] == -1: cv.drawContours(black_img, [contour], 0, 255, cv.FILLED) # 否则是内轮廓,用黑色填充挖空 else: cv.drawContours(black_img, [contour], 0, 0, cv.FILLED)
这个方法会让0、8这类数字保留原本的空心结构,不会变成实心块。
内容的提问来源于stack exchange,提问作者David Pileček
相关产品推荐
相关产品推荐

