Python图像增强(翻转和旋转)

2021-01-05 10:25:13 浏览数 (1)

参考链接: Python中的numpy.flip

前言 

在训练神经网络的时候,经常需要对原始图像做各种各样的增强来增加数据量,最常见的也就是旋转和翻转操作了,实现这两种操作也多种多样,本博客就是来探究不同操作带来的结果 

本文所有的实验都是基于2维的图像,即2维数组 原始图为(https://baike.baidu.com/item/唐老鸭/4344419?fr=aladdin):  

翻转(flip,flipud,fliplr) 

flip适用于所有的数组翻转,而flipud和fliplr一般用于图像(2维数组)的翻转,前者是对图像进行上下翻转,后者是左右翻转 

参考:https://www.cnblogs.com/xiaoniu-666/p/11123560.html 

flip 

import numpy as np

img = np.flip(img) # 翻转所有维度

img = np.flip(img, n) # 翻转第n个维度

img = np.flip(img, (m,n,...)) # 同时翻转指定的多个维度

flipud (上下翻转) 

ud = up/down 上下翻转也就是沿着x轴翻转,在数组中是沿着第0维翻转 

import numpy as np

img = np.flipud(img) # 上下翻转

# 等同于: img = np.flip(img, 0)

# 等同于: img = img[::-1, :]

实验: 

import numpy as np 

from PIL import Image

img = np.asarray(Image.open('./tang.png').convert('L'))  # 读取图像并转成灰度图

img_pad = np.zeros((500, 500), dtype=np.uint8)

img_pad[:496, :] = img  # 原始图像大小为496x500,将其padding为500x500的方图

img1 = np.flip(img_pad, 0)

img2 = np.flipud(img_pad)

img3 = img_pad[::-1, :]

img_cat = np.concatenate([img_pad, img1, img2, img3], axis=1)

Image.fromarray(img_cat).save('./tang_flipud.png')

fliplr (左右翻转) 

lr = left/right 左右翻转也就是沿着y轴翻转,在数组中是沿着第1维翻转 

import numpy as np

img = np.fliplr(img) # 左右翻转

# 等同于: img = np.flip(img, 1)

# 等同于: img = img[:, ::-1]

实验: 

img1 = np.flip(img_pad, 1)

img2 = np.fliplr(img_pad)

img3 = img_pad[:, ::-1]

img_cat = np.concatenate([img_pad, img1, img2, img3], axis=1)

Image.fromarray(img_cat).save('./tang_fliplr.png')

transpose (转置) 

数学上叫转置,在数组上就是交换坐标轴,在图像上来看就是沿着对角线翻转 这种变换不是通过一次上下翻转和一次左右翻转可以得到的! 

实验: 

img1 = np.transpose(img_pad, (1, 0))

img_cat = np.concatenate([img_pad, img1], axis=1)

Image.fromarray(img_cat).save('./tang_transpose.png')

旋转 (rot90) 

import numpy as np

img = np.rot90(img, n) # n=0,1,2,3,... 即旋转0,90,180,270,

# 如果n>=4, 就取余数来确定旋转的度数

# 正数代表逆时针旋转,负数代表顺时针旋转

实验: 

img1 = np.rot90(img_pad, 1)

img2 = np.rot90(img_pad, 2)

img3 = np.rot90(img_pad, 3)

img_cat = np.concatenate([img_pad, img1, img2, img3], axis=1)

Image.fromarray(img_cat).save('./tang_rot90.png')

组合 (翻转 旋转) 

2维图像通过翻转和旋转可以得到8种不同的组合结果,如何得到这8种组合结果呢? 我一般通过以下两种方式: 

方式1 (flipud fliplr transpose) 

img1 = img_pad

img2 = img_pad[::-1, :]       # flipud(img_pad)

img3 = img_pad[:, ::-1]       # fliplr(img_pad)

img4 =  img_pad[::-1, ::-1]   # fliplr(flipud(img_pad))

img5 = np.transpose(img_pad, (1, 0))

img6 = img5[::-1, :]

img7 = img5[:, ::-1]

img8 = img5[::-1, ::-1]

img_cat1 = np.concatenate([img1,img2,img3,img4], axis=1)

img_cat2 = np.concatenate([img5,img6,img7,img8], axis=1)

img_cat = np.concatenate([img_cat1, img_cat2], axis=0)

Image.fromarray(img_cat).save('./tang_aug1.png')

方式2 (rot90 transpose) 

img1 = img_pad

img2 = np.rot90(img_pad, 1)

img3 = np.rot90(img_pad, 2)

img4 = np.rot90(img_pad, 3)

img5 = np.transpose(img_pad, (1, 0))

img6 = np.rot90(img5, 1)

img7 = np.rot90(img5, 2)

img8 = np.rot90(img5, 3)

img_cat1 = np.concatenate([img1,img2,img3,img4], axis=1)

img_cat2 = np.concatenate([img5,img6,img7,img8], axis=1)

img_cat = np.concatenate([img_cat1, img_cat2], axis=0)

Image.fromarray(img_cat).save('./tang_aug2.png')

总结 

两种方式的生成结果是完全一样(顺序有点不同) 通过对比也可以发现: 1)上下翻转 = 对角线翻转 逆时针旋转90度 2)左右翻转 = 对角线翻转 顺时针旋转90度 

