如何在OpenCV中填充轮廓小间隙且不填充大色块
解决方案
要实现只填充小间隙、保留大空白区域的需求,核心思路是通过轮廓面积区分小间隙和大区域,只对面积小于设定阈值的轮廓进行填充,大轮廓仅绘制边缘或不处理。
修改后的代码
import cv2 import numpy as np input_image = cv2.imread(img, cv2.IMREAD_GRAYSCALE) # 确保读为灰度图 _retval, thresh = cv2.threshold(input_image, 125, 255, cv2.THRESH_BINARY_INV) # 若间隙为黑色区域,需反转阈值,可根据实际图像调整 contours, hierarchy = cv2.findContours(image=thresh, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) output = np.zeros((input_image.shape[0], input_image.shape[1], 3), dtype=np.uint8) # 设置面积阈值,根据图像尺寸和间隙大小自行调整,示例值为200 area_threshold = 200 for contour in contours: area = cv2.contourArea(contour) if area < area_threshold: # 填充小间隙 cv2.drawContours(output, [contour], 0, (255, 0, 0), thickness=cv2.FILLED) else: # 大轮廓仅绘制边缘,内部保持空白 cv2.drawContours(output, [contour], 0, (255, 0, 0), thickness=3)
关键说明
- 轮廓面积筛选:用
cv2.contourArea(contour)计算每个轮廓的面积,通过阈值筛选出小间隙(面积较小的轮廓)。阈值需根据实际图像测试调整,比如从100、200开始尝试,找到最匹配的数值。 - 阈值反转调整:若原始二值图中间隙是黑色区域,需用
cv2.THRESH_BINARY_INV反转阈值,让间隙成为可被检测的前景轮廓。 - 透明背景优化(可选):如果需要真正的透明背景,可创建带Alpha通道的4通道图像,大轮廓内部保持透明:
# 创建带Alpha通道的透明输出图像 output = np.zeros((input_image.shape[0], input_image.shape[1], 4), dtype=np.uint8) # 填充小间隙时,Alpha通道设为255(不透明) cv2.drawContours(output, [contour], 0, (255, 0, 0, 255), thickness=cv2.FILLED) # 大轮廓边缘设为不透明,内部保持Alpha=0(透明) cv2.drawContours(output, [contour], 0, (255, 0, 0, 255), thickness=3)
内容的提问来源于stack exchange,提问作者afkvision
相关产品推荐
相关产品推荐

