用python(PIL库)图像预处理

        由于最近做一些图像处理有关的学习任务,需要对图片进行预处理,对准格式(统一尺寸,转换通道数,重命名)。在这个过程中遇到了好多问题,查找了一些资料,最终解决了这些问题;

         废话不多说,直接上代码(新手,注释有点多):

"这里对图像的预处理包括:同一名称,统一尺寸,统一通道数;"
from PIL import Image
import os


def rename_image(file_dir, name):
    '''将网上爬下来的图片重命名(更好的观看)'''
    '''第一个参数是目标文件名;
       第二个参数是图片的名称'''
    i = 0
    print("正在重命名图片。。。。。。。")
    for file in os.listdir(file_dir):
        '''获取该路径文件下的所有图片'''
        src = os.path.join(os.path.abspath(file_dir), file)
        '''修改后图片的存储位置(目标文件夹+新的图片的名称)'''
        dst = os.path.join(os.path.abspath(file_dir), name + str(i) + '.png')
        os.rename(src, dst)  # 将图片重新命名
        i = i + 1
    print("-----------重命名完毕-----------")

def process_image_channels(image_path):  #将4通道,A通道的统一成三通道的图像;
    # process the 4 channels .png
    print("正在转换图片通道数。。。。。。。")
    for img_name in os.listdir(image_path):
        img_path = image_path + "/" + img_name    # 获取该图片全称
        image = Image.open(img_path)              # 打开特定一张图片
        image = image.resize((64, 64))            # 设置需要转换的图片大小
        if image.mode == 'RGBA':
            r, g, b, a = image.split()
            image = Image.merge("RGB", (r, g, b))
            os.remove(img_path)                   # 用新生成的3通道的图片代替原来的;
            image.save(img_path)
            #print("这是个四通道的,处理完了!")
        # process the 1 channel image
        elif image.mode != 'RGB':
            image = image.convert("RGBA")
            r, g, b, a = image.split()
            image = Image.merge("RGB", (r, g, b))
            os.remove(img_path)
            image.save(img_path)
            #print("这是个A通道的,处理完了!")

    print("-----------通道数变换完毕-----------")


# size输入形式举例(记得加括号): (64, 64)
def image_reshape(image_path, size):
    print("正在统一图片尺寸。。。。。。。")
    for img_name in os.listdir(image_path):
        img_path = image_path + "/" + img_name    # 获取该图片全称
        image = Image.open(img_path)              # 打开特定一张图片
        image = image.resize(size)            # 设置需要转换的图片大小
        os.remove(img_path)
        image.save(img_path)
    print("-----------尺寸统一完毕-----------")

if __name__ == '__main__':

    image_path = "icon"
    print("ready for process ----------  ")

    # 重命名;
    rename_image(image_path, 'icon_')
    # 统一通道数;
    process_image_channels(image_path)
    # 统一尺寸;
    image_reshape(image_path, (64, 64))

在这个代码里面,我定义了三个函数,分别用来做名称,尺寸,通道;

中间遇到的问题有以下几个:

1.在循环文件夹的时候,会出现不能识别Thumbs.db文件的错误,这个需要把这个文件删除掉才行,这个是系统自己生成的文件,不是图片,会使代码报错,百度一下删除这个问价的方法(这个东西贼烦,我弄了好长时间);

这是我解决的方法:https://blog.csdn.net/weixin_41765699/article/details/82620542

2.有时候会出现不是图片的文件,也是报错不能识别这个文件,也给他删除掉;

猜你喜欢

转载自blog.csdn.net/weixin_41765699/article/details/82709220