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

如何基于OpenCV识别灰色矩形黑色污渍并实现批量图像筛选

灰色矩形区域黑色污渍检测实现方案

核心实现逻辑

你已经完成了二值化步骤将污渍转为白色前景,后续通过cv2.connectedComponentsWithStats做连通域分析即可完成筛选,具体实现如下:

import numpy 
import matplotlib.pyplot as plt
import cv2
import os

# 可调整的参数
MIN_STAIN_AREA = 20  # 最小污渍面积,小于该值判定为噪点,可根据实际样本调整
# 如果灰色矩形区域固定位置,可直接设置ROI坐标,格式为[y_start:y_end, x_start:x_end]
# ROI = (100:800, 200:1200) 

def has_stain(img_path):
    img = cv2.imread(img_path)
    # 如果有固定ROI,先裁剪区域
    # img = img[ROI[0], ROI[1]]
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_bin = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                   cv2.THRESH_BINARY_INV, 131, 15)
    # 连通域分析
    num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(img_bin, connectivity=8)
    # 跳过背景(索引0为背景),遍历所有前景连通域
    for i in range(1, num_labels):
        area = stats[i, cv2.CC_STAT_AREA]
        # 面积大于阈值判定为有效污渍
        if area >= MIN_STAIN_AREA:
            return True
    return False

# 批量遍历图片文件夹示例
image_folder = r"F:\your_image_folder"
stain_images = []
normal_images = []
for file_name in os.listdir(image_folder):
    if file_name.lower().endswith(('.png', '.jpg', '.tif', '.tiff')):
        file_path = os.path.join(image_folder, file_name)
        if has_stain(file_path):
            stain_images.append(file_name)
        else:
            normal_images.append(file_name)

print(f"检测到污渍图片共{len(stain_images)}张,清单:{stain_images}")

效果验证参考样本

  • 污渍样本图:
    污渍样本图
  • 污渍标记图:
    污渍标记图
  • 二值化效果:
    二值图
  • 无污渍样本图(不会被筛选):
    无污渍矩形样本图

调优建议

  • 如果存在灰色矩形外的区域干扰检测,可先通过颜色阈值提取灰色矩形区域生成掩码,和二值图做与运算后再做连通域分析,排除外部干扰
  • 不同批次图片如果光照差异大,可适当调整自适应阈值的块大小(代码中131)和偏移量(代码中15),保证二值化效果稳定
  • MIN_STAIN_AREA可根据实际污渍的最小尺寸调整,避免漏检或误检噪点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:06:01