代码 

import numpy as np 

from PIL import Image

img = np.asarray(Image.open('./tang.png').convert('L'))  # 读取图像并转成灰度图

img_pad = np.zeros((500, 500), dtype=np.uint8)

img_pad[:496, :] = img  # 原始图像大小为496x500,将其padding为500x500的方图

img1 = np.flip(img_pad, 0)

img2 = np.flipud(img_pad)

img3 = img_pad[::-1, :]

img_cat = np.concatenate([img_pad, img1, img2, img3], axis=1)

Image.fromarray(img_cat).save('./tang_flipud.png')

img1 = np.flip(img_pad, 1)

img2 = np.fliplr(img_pad)

img3 = img_pad[:, ::-1]

img_cat = np.concatenate([img_pad, img1, img2, img3], axis=1)

Image.fromarray(img_cat).save('./tang_fliplr.png')

img1 = np.transpose(img_pad, (1, 0))

img_cat = np.concatenate([img_pad, img1], axis=1)

Image.fromarray(img_cat).save('./tang_transpose.png')

img1 = np.rot90(img_pad, 1)

img2 = np.rot90(img_pad, 2)

img3 = np.rot90(img_pad, 3)

img_cat = np.concatenate([img_pad, img1, img2, img3], axis=1)

Image.fromarray(img_cat).save('./tang_rot90.png')

img1 = img_pad

img2 = img_pad[::-1, :]       # flipud(img_pad)

img3 = img_pad[:, ::-1]       # fliplr(img_pad)

img4 =  img_pad[::-1, ::-1]   # fliplr(flipud(img_pad))

img5 = np.transpose(img_pad, (1, 0))

img6 = img5[::-1, :]

img7 = img5[:, ::-1]

img8 = img5[::-1, ::-1]

img_cat1 = np.concatenate([img1,img2,img3,img4], axis=1)

img_cat2 = np.concatenate([img5,img6,img7,img8], axis=1)

img_cat = np.concatenate([img_cat1, img_cat2], axis=0)

Image.fromarray(img_cat).save('./tang_aug1.png')

img1 = img_pad

img2 = np.rot90(img_pad, 1)

img3 = np.rot90(img_pad, 2)

img4 = np.rot90(img_pad, 3)

img5 = np.transpose(img_pad, (1, 0))

img6 = np.rot90(img5, 1)

img7 = np.rot90(img5, 2)

img8 = np.rot90(img5, 3)

img_cat1 = np.concatenate([img1,img2,img3,img4], axis=1)

img_cat2 = np.concatenate([img5,img6,img7,img8], axis=1)

img_cat = np.concatenate([img_cat1, img_cat2], axis=0)

Image.fromarray(img_cat).save('./tang_aug2.png')

0 人点赞