问题描述
我的文件夹结构如下所示
MA/valid/wrist/pa/positive/image2.png
基本上,每个腕部都有多个pa,每个pa都有正或负的检查,并且每个检查最多有3张png格式的图像。
我在下面编写了代码,但仅下降到pa级别,它不加载我的图像文件。加载我的图像文件的任何帮助将不胜感激。
def load(Pic_Dir,imsize):
data = []
dirs = next(os.walk(Pic_Dir))[1]
for dir_name in dirs:
files = next(os.walk(os.path.join(Pic_Dir,dir_name)))[2]
print("load [",len(files),"] files from [",dir_name,"] " )
for i in range(len(files)):
image_name = files[i]
image_path = os.path.join(Pic_Dir,image_name)
label = dir_name
img = cv2.imread(image_path)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img = cv2.resize(img,(imsize,imsize))
data.append([np.array(img),label])
return
data=load("/Users/bond/MA/train/XR_WRIST",244)
解决方法
我不确定我是否很好地理解了您的问题。但是,如果您需要遍历目录并处理其子目录中的所有图像文件,建议您编写如下内容:
def load(root_director,Imsize):
import os
#TODO:You need to figure out how to get a list of this pa.
# Your question is not clear on how to get here
pas =get_list_of_pa()
cases =["positive","negative"]
for pa in pas:
for case in cases:
in_dir = os.path.join(root_directory,pa,case)
all_images = [f for f in os.listdir(in_dir) if f.endswith('.png')]
for image in all_images:
#Do your processing here
pass
基本上,正如您所说,如果您有很多pa(什么是pa?),则首先需要获取所有pas的列表,然后遍历每个pas来访问cases=["positive","negative]
的列表。这不是最佳的。有更好的方法来浏览目录,例如,使用之前使用的path.rglob
或os.walk
方法。
请注意,我是在脑海里写这段代码,没有以任何方式对其进行测试。
附带一提,恕我直言,我将重构您的方法并按以下方式调用
def load (director,case):
# Get images for the pa and case
# Process the images
这可能会降低其复杂性。实际上,为了遵守单一职责原则(SRP),您可能需要进一步重构该方法。例如,您需要一种方法来获取目录的所有图像
def get_images (director):
pass
哪个返回图像列表(在这种情况下,仅返回.png文件)。然后,您将需要另一种处理图像的方法
def process_image (Imsize):
pass
我希望这会有所帮助!