Skip to content

Instantly share code, notes, and snippets.

@tomahim
Last active January 20, 2022 08:26
Show Gist options
  • Save tomahim/9ef72befd43f5c106e592425453cb6ae to your computer and use it in GitHub Desktop.
Save tomahim/9ef72befd43f5c106e592425453cb6ae to your computer and use it in GitHub Desktop.
Data augmentation in few lines with skimage
import os
import random
from scipy import ndarray
# image processing library
import skimage as sk
from skimage import transform
from skimage import util
from skimage import io
def random_rotation(image_array: ndarray):
# pick a random degree of rotation between 25% on the left and 25% on the right
random_degree = random.uniform(-25, 25)
return sk.transform.rotate(image_array, random_degree)
def random_noise(image_array: ndarray):
# add random noise to the image
return sk.util.random_noise(image_array)
def horizontal_flip(image_array: ndarray):
# horizontal flip doesn't need skimage, it's easy as flipping the image array of pixels !
return image_array[:, ::-1]
# dictionary of the transformations we defined earlier
available_transformations = {
'rotate': random_rotation,
'noise': random_noise,
'horizontal_flip': horizontal_flip
}
folder_path = 'images/cat'
num_files_desired = 10
# find all files paths from the folder
images = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
num_generated_files = 0
while num_generated_files <= num_files_desired:
# random image from the folder
image_path = random.choice(images)
# read image as an two dimensional array of pixels
image_to_transform = sk.io.imread(image_path)
# random num of transformation to apply
num_transformations_to_apply = random.randint(1, len(available_transformations))
num_transformations = 0
transformed_image = None
while num_transformations <= num_transformations_to_apply:
# random transformation to apply for a single image
key = random.choice(list(available_transformations))
transformed_image = available_transformations[key](image_to_transform)
num_transformations += 1
new_file_path = '%s/augmented_image_%s.jpg' % (folder_path, num_generated_files)
# write image to the disk
io.imsave(new_file_path, transformed_image)
num_generated_files += 1
@anaves
Copy link

anaves commented Jun 15, 2020

correct the code and make it available here

@kelingkece
Copy link

how to make the code can augmented the data in all images in a folder instead of randoming?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment