webp是谷歌發行的一種不損傷圖像質量的壓縮存儲方式,可有效減小圖像數據存儲空間。
但是在神經網絡中,常用的輸入圖像格式為jpg,所以需要轉化,利用PIL庫
一、單張圖像處理
import os
from PIL import Image
path = "E:\\newdatas\\data\\try\\991.webp"
im=Image.open(path)
im.load()
im.save("E:\\newdatas\\data\\try\\991.jpg")
os.remove(path)
我的運行環境是win10,所以圖像路徑格式采用雙斜線或反斜線,運行腳本,可將該圖像轉化為jpg格式的文件存儲,並且刪除原圖像。
代碼解析:
PIL是python的第三方圖像處理庫。
Image.open(path)是讀取圖像,但是該操作不讀取圖像數據,因此如果需要對圖像做處理,需要再使用Image.load()來強行加載圖像數據。
使用im.save()保存圖像,可直接將圖像保存成需要的格式。(不放心的話,可以再讀取一下重新保存的圖像,輸出其format屬性,驗證一下是否是jpeg)
保存完之后刪除原圖像,直接使用os.remove()函數
二、批量處理
import os from PIL import Image #圖像預處理包括修改圖像格式、編號 class proimage(): def __init__(self): self.path = "E:\\newdatas\\data\\try" #讀取文件夾下圖像 def read(self): filelist=os.listdir(self.path) return filelist def webp2jpg(self,filelist): #查找圖像方式不同,該函數只查找所有.webp格式的文件 for item in filelist: if item.endswith('.webp') : src = os.path.join(os.path.abspath(self.path), item) print("src=",src) im=Image.open(src) im.load() save_name=src.replace('webp','jpg') im.save('{}'.format(save_name),'JPEG') os.remove(src) if __name__ == '__main__': newtype = proimage() filelist=newtype.read() newtype.webp2jpg(filelist)
三、PNG格式修改為jpg
PNG是一種無損壓縮的位圖片格式,其通道數=4,除了R,G,B外,還有一個透明度,因此在修改其格式為jpg時,需要放棄透明度通道。
因此思路是讀取圖像,獲取圖像通道,將通道merge為rgb,圖像另存為jpg格式。
def png2jpg(self,filelist): for item in filelist: if item.endswith(".png"): src=os.path.join(os.path.abspath(self.path), item) im=Image.open(src) im.load() #print("原圖像通道數='{}'".format(len(im.split()))) r,g,b,a=im.split() im=Image.merge("RGB",(r,g,b)) #print('現圖像通道數=',len(im.split())) save_name=src.replace("png","jpg") im.save('{}'.format(save_name),'JPEG') os.remove(src)
四、圖像編號
為較好的用於深度學習,需要將圖像按照順序進行編號,代碼如下
def rename(self,filelist): i=1542 for item in filelist: if item.endswith('.jpg') or item.endswith('.jpeg') or item.endswith('.JPG'): src=os.path.join(os.path.abspath(self.path),item) dst=os.path.join(os.path.abspath(self.path), '0' + format(str(i), '0>3s') + '.jpg') os.rename(src,dst) #print('converting %s to %s ...' % (src, dst)) i=i+1
使用時請注意修改文件路徑和編號初始值