1. 程式人生 > >用python(PIL庫)影象預處理

用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.有時候會出現不是圖片的檔案,也是報錯不能識別這個檔案,也給他刪除掉;