## Data augmentation ### Noise #### Python ```python >>> import ants >>> import antspynet >>> import random >>> >>> t1 = ants.image_read(antspynet.get_antsxnet_data('mprage_hippmapp3r')) >>> >>> t1 = ants.iMath( t1, "Normalize" ) >>> noise_parameters = (0.0, random.uniform(0, 0.05)) >>> t1 = ants.add_noise_to_image(t1, noise_model="additivegaussian", noise_parameters=noise_parameters) >>> ``` #### R ```r > library( ANTsR ) > library( ANTsRNet ) > > t1 <- antsImageRead( getANTsXNetData( 'mprage_hippmapp3r' ) ) > > t1 <- t1 %>% iMath( "Normalize" ) > noiseParameters <- c( 0.0, runif( 1, 0.0, 0.05 ) ) > t1 <- addNoiseToImage( t1, noiseModel = "additivegaussian", noiseParameters = noiseParameters ) ``` ### Histogram intensity warping #### Python ```python >>> import ants >>> import antspynet >>> import random >>> >>> t1 = ants.image_read(antspynet.get_antsxnet_data('mprage_hippmapp3r')) >>> >>> break_points = [0.2, 0.4, 0.6, 0.8] >>> displacements = list() >>> for b in range(len(break_points)): >>> displacements.append(abs(random.gauss(0, 0.05))) >>> if random.sample((True, False), 1)[0]: >>> displacements[b] *= -1 >>> >>> t1 = antspynet.histogram_warp_image_intensities(t1, break_points=break_points, clamp_end_points=(True, False), displacements=displacements) ``` #### R ```r > library( ANTsR ) > library( ANTsRNet ) > > t1 <- antsImageRead( getANTsXNetData( 'mprage_hippmapp3r' ) ) > > breakpoints <- c( 0.2, 0.4, 0.6, 0.8 ) > displacements <- c() > for( b in seq.int( length( breakpoints ) ) ) > { > displacements[b] <- abs( runif( 1, 0, 0.05 ) ) > if( sample( c( TRUE, FALSE ), 1 ) ) > { > displacements[b] = displacements[b] * -1 > } > } > > t1 <- histogramWarpImageIntensities( t1, breakPoints = breakpoints, clampEndPoints = c( TRUE, FALSE ), displacements = displacements ) ``` ### Simulate bias field #### Python ```python >>> import ants >>> import numpy as np >>> >>> t1 = ants.image_read(antspynet.get_antsxnet_data('mprage_hippmapp3r')) >>> log_field = antspynet.simulate_bias_field(t1, number_of_points=10, sd_bias_field=1.0, number_of_fitting_levels=2, mesh_size=10) >>> log_field = log_field.iMath("Normalize") >>> log_field_array = np.power(np.exp(log_field.numpy()), 4) >>> t1 = t1 * ants.from_numpy(log_field_array, origin=t1.origin, spacing=t1.spacing, direction=t1.direction) ``` #### R ```r > library( ANTsR ) > > t1 <- antsImageRead( getANTsXnetData( "mprage_hippmapp3r" ) ) > logField <- simulateBiasField(image, numberOfPoints = 10, sdBiasField = 1.0, numberOfFittingLevels = 2, meshSize = 10 ) %>% iMath( "Normalize" ) > logField <- ( exp( logField ) )^4 > t1 <- t1 * logField ``` ### Random spatial transformations #### Python ```python >>> import ants >>> import antspynet >>> >>> t1 = ants.image_read(antspynet.get_antsxnet_data('mprage_hippmapp3r')) >>> segmentation = ants.threshold_image(t1, "Otsu", 3) >>> >>> data_augmentation = antspynet.randomly_transform_image_data(t1, [[t1]], [segmentation], number_of_simulations=2, transform_type='affineAndDeformation', sd_affine=0.01, deformation_transform_type="bspline", number_of_random_points=1000, sd_noise=2.0, number_of_fitting_levels=4, mesh_size=1, sd_smoothing=4.0, input_image_interpolator='linear', segmentation_image_interpolator='nearestNeighbor') >>> >>> simulated_image1 = data_augmentation['simulated_images'][0][0] >>> simulated_segmentation1 = data_augmentation['simulated_segmentation_images'][0] >>> simulated_image2 = data_augmentation['simulated_images'][1][0] >>> simulated_segmentation2 = data_augmentation['simulated_segmentation_images'][1] ``` #### R ```r > library( ANTsR ) > library( ANTsRNet ) > > t1 <- antsImageRead( getANTsXNetData( 'mprage_hippmapp3r' ) ) > segmentation <- thresholdImage( t1, "Otsu", 3 ) Otsu Thresh with 3 thresholds > > dataAugmentation <- randomlyTransformImageData( t1, list( list( t1 ) ), list( segmentation ), numberOfSimulations = 2, transformType = 'affineAndDeformation', sdAffine = 0.01, deformationTransformType = "bspline", numberOfRandomPoints = 1000, sdNoise = 2.0, numberOfFittingLevels = 4, meshSize = 1, sdSmoothing=4.0, inputImageInterpolator = 'linear', segmentationImageInterpolator = 'nearestNeighbor' ) > > simulatedImage1 <- dataAugmentation$simulatedImages[0][0] > simulatedSegmentation1 <- dataAugmentation$simulatedSegmentationImages[0] > simulatedImage2 <- dataAugmentation$simulatedImages[1][0] > simulatedSegmentation2 <- dataAugmentation$simulatedSegmentationImages[1] ``` ### Combined #### Python ```python >>> import antspynet >>> import ants >>> >>> t1s = [[ants.image_read(antspynet.get_antsxnet_data("kirby"))]] >>> aug = antspynet.data_augmentation(t1s, segmentation_image_list=None, pointset_list=None, >>> number_of_simulations=10, >>> reference_image=None, >>> transform_type='affineAndDeformation', >>> noise_model='additivegaussian', >>> noise_parameters=(0.0, 0.05), >>> sd_simulated_bias_field=0.05, >>> sd_histogram_warping=0.05, >>> sd_affine=0.05, >>> output_numpy_file_prefix=None, >>> verbose=True) >>> for i in range(len(aug['simulated_images'])): >>> print("Writing simulated image ", str(i)) >>> ants.image_write(aug['simulated_images'][i][0], "simulated_image" + str(i) + ".nii.gz") ``` #### R ```r > library( ANTsR ) > library( ANTsRNet ) > > t1s <- list( list( antsImageRead( getANTsXNetData( 'kirby' ) ) ) ) > aug <- dataAugmentation( t1s, segmentationImageList = NULL, pointsetList = NULL, numberOfSimulations = 10, referenceImage = NULL, transformType = 'affineAndDeformation', sdAffine = 0.05, noiseModel = 'additivegaussian', noiseParameters = c( 0.0, 0.05 ), sdSimulatedBiasField = 1.0, sdHistogramWarping = 0.05, outputNumpyFilePrefix = NULL, verbose = TRUE ) > for( i in seq.int( length( aug$simulatedImages[[0]] ) ) > { > cat( "Writing simulated image", i, "\n" ) > antsImageWrite( aug$simulatedImages[[i][[0]]], paste0( "simulatedImages", i, ".nii.gz" ) ) > } ```