如何使用skimage加载同文件夹下的jpg与png格式图像数据
单目录下分格式加载图像数据集实现
参考原始示例代码
seed = 42 np.random.seed = seed Img_Width=128 Img_Height=128 Img_Channel = 3 Train_Path = 'stage1_train/' Test_Path = 'stage1_test/' train_ids = next(os.walk(Train_Path))[1] test_ids = next(os.walk(Test_Path))[1] print(train_ids) X_train = np.zeros((len(train_ids), Img_Height, Img_Width, Img_Channel),dtype=np.uint8) Y_train = np.zeros((len(train_ids),Img_Height, Img_Width, 1), dtype=bool)
问题背景
以上为参考示例代码,需求为基于该代码逻辑加载自有数据集:
- 所有图像存储在单个文件夹下,无嵌套子目录,路径为
F:\segmentation\ISBI2016_ISIC_Part3B_Training_Data\ISBI2016_ISIC_Part3B_Training_Data_1 - 文件夹内同时存在
.jpg、.png两种格式文件,需要将两类图像分别加载到两个独立变量中 - Python代码文件存放在
F:\segmentation路径下
实现代码
原示例用os.walk取子文件夹列表的逻辑不适用单目录场景,直接扫描目标目录下的指定后缀文件即可,代码如下:
import os import numpy as np import cv2 # 固定随机种子 seed = 42 np.random.seed(seed) # 统一输入图像尺寸 Img_Width = 128 Img_Height = 128 Img_Channel = 3 # 数据集路径,代码在segmentation目录下,优先用相对路径,路径前加r避免Windows反斜杠转义 DATA_PATH = r'ISBI2016_ISIC_Part3B_Training_Data\ISBI2016_ISIC_Part3B_Training_Data_1' # 若相对路径识别失败,可替换为绝对路径:r'F:\segmentation\ISBI2016_ISIC_Part3B_Training_Data\ISBI2016_ISIC_Part3B_Training_Data_1' # 分别筛选目录下的jpg、png文件,兼容后缀大写的情况 jpg_file_list = [f for f in os.listdir(DATA_PATH) if f.lower().endswith('.jpg')] png_file_list = [f for f in os.listdir(DATA_PATH) if f.lower().endswith('.png')] print(f"检测到jpg文件{len(jpg_file_list)}个,png文件{len(png_file_list)}个") # 初始化存储数组,和原示例数据类型、维度保持一致 # 通常jpg为3通道原图,存入X_train;png为单通道分割掩码,存入Y_train X_train = np.zeros((len(jpg_file_list), Img_Height, Img_Width, Img_Channel), dtype=np.uint8) Y_train = np.zeros((len(png_file_list), Img_Height, Img_Width, 1), dtype=bool) # 逐张加载jpg原图 for i, file_name in enumerate(jpg_file_list): img_full_path = os.path.join(DATA_PATH, file_name) # OpenCV默认读取为BGR通道,转为常规RGB顺序 img = cv2.imread(img_full_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # resize到统一尺寸 img = cv2.resize(img, (Img_Width, Img_Height)) X_train[i] = img # 逐张加载png掩码 for i, file_name in enumerate(png_file_list): mask_full_path = os.path.join(DATA_PATH, file_name) # 掩码直接读取为灰度图 mask = cv2.imread(mask_full_path, cv2.IMREAD_GRAYSCALE) mask = cv2.resize(mask, (Img_Width, Img_Height)) # 灰度值二值化转为布尔类型,阈值可根据实际掩码调整 mask = mask > 127 # 增加通道维度,和原示例Y_train的维度对齐 Y_train[i] = mask[:, :, np.newaxis]
重要注意事项:如果两类文件是一一对应的原图-掩码配对(同名不同后缀),不要分开遍历两个列表加载,否则容易因为文件名排序问题导致原图和掩码错位。需要按文件名配对后加载,核心逻辑如下:
# 按jpg文件名匹配同名png for i, jpg_name in enumerate(jpg_file_list): file_base_name = os.path.splitext(jpg_name)[0] matched_png_name = f"{file_base_name}.png" if matched_png_name not in png_file_list: print(f"跳过:{jpg_name}未找到对应png掩码") continue # 读取、处理原图和掩码的逻辑和前述代码一致
内容的提问来源于stack exchange,提问作者Tareq
相关产品推荐
相关产品推荐

