如何基于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
相关产品推荐
相关产品推荐

