数据增强(代码)

数据集不够怎么办?

——数据增强

代码:

'''

    这是图片数据增强的代码,可以对图片实现:

    1. 尺寸放大缩小

    2. 随机裁剪

    3. 变形

    4. 旋转(任意角度,如45°,90°,180°,270°)

    5. 翻转(水平翻转,垂直翻转)

    6. 明亮度改变(变亮,变暗)

    7. 像素平移(往一个方向平移像素,空出部分自动填补黑色)

    8. 添加噪声(椒盐噪声,高斯噪声)

'''

import os

import cv2

import numpy as np

# import tensorflow as tf

import random as rd

import matplotlib

matplotlib.use('TkAgg')

from matplotlib import pyplot as plt

'''

缩放

'''

# 放大缩小

def Scale(image, scale):

    return cv2.resize(image,(500,500),fx=scale,fy=scale,interpolation=cv2.INTER_LINEAR)

'''

裁剪

'''

def crop(image, min_ratio=0.6, max_ratio=1.0):

    h, w = image.shape[:2]

    ratio = rd.random()

    scale = min_ratio + ratio * (max_ratio - min_ratio)

    new_h = int(h*scale)   

    new_w = int(w*scale)

    y = np.random.randint(0, h - new_h)   

    x = np.random.randint(0, w - new_w)

    image = image[y:y+new_h, x:x+new_w, :]

    return image

# #随机裁剪

# def crop(image):

#    x,y,z = image[:]

#    return tf.random_crop(image,[x*rd.random,y*rd.random,z])

'''

变形

'''

def change(image):

    x,y = image.shape[:2]

    pts1 = np.float32([[50,50], [200,50], [50,200]])

    pts2 = np.float32([[10,100], [200,50], [100,250]])

    M = cv2.getAffineTransform(pts1, pts2)

    dst = cv2.warpAffine(image, M,(y,x),borderValue=(255,255,255))

    return dst

'''

翻转

'''

# 水平翻转

def Horizontal(image):

    return cv2.flip(image,1,dst=None) #水平镜像

# 垂直翻转

def Vertical(image):

    return cv2.flip(image,0,dst=None) #垂直镜像

# 旋转,R可控制图片放大缩小

def Rotate(image, angle=15, scale=0.9):

    w = image.shape[1]

    h = image.shape[0]

    #rotate matrix

    M = cv2.getRotationMatrix2D((w/2,h/2), angle, scale)

    #rotate

    image = cv2.warpAffine(image,M,(w,h))

    return image

''' 

明亮度

'''

# 变暗

def Darker(image,percetage=0.9):

    image_copy = image.copy()

    w = image.shape[1]

    h = image.shape[0]

    #get darker

    for xi in range(0,w):

        for xj in range(0,h):

            image_copy[xj,xi,0] = int(image[xj,xi,0]*percetage)

            image_copy[xj,xi,1] = int(image[xj,xi,1]*percetage)

            image_copy[xj,xi,2] = int(image[xj,xi,2]*percetage)

    return image_copy

# 明亮

def Brighter(image, percetage=1.1):

    image_copy = image.copy()

    w = image.shape[1]

    h = image.shape[0]

    #get brighter

    for xi in range(0,w):

        for xj in range(0,h):

            image_copy[xj,xi,0] = np.clip(int(image[xj,xi,0]*percetage),a_max=255,a_min=0)

            image_copy[xj,xi,1] = np.clip(int(image[xj,xi,1]*percetage),a_max=255,a_min=0)

            image_copy[xj,xi,2] = np.clip(int(image[xj,xi,2]*percetage),a_max=255,a_min=0)

    return image_copy

# 平移

def Move(img,x,y):

    img_info=img.shape

    height=img_info[0]

    width=img_info[1]

    mat_translation=np.float32([[1,0,x],[0,1,y]])  #变换矩阵:设置平移变换所需的计算矩阵:2行3列

    #[[1,0,20],[0,1,50]]  表示平移变换:其中x表示水平方向上的平移距离,y表示竖直方向上的平移距离。

    dst=cv2.warpAffine(img,mat_translation,(width,height))  #变换函数

    return dst

'''

增加噪声

'''

# 椒盐噪声

def SaltAndPepper(src,percetage):

    SP_NoiseImg=src.copy()

    SP_NoiseNum=int(percetage*src.shape[0]*src.shape[1])

    for i in range(SP_NoiseNum):

        randR=np.random.randint(0,src.shape[0]-1)

        randG=np.random.randint(0,src.shape[1]-1)

        randB=np.random.randint(0,3)

        if np.random.randint(0,1)==0:

            SP_NoiseImg[randR,randG,randB]=0

        else:

            SP_NoiseImg[randR,randG,randB]=255

    return SP_NoiseImg

# 高斯噪声

def GaussianNoise(image,percetage):

    G_Noiseimg = image.copy()

    w = image.shape[1]

    h = image.shape[0]

    G_NoiseNum=int(percetage*image.shape[0]*image.shape[1])

    for i in range(G_NoiseNum):

        temp_x = np.random.randint(0,h)

        temp_y = np.random.randint(0,w)

        G_Noiseimg[temp_x][temp_y][np.random.randint(3)] = np.random.randn(1)[0]

    return G_Noiseimg

def Blur(img):

    blur = cv2.GaussianBlur(img, (7, 7), 1.5)

    # #      cv2.GaussianBlur(图像,卷积核,标准差)

    return blur


# 单图增强

def TestOnePic():

    test_jpg_loc = r"data/daisy/1.jpg"

    test_jpg = cv2.imread(test_jpg_loc)

    cv2.imshow("Show Img", test_jpg)

    # cv2.waitKey(0)

    img1 = Blur(test_jpg)

    cv2.imshow("Img 1", img1)

    # cv2.waitKey(0)

    # img2 = GaussianNoise(test_jpg,0.01)

    # cv2.imshow("Img 2", img2)

    cv2.waitKey(0)

# 多图/文件夹增强

def TestOneDir():

    root_path = "data/daisy"

    save_path = root_path

    for a, b, c in os.walk(root_path):

        for file_i in c:

            file_i_path = os.path.join(a, file_i)

            print(file_i_path)

            img_i = cv2.imread(file_i_path)

            # img_scale = Scale(img_i,1.5)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_scale.jpg"), img_scale)

            # img_horizontal = Horizontal(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_horizontal.jpg"), img_horizontal)

            #

            # img_vertical = Vertical(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_vertical.jpg"), img_vertical)

            #

            # img_rotate = Rotate(img_i,90)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_rotate90.jpg"), img_rotate)

            #

            # img_rotate = Rotate(img_i, 180)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_rotate180.jpg"), img_rotate)

            #

            # img_rotate = Rotate(img_i, 270)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_rotate270.jpg"), img_rotate)

            #

            # img_move = Move(img_i,15,15)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_move.jpg"), img_move)

            #

            # img_darker = Darker(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_darker.jpg"), img_darker)

            #

            # img_brighter = Brighter(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_brighter.jpg"), img_brighter)

            #

            # img_blur = Blur(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_blur.jpg"), img_blur)

            #

            # img_salt = SaltAndPepper(img_i,0.05)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_salt.jpg"), img_salt)

            # img_salt = GaussianNoise(img_i,0.05)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_GaussianNoise.jpg"), img_salt)


# 多图/文件夹增强

def AllData(root_path):

    #root_path = "data/"

    save_loc = root_path

    for a,b,c in os.walk(root_path):

        for file_i in c:

            file_i_path = os.path.join(a,file_i)

            #print(file_i_path)

            if '.DS_Store' in file_i_path:

                continue

            split = os.path.split(file_i_path)

            #print('split',split)

            dir_loc = os.path.split(split[0])[1]

            #print('dir_loc',dir_loc)

            save_path = os.path.join(save_loc,dir_loc)

            #查看保存文件地址,缺失文件夹需手动创建。

            print('save_path',save_path)


            img_i = cv2.imread(file_i_path)

            # img_scale = Scale(img_i,1.5)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_scale.jpg"), img_scale)

            # img_crop = crop(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_crop.jpg"), img_crop)

            # img_change = change(img_i)

            # cv2.imwrite(os.path.join(save_path,file_i[:-4] + "_change.jpg"),img_change)

            # img_horizontal = Horizontal(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_horizontal.jpg"), img_horizontal)

            # #

            # img_vertical = Vertical(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_vertical.jpg"), img_vertical)

            # #

            # img_rotate = Rotate(img_i, 90)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_rotate90.jpg"), img_rotate)

            # #

            # img_rotate = Rotate(img_i, 180)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_rotate180.jpg"), img_rotate)

            # #

            # img_rotate = Rotate(img_i, 270)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_rotate270.jpg"), img_rotate)

            # #

            # img_move = Move(img_i, 15, 15)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_move.jpg"), img_move)

            # #

            # img_darker = Darker(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_darker.jpg"), img_darker)

            # #

            # img_brighter = Brighter(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_brighter.jpg"), img_brighter)

            # #

            # img_blur = Blur(img_i)

            # cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_blur.jpg"), img_blur)

            # #

            img_salt = SaltAndPepper(img_i, 0.05)

            cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_salt.jpg"), img_salt)

            img_salt = GaussianNoise(img_i,0.1)

            cv2.imwrite(os.path.join(save_path, file_i[:-4] + "_GaussianNoise.jpg"), img_salt)


if __name__ == "__main__":

    # TestOneDir()

    # TestOnePic()

    root_path = "/Users/alanchris/Desktop/pic"

    AllData(root_path)



上述代码参考:(55条消息) 数据增强(python)_python数据增强代码_晚安,chris的博客-CSDN博客

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容