如何使用OpenCV批量统一指甲数据集图片背景以测试CNN模型准确率
指甲数据集统一背景色批量处理方案
核心调整思路:原有代码仅针对白色背景做筛选替换,要适配任意背景的逻辑改为反向筛选保留指甲区域,其余所有区域统一替换为指定背景色,无需识别原背景的颜色范围。
原数据集与代码效果示例:
数据集示例图:
原代码输入:
原代码输出:
完整可运行代码
import cv2 import numpy as np import os import skimage.exposure # -------------------------- 可调整参数 -------------------------- # 输入数据集文件夹路径 INPUT_DIR = "your/input/dataset/path" # 处理后图片输出文件夹路径 OUTPUT_DIR = "your/output/path" # 目标背景色,BGR格式,默认黑色(0,0,0),可自行修改 TARGET_BG_COLOR = (0, 0, 0) # 指甲区域HSV阈值范围,可根据实际数据集情况调整 NAIL_HSV_LOW = (0, 40, 50) NAIL_HSV_HIGH = (25, 255, 255) # ---------------------------------------------------------------- def process_single_image(img_path, save_path): img = cv2.imread(img_path) if img is None: return hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 生成指甲前景掩码 mask = cv2.inRange(hsv, NAIL_HSV_LOW, NAIL_HSV_HIGH) # 形态学操作优化掩码 kernel = np.ones((3,3), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 抗锯齿处理 mask = cv2.GaussianBlur(mask, (0,0), sigmaX=3, sigmaY=3, borderType = cv2.BORDER_DEFAULT) mask = skimage.exposure.rescale_intensity(mask, in_range=(127.5,255), out_range=(0,255)) # 替换背景 result = np.full_like(img, TARGET_BG_COLOR) # 把指甲区域贴到目标背景上 result[mask > 0] = img[mask > 0] cv2.imwrite(save_path, result) if __name__ == "__main__": # 自动创建输出文件夹 if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) # 支持的图片格式,可自行补充 img_suffix = ['.jpg', '.jpeg', '.png', '.bmp'] # 遍历输入文件夹批量处理 for filename in os.listdir(INPUT_DIR): suffix = os.path.splitext(filename)[-1].lower() if suffix in img_suffix: input_path = os.path.join(INPUT_DIR, filename) output_path = os.path.join(OUTPUT_DIR, filename) process_single_image(input_path, output_path) print("所有图片处理完成")
参数调整说明
- 路径配置:将
INPUT_DIR改为你的原始数据集文件夹路径,OUTPUT_DIR改为处理后图片的保存路径 - 背景色修改:
TARGET_BG_COLOR为BGR格式的颜色值,比如要改为白色就设置为(255,255,255),灰色设置为(128,128,128) - 阈值优化:如果出现指甲被误替换、或者背景残留的情况,可微调
NAIL_HSV_LOW和NAIL_HSV_HIGH的三个参数,适配你的数据集指甲颜色范围
内容的提问来源于stack exchange,提问作者Pramodi Samaratunga
相关产品推荐
相关产品推荐




