1. 程式人生 > >深度學習影象資料集擴充辦法:翻轉、旋轉、拉伸、五部分提取、明暗度變化python

深度學習影象資料集擴充辦法:翻轉、旋轉、拉伸、五部分提取、明暗度變化python

一:日誌依賴

二:程式碼實現

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金額不限噢噢!如果有修改建議或者疑問請留言!

支付寶
微信支付