如何使用Python的OpenCV为指甲数据集的所有图像设置统一背景色
解决方案
你可以通过HSV颜色空间分割提取指甲区域,再将非指甲区域替换为统一纯色的方案实现需求,全程保留224*224的图像尺寸不变。以下是修改后的完整预处理代码:
import numpy as np import pandas as pd import cv2 import pathlib # 补充原代码遗漏的依赖导入 # 挂载Google Drive from google.colab import drive drive.mount('/content/gdrive') root_path = 'gdrive/My Drive/Dataset/' dataset_dir = pathlib.Path(root_path) # 构造图像路径字典和标签对应字典,可自行扩展其他疾病分类 nail_disease_images_dict = { 'clubbing': list(dataset_dir.glob('clubbing/*')), # 其他分类按格式添加即可 } nail_disease_labels_dict = { 'clubbing': 0, # 其他分类对应标签按格式添加即可 } # 背景替换函数 def replace_background(img, bg_color=(255,255,255)): # 将BGR格式转为HSV格式方便颜色分割 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 指甲属于肤色范围,设置HSV肤色阈值,可根据实际数据集调整 lower_skin = np.array([0, 30, 70], dtype=np.uint8) upper_skin = np.array([20, 255, 255], dtype=np.uint8) # 生成指甲区域掩码 mask = cv2.inRange(hsv, lower_skin, upper_skin) # 掩码取反得到背景区域 bg_mask = cv2.bitwise_not(mask) # 替换背景为指定纯色 img[bg_mask == 255] = bg_color return img image_list, classes = [], [] IMG_WIDTH=224 IMG_HEIGHT=224 for disease_name, images in nail_disease_images_dict.items(): for image in images: img = cv2.imread(str(image)) resized_img = cv2.resize(img,(IMG_WIDTH,IMG_HEIGHT)) # 调用背景替换函数处理 processed_img = replace_background(resized_img) image_list.append(processed_img) classes.append(nail_disease_labels_dict[disease_name])
参数调整说明
- 分割阈值:如果部分图像的指甲分割效果不佳,可适当调整
lower_skin和upper_skin的数值,适配不同光照、色调的图像 - 背景颜色:修改
replace_background函数的bg_color参数即可更换统一背景色,参数格式为BGR顺序,比如(240,240,240)对应浅灰色
内容的提问来源于stack exchange,提问作者Pramodi Samaratunga
相关产品推荐
相关产品推荐

