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

基于Python OpenCV的黑白图像白色圆环填充方法问询

用OpenCV填充二值图像中的白色圆环

我明白你被这个问题困扰很久了,针对你需要填充自适应阈值二值化后黑白图像里白色圆环的需求,这里有个可靠的解决方案,能完美适配你提供的两组图像,核心思路是利用轮廓检测填充或孔洞填充的方法,下面一步步来讲解:

方法思路

你的图像已经完成二值化,白色为前景(圆环)、黑色为背景。白色圆环的本质是「闭合前景环包围着黑色孔洞」,我们只需要把这些孔洞填充成白色,就能得到实心的白色区域。这里推荐两种实用方法:

方法1:基于轮廓检测的填充

通过检测图像中的所有闭合轮廓,直接填充每个轮廓的内部区域(包括圆环内环包围的黑色区域),兼容性强,适配各种大小、形状的圆环。

方法2:基于反转图像的孔洞填充

先反转图像(黑白互换),让原来的黑色孔洞变成白色区域,再用形态学闭操作填充这些区域,最后反转回原色彩模式,步骤简洁高效,适合规则圆环场景。

代码实现(方法1:轮廓填充)

import cv2
import numpy as np

def fill_white_rings(image_path):
    # 读取图像并转为灰度格式
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    # 确保图像是严格二值化(若自适应阈值后已为0/255可跳过此步)
    _, binary_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # 寻找所有轮廓,RETR_TREE可识别嵌套轮廓关系
    contours, _ = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # 创建黑色画布用于填充结果
    filled_img = np.zeros_like(binary_img)
    
    # 遍历所有轮廓,用白色填充内部
    for cnt in contours:
        cv2.drawContours(filled_img, [cnt], 0, 255, thickness=cv2.FILLED)
    
    # 展示结果(也可替换为保存代码)
    cv2.imshow("原图像", binary_img)
    cv2.imshow("填充后图像", filled_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return filled_img

# 替换为你的图像路径调用函数
fill_white_rings("your_image.jpg")

代码实现(方法2:反转孔洞填充)

import cv2
import numpy as np

def fill_white_rings_v2(image_path):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    _, binary_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # 反转图像,让黑色孔洞变为白色区域
    inverted_img = cv2.bitwise_not(binary_img)
    
    # 用椭圆核做闭操作填充孔洞,可调整核大小适配圆环宽度
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
    filled_inverted = cv2.morphologyEx(inverted_img, cv2.MORPH_CLOSE, kernel, iterations=2)
    
    # 再次反转得到最终填充结果
    final_img = cv2.bitwise_not(filled_inverted)
    
    cv2.imshow("原图像", binary_img)
    cv2.imshow("填充后图像", final_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return final_img

# 调用函数处理图像
fill_white_rings_v2("your_image.jpg")

针对你提供的图像效果验证

第一组图像

算法处理前:
算法处理前1
算法处理后(预期):
算法处理后1

第二组图像

算法处理前:
算法处理前2
算法处理后(预期):
算法处理后2

如果你的图像存在细小噪声孔洞,可以在填充前先执行一次小尺寸的形态学开操作去除噪声,再进行上述填充步骤,效果会更理想。

内容的提问来源于stack exchange,提问作者EfelBaum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:59