需求分析:

目前我有一个文件夹,文件夹下存放了各种图片数据,我需要对图片数据进行一些参数调整、图像处理和检测。我需要调整一个参数后直接遍历处理所有的图片,返回所有的处理结果,而不是调整完参数一个一个测试效果好不好。

之前的方法是:cv2.imread("路径/图像名.png"),然后进行相应的处理

img = cv2.imread("dataset1/shiban1/cut/1417_003.png")
plt.imshow(img)
plt.show()

这里就简单举个例子,dataset1下有一些文件夹,我要读取shiban1/cut下的32张图像

至于图像处理和检测这些操作,就以plt展示图片的代码代替

这样的方法,每次处理完一张图片都要改一下图像名字,比如改成1417_004.png才能处理下一张图像。这对于我进行调参测试效率太低了。

所以,就找了一下遍历文件夹的代码,对我的程序进行修改:

首先在Utils.py里放入遍历代码

#遍历文件夹
def getFileList(dir, Filelist, ext=None):
    """
    获取文件夹及其子文件夹中文件列表
    输入 dir:文件夹根目录
    输入 ext: 扩展名
    返回: 文件路径列表
    """
    newDir = dir
    if os.path.isfile(dir):
        if ext is None:
            Filelist.append(dir)
        else:
            if ext in dir[-3:]:
                Filelist.append(dir)

    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            newDir = os.path.join(dir, s)
            getFileList(newDir, Filelist, ext)

    return Filelist

 然后在主程序中进行调用遍历,首先看看能不能遍历到,如果可以的话顺带输出一下imglist

    org_img_folder = './dataset1/shiban1/cut'
    imglist = Detection_Utils.getFileList(org_img_folder, [], 'png')
    print('本次执行检索到 ' + str(len(imglist)) + ' 张图像\n')
    print(imglist)

 能看到,是可以遍历该文件夹下所有图像数据的

并且它返回的是一个数组类型的路径列表,但是我发现文件名前面的是 \\ ,这个肯定是读不出的

 所以我接下来可以取出它的文件名,自己附上路径

    for imgpath in imglist:
        imgname = os.path.splitext(os.path.basename(imgpath))[0]
        print(imgname)

    for imgpath in imglist:
        imgname = os.path.splitext(os.path.basename(imgpath))[0]
        #print(imgname)
        print("dataset1/shiban1/yuan/" + imgname + ".png")

 

 完整的main函数中调用代码如下:

if __name__=='__main__':

    org_img_folder = './dataset1/shiban1/cut'
    imglist = Detection_Utils.getFileList(org_img_folder, [], 'png')
    #print('本次执行检索到 ' + str(len(imglist)) + ' 张图像\n')
    #print(imglist)

    for imgpath in imglist:
        imgname = os.path.splitext(os.path.basename(imgpath))[0]
        #print(imgname)
        #print("dataset1/shiban1/cut/" + imgname + ".png")
        imgpath = "dataset1/shiban1/cut/" + imgname + ".png"
        img = cv2.imread(imgpath)
        plt.imshow(img)
        plt.show()

最后,确实是会依次的给我展示cut文件夹下的所有图像。接下来我只要把 plt的两行代码换成我所需要的图像处理和检测代码即可。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