You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:30:12