深度學習影象資料集擴充辦法:翻轉、旋轉、拉伸、五部分提取、明暗度變化python
阿新 • • 發佈:2019-01-24
一:日誌依賴
二:程式碼實現
from diagnose_logging import Logger from PIL import Image import os # 宣告日誌 log = Logger('img_pre.py') logger = log.getlog() class ImgPre: def __init__(self, rootPath, export_path_base): self.rootPath = rootPath # 影象完整路徑 self.export_path_base = export_path_base # 建立輸出根目錄 try: if not os.path.exists(export_path_base): os.mkdir(export_path_base) except Exception as e: logger.error(e) logger.info('ImgPre: %s', rootPath) def get_savename(self, operate): """ :param export_path_base: 影象輸出路徑 :param operate: 臉部區域名 :return: 返回影象儲存名 """ try: import time # 獲取時間戳,用於區分影象 now = time.time() tail_time = str(round(now * 1000000))[-4:] # 時間戳尾數 head_time = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time())) # 時間標籤 label = str(head_time + tail_time) # 輸出資料夾 export_path_base = self.export_path_base # 子資料夾以“操作operate”命名 out_path = export_path_base + operate # 建立子資料夾 if not os.path.exists(out_path): os.mkdir(out_path) # 儲存完整路徑 savename = out_path + '/' + operate + '_' + label + ".jpg" # 日誌 logger.info('save:%s', savename) return savename except Exception as e: logger.error('get_savename ERROR') logger.error(e) def lightness(self, light): """改變影象亮度. 推薦值: 0.87,1.07 明亮程度 darker < 1.0 <lighter """ try: operate = 'lightness_' + str(light) # 影象完整路徑 rootPath = self.rootPath with Image.open(rootPath) as image: # 影象左右翻轉 out = image.point(lambda p: p * light) # 重新命名 savename = self.get_savename(operate) # 影象儲存 out.save(savename) # 日誌 # logger.info(operate) except Exception as e: logger.error('ERROR %s', operate) logger.error(e) def rotate(self, angle): """影象旋轉15度、30度.""" try: operate = 'rotate_' + str(angle) # 影象完整路徑 rootPath = self.rootPath with Image.open(rootPath) as image: # 影象左右翻轉 out = image.rotate(angle) # 重新命名 savename = self.get_savename(operate) # 影象儲存 out.save(savename, quality=100) # 日誌 # logger.info(operate) except Exception as e: logger.error('ERROR %s', operate) logger.error(e) def transpose(self): """影象左右翻轉操作.""" try: operate = 'transpose' # 影象完整路徑 rootPath = self.rootPath with Image.open(rootPath) as image: # 影象左右翻轉 out = image.transpose(Image.FLIP_LEFT_RIGHT) # 重新命名 savename = self.get_savename(operate) # 影象儲存 out.save(savename, quality=100) # quality=100 # 日誌 # logger.info(operate) except Exception as e: logger.error('ERROR %s', operate) logger.error(e) def deform(self): """影象拉伸.""" try: operate = 'deform' # 影象完整路徑 rootPath = self.rootPath with Image.open(rootPath) as image: w, h = image.size w = int(w) h = int(h) # 拉伸成寬為w的正方形 out_ww = image.resize((int(w), int(w))) savename = self.get_savename(operate + '_ww') out_ww.save(savename, quality=100) # 拉伸成寬為h的正方形 out_ww = image.resize((int(h), int(h))) savename = self.get_savename(operate + '_hh') out_ww.save(savename, quality=100) # 日誌 # logger.info(operate) except Exception as e: logger.error('ERROR %s', operate) logger.error(e) def crop(self): """提取四個角落和中心區域.""" try: operate = 'crop' # 影象完整路徑 rootPath = self.rootPath with Image.open(rootPath) as image: w, h = image.size # 切割後尺寸 scale = 0.875 # 切割後長寬 ww = int(w * scale) hh = int(h * scale) # 影象起點,左上角座標 x = y = 0 # 切割左上角 x_lu = x y_lu = y out_lu = image.crop((x_lu, y_lu, ww, hh)) savename = self.get_savename(operate + '_lu') out_lu.save(savename, quality=100) # logger.info(operate + '_lu') # 切割左下角 x_ld = int(x) y_ld = int(y + (h - hh)) out_ld = image.crop((x_ld, y_ld, ww, hh)) savename = self.get_savename(operate + '_ld') out_ld.save(savename, quality=100) # logger.info(operate + '_ld') # 切割右上角 x_ru = int(x + (w - ww)) y_ru = int(y) out_ru = image.crop((x_ru, y_ru, w, hh)) savename = self.get_savename(operate + '_ru') out_ru.save(savename, quality=100) # logger.info(operate + '_ru') # 切割右下角 x_rd = int(x + (w - ww)) y_rd = int(y + (h - hh)) out_rd = image.crop((x_rd, y_rd, w, h)) savename = self.get_savename(operate + '_rd') out_rd.save(savename, quality=100) # logger.info(operate + '_rd') # 切割中心 x_c = int(x + (w - ww) / 2) y_c = int(y + (h - hh) / 2) out_c = image.crop((x_c, y_c, ww, hh)) savename = self.get_savename(operate + '_c') out_c.save(savename, quality=100) # logger.info('提取中心') except Exception as e: logger.error('ERROR %s', operate) logger.error(e) def test(): # 源地址和輸出地址 rootPath = 'E:/face/1.jpg' export_path_base = 'E:/face/image/' # 宣告類物件 imgPre = ImgPre(rootPath, export_path_base) imgPre.deform() imgPre.transpose() imgPre.rotate(15) imgPre.rotate(30) imgPre.crop() imgPre.lightness(1.07) imgPre.lightness(0.87) if __name__ == '__main__': import datetime print('start...') # 計時 start_time = datetime.datetime.now() test() end_time = datetime.datetime.now() time_consume = (end_time - start_time).microseconds / 1000000 logger.info('start_time: %s', start_time) logger.info('end_time: %s', end_time) logger.info('time_consume: %s(s)', time_consume) # 0.280654(s) logger.info('main finish')
# 打賞鼓勵請掃支付寶微信二維碼O(∩_∩)O金額不限噢噢!如果有修改建議或者疑問請留言!