From 43a7d1646bc503c0eb2d3d1e9692ca3c2297220a Mon Sep 17 00:00:00 2001 From: Alexander Jung Date: Wed, 5 Feb 2020 20:48:27 +0100 Subject: [PATCH] Add v0.4.0 changelog summary (#603) This patch adds a changelog summary file for 0.4.0. It also moves the individual PR-wise changelog files from changelogs/master/ to changelogs/0.4.0/. --- changelogs/{raw => 0.3.0}/v0.3.0.cleaned.md | 0 changelogs/{raw => 0.3.0}/v0.3.0.uncleaned.md | 0 .../20191003_reworked_aug_methods.md | 2 +- .../20191016_pooling_affects_maps.md | 0 .../20191026_reworked_quantization.md | 0 .../20191027_improve_invert.md | 0 .../{master => 0.4.0}/20191111_pickleable.md | 0 .../20191113_iterable_augmentables.md | 0 .../20191610_crop_and_pad.md | 0 .../20191610_perspective_transform.md | 0 .../20200107_improved_blending.md | 0 .../{master => 0.4.0}/20200126_python38.md | 0 .../added/20190927_unwrapped_bb_aug.md | 0 .../added/20191002_unwrapped_ls_aug.md | 0 .../20191013_change_color_temperature.md | 0 .../added/20191014_brightness_augmenters.md | 0 .../added/20191016_dropout2d.md | 0 .../added/20191019_colorwise_grayscaling.md | 0 .../added/20191020_cartoon.md | 0 .../added/20191023_mean_shift_blur.md | 0 .../added/20191027_jigsaw.md | 0 .../added/20191101_deterministic_list.md | 0 .../added/20191102_autocontrast.md | 0 .../added/20191103_affine_shear_y.md | 2 +- .../added/20191103_equalize.md | 0 .../added/20191103_identity.md | 0 .../added/20191105_affine_wrappers.md | 2 +- .../added/20191106_ooi_removal.md | 2 +- .../added/20191110_bb_polygon_conversion.md | 0 .../added/20191110_polygon_subdivision.md | 0 .../added/20191110_withpolarwarping.md | 0 .../added/20191117_debug_images.md | 0 .../added/20191117_pad_multi_cval.md | 0 .../added/20191218_imagecorruptions.md | 0 .../added/20191220_cutout.md | 0 .../added/20191221_inplace_cba_methods.md | 0 .../added/20191224_pil_module.md | 0 .../added/20191230_standardized_lut.md | 0 .../added/20200101_bb_label_drawing.md | 0 .../added/20200102_cbasoi_getitem.md | 0 .../added/20200105_discretize_round.md | 0 .../{master => 0.4.0}/added/20200106_rain.md | 0 .../added/20200106_randaugment.md | 0 .../added/20200125_image_warnings.md | 0 .../20190929_rngs_polygon_recoverer.md | 6 +- .../20191110_affine_translation_precision.md | 0 .../changed/20191128_affine_translate.md | 0 .../changed/20191230_dont_import_msgs.md | 0 .../20200103_standardized_shift_interfaces.md | 0 .../20200112_simplified_augmenter_args.md | 0 .../changed/20200115_changed_defaults.md | 2 +- .../changed/20200125_any_opencv_accepted.md | 0 .../deprecated/20190926_rename_inplace.md | 0 .../20191230_deprecate_affinecv2.md | 0 .../fixed/20190926_fixed_resize_dtype.md | 0 .../fixed/20190928_fixed_affine_coords_aug.md | 0 .../20190928_fixed_pwa_empty_kps_unaligned.md | 0 .../fixed/20190928_fixed_type_val.md | 0 .../20190929_fixed_assert_is_iterable_of.md | 0 .../20191003_fixed_image_normalization.md | 0 changelogs/0.4.0/fixed/20191003_fixed_typo.md | 1 + .../20191006_fixed_withchannels_alignment.md | 0 ...191106_fixed_random_state_funcs_missing.md | 0 .../fixed/20191110_fixed_affine_map_aug.md | 0 .../20191111_fixed_snowflakeslayer_crash.md | 0 .../20191111_multiplyhueandsaturation_rng.md | 0 .../fixed/20191124_fixed_cloud_layer_float.md | 2 +- .../fixed/20191128_fixed_affine_translate.md | 0 .../fixed/20191128_fixed_hanging_nixos.md | 0 .../fixed/20191217_collections_abc.md | 0 .../20191218_fixed_fromfunction_deprecated.md | 0 .../fixed/20191222_fixed_numpy_1_18.md | 0 ...1223_fixed_opencv_multicore_aug_hanging.md | 0 .../fixed/20200110_fixed_seed.md | 0 ...00111_fixed_elastic_transformation_cval.md | 0 .../20200113_fixed_weather_randomness.md | 0 .../fixed/20200118_perspt_inaccuracy.md | 0 .../fixed/20200122_fix_keepsizebyresize.md | 0 .../fixed/20200126_shapely_17a2.md | 0 .../refactored/20191124_pylint.md | 0 .../20200111_opencv_normalization.md | 0 .../renamed/20190926_rename_inplace.md | 0 .../master/fixed/20191003_fixed_typo.md | 1 - changelogs/v0.4.0.summary.md | 1865 +++++++++++++++++ 84 files changed, 1876 insertions(+), 9 deletions(-) rename changelogs/{raw => 0.3.0}/v0.3.0.cleaned.md (100%) rename changelogs/{raw => 0.3.0}/v0.3.0.uncleaned.md (100%) rename changelogs/{master => 0.4.0}/20191003_reworked_aug_methods.md (99%) rename changelogs/{master => 0.4.0}/20191016_pooling_affects_maps.md (100%) rename changelogs/{master => 0.4.0}/20191026_reworked_quantization.md (100%) rename changelogs/{master => 0.4.0}/20191027_improve_invert.md (100%) rename changelogs/{master => 0.4.0}/20191111_pickleable.md (100%) rename changelogs/{master => 0.4.0}/20191113_iterable_augmentables.md (100%) rename changelogs/{master => 0.4.0}/20191610_crop_and_pad.md (100%) rename changelogs/{master => 0.4.0}/20191610_perspective_transform.md (100%) rename changelogs/{master => 0.4.0}/20200107_improved_blending.md (100%) rename changelogs/{master => 0.4.0}/20200126_python38.md (100%) rename changelogs/{master => 0.4.0}/added/20190927_unwrapped_bb_aug.md (100%) rename changelogs/{master => 0.4.0}/added/20191002_unwrapped_ls_aug.md (100%) rename changelogs/{master => 0.4.0}/added/20191013_change_color_temperature.md (100%) rename changelogs/{master => 0.4.0}/added/20191014_brightness_augmenters.md (100%) rename changelogs/{master => 0.4.0}/added/20191016_dropout2d.md (100%) rename changelogs/{master => 0.4.0}/added/20191019_colorwise_grayscaling.md (100%) rename changelogs/{master => 0.4.0}/added/20191020_cartoon.md (100%) rename changelogs/{master => 0.4.0}/added/20191023_mean_shift_blur.md (100%) rename changelogs/{master => 0.4.0}/added/20191027_jigsaw.md (100%) rename changelogs/{master => 0.4.0}/added/20191101_deterministic_list.md (100%) rename changelogs/{master => 0.4.0}/added/20191102_autocontrast.md (100%) rename changelogs/{master => 0.4.0}/added/20191103_affine_shear_y.md (94%) rename changelogs/{master => 0.4.0}/added/20191103_equalize.md (100%) rename changelogs/{master => 0.4.0}/added/20191103_identity.md (100%) rename changelogs/{master => 0.4.0}/added/20191105_affine_wrappers.md (89%) rename changelogs/{master => 0.4.0}/added/20191106_ooi_removal.md (99%) rename changelogs/{master => 0.4.0}/added/20191110_bb_polygon_conversion.md (100%) rename changelogs/{master => 0.4.0}/added/20191110_polygon_subdivision.md (100%) rename changelogs/{master => 0.4.0}/added/20191110_withpolarwarping.md (100%) rename changelogs/{master => 0.4.0}/added/20191117_debug_images.md (100%) rename changelogs/{master => 0.4.0}/added/20191117_pad_multi_cval.md (100%) rename changelogs/{master => 0.4.0}/added/20191218_imagecorruptions.md (100%) rename changelogs/{master => 0.4.0}/added/20191220_cutout.md (100%) rename changelogs/{master => 0.4.0}/added/20191221_inplace_cba_methods.md (100%) rename changelogs/{master => 0.4.0}/added/20191224_pil_module.md (100%) rename changelogs/{master => 0.4.0}/added/20191230_standardized_lut.md (100%) rename changelogs/{master => 0.4.0}/added/20200101_bb_label_drawing.md (100%) rename changelogs/{master => 0.4.0}/added/20200102_cbasoi_getitem.md (100%) rename changelogs/{master => 0.4.0}/added/20200105_discretize_round.md (100%) rename changelogs/{master => 0.4.0}/added/20200106_rain.md (100%) rename changelogs/{master => 0.4.0}/added/20200106_randaugment.md (100%) rename changelogs/{master => 0.4.0}/added/20200125_image_warnings.md (100%) rename changelogs/{master => 0.4.0}/changed/20190929_rngs_polygon_recoverer.md (65%) rename changelogs/{master => 0.4.0}/changed/20191110_affine_translation_precision.md (100%) rename changelogs/{master => 0.4.0}/changed/20191128_affine_translate.md (100%) rename changelogs/{master => 0.4.0}/changed/20191230_dont_import_msgs.md (100%) rename changelogs/{master => 0.4.0}/changed/20200103_standardized_shift_interfaces.md (100%) rename changelogs/{master => 0.4.0}/changed/20200112_simplified_augmenter_args.md (100%) rename changelogs/{master => 0.4.0}/changed/20200115_changed_defaults.md (99%) rename changelogs/{master => 0.4.0}/changed/20200125_any_opencv_accepted.md (100%) rename changelogs/{master => 0.4.0}/deprecated/20190926_rename_inplace.md (100%) rename changelogs/{master => 0.4.0}/deprecated/20191230_deprecate_affinecv2.md (100%) rename changelogs/{master => 0.4.0}/fixed/20190926_fixed_resize_dtype.md (100%) rename changelogs/{master => 0.4.0}/fixed/20190928_fixed_affine_coords_aug.md (100%) rename changelogs/{master => 0.4.0}/fixed/20190928_fixed_pwa_empty_kps_unaligned.md (100%) rename changelogs/{master => 0.4.0}/fixed/20190928_fixed_type_val.md (100%) rename changelogs/{master => 0.4.0}/fixed/20190929_fixed_assert_is_iterable_of.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191003_fixed_image_normalization.md (100%) create mode 100644 changelogs/0.4.0/fixed/20191003_fixed_typo.md rename changelogs/{master => 0.4.0}/fixed/20191006_fixed_withchannels_alignment.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191106_fixed_random_state_funcs_missing.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191110_fixed_affine_map_aug.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191111_fixed_snowflakeslayer_crash.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191111_multiplyhueandsaturation_rng.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191124_fixed_cloud_layer_float.md (63%) rename changelogs/{master => 0.4.0}/fixed/20191128_fixed_affine_translate.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191128_fixed_hanging_nixos.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191217_collections_abc.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191218_fixed_fromfunction_deprecated.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191222_fixed_numpy_1_18.md (100%) rename changelogs/{master => 0.4.0}/fixed/20191223_fixed_opencv_multicore_aug_hanging.md (100%) rename changelogs/{master => 0.4.0}/fixed/20200110_fixed_seed.md (100%) rename changelogs/{master => 0.4.0}/fixed/20200111_fixed_elastic_transformation_cval.md (100%) rename changelogs/{master => 0.4.0}/fixed/20200113_fixed_weather_randomness.md (100%) rename changelogs/{master => 0.4.0}/fixed/20200118_perspt_inaccuracy.md (100%) rename changelogs/{master => 0.4.0}/fixed/20200122_fix_keepsizebyresize.md (100%) rename changelogs/{master => 0.4.0}/fixed/20200126_shapely_17a2.md (100%) rename changelogs/{master => 0.4.0}/refactored/20191124_pylint.md (100%) rename changelogs/{master => 0.4.0}/refactored/20200111_opencv_normalization.md (100%) rename changelogs/{master => 0.4.0}/renamed/20190926_rename_inplace.md (100%) delete mode 100644 changelogs/master/fixed/20191003_fixed_typo.md create mode 100644 changelogs/v0.4.0.summary.md diff --git a/changelogs/raw/v0.3.0.cleaned.md b/changelogs/0.3.0/v0.3.0.cleaned.md similarity index 100% rename from changelogs/raw/v0.3.0.cleaned.md rename to changelogs/0.3.0/v0.3.0.cleaned.md diff --git a/changelogs/raw/v0.3.0.uncleaned.md b/changelogs/0.3.0/v0.3.0.uncleaned.md similarity index 100% rename from changelogs/raw/v0.3.0.uncleaned.md rename to changelogs/0.3.0/v0.3.0.uncleaned.md diff --git a/changelogs/master/20191003_reworked_aug_methods.md b/changelogs/0.4.0/20191003_reworked_aug_methods.md similarity index 99% rename from changelogs/master/20191003_reworked_aug_methods.md rename to changelogs/0.4.0/20191003_reworked_aug_methods.md index 2cc15422d..32341749b 100644 --- a/changelogs/master/20191003_reworked_aug_methods.md +++ b/changelogs/0.4.0/20191003_reworked_aug_methods.md @@ -14,7 +14,7 @@ `imgaug.augmentables.batches.Batch`. * Added method `fill_from_augmented_normalized_batch_()` to `imgaug.augmentables.batches.UnnormalizedBatch`. -* Added class `imgaug.augmentables.batches.BatchInAugmentation`. +* Added class `imgaug.augmentables.batches._BatchInAugmentation`. * Added method `_augment_batch_()` in `imgaug.augmenters.meta.Augmenter`. This method is now called from `augment_batch_()`. * Changed `augment_images()` in `imgaug.augmenters.meta.Augmenter` to be diff --git a/changelogs/master/20191016_pooling_affects_maps.md b/changelogs/0.4.0/20191016_pooling_affects_maps.md similarity index 100% rename from changelogs/master/20191016_pooling_affects_maps.md rename to changelogs/0.4.0/20191016_pooling_affects_maps.md diff --git a/changelogs/master/20191026_reworked_quantization.md b/changelogs/0.4.0/20191026_reworked_quantization.md similarity index 100% rename from changelogs/master/20191026_reworked_quantization.md rename to changelogs/0.4.0/20191026_reworked_quantization.md diff --git a/changelogs/master/20191027_improve_invert.md b/changelogs/0.4.0/20191027_improve_invert.md similarity index 100% rename from changelogs/master/20191027_improve_invert.md rename to changelogs/0.4.0/20191027_improve_invert.md diff --git a/changelogs/master/20191111_pickleable.md b/changelogs/0.4.0/20191111_pickleable.md similarity index 100% rename from changelogs/master/20191111_pickleable.md rename to changelogs/0.4.0/20191111_pickleable.md diff --git a/changelogs/master/20191113_iterable_augmentables.md b/changelogs/0.4.0/20191113_iterable_augmentables.md similarity index 100% rename from changelogs/master/20191113_iterable_augmentables.md rename to changelogs/0.4.0/20191113_iterable_augmentables.md diff --git a/changelogs/master/20191610_crop_and_pad.md b/changelogs/0.4.0/20191610_crop_and_pad.md similarity index 100% rename from changelogs/master/20191610_crop_and_pad.md rename to changelogs/0.4.0/20191610_crop_and_pad.md diff --git a/changelogs/master/20191610_perspective_transform.md b/changelogs/0.4.0/20191610_perspective_transform.md similarity index 100% rename from changelogs/master/20191610_perspective_transform.md rename to changelogs/0.4.0/20191610_perspective_transform.md diff --git a/changelogs/master/20200107_improved_blending.md b/changelogs/0.4.0/20200107_improved_blending.md similarity index 100% rename from changelogs/master/20200107_improved_blending.md rename to changelogs/0.4.0/20200107_improved_blending.md diff --git a/changelogs/master/20200126_python38.md b/changelogs/0.4.0/20200126_python38.md similarity index 100% rename from changelogs/master/20200126_python38.md rename to changelogs/0.4.0/20200126_python38.md diff --git a/changelogs/master/added/20190927_unwrapped_bb_aug.md b/changelogs/0.4.0/added/20190927_unwrapped_bb_aug.md similarity index 100% rename from changelogs/master/added/20190927_unwrapped_bb_aug.md rename to changelogs/0.4.0/added/20190927_unwrapped_bb_aug.md diff --git a/changelogs/master/added/20191002_unwrapped_ls_aug.md b/changelogs/0.4.0/added/20191002_unwrapped_ls_aug.md similarity index 100% rename from changelogs/master/added/20191002_unwrapped_ls_aug.md rename to changelogs/0.4.0/added/20191002_unwrapped_ls_aug.md diff --git a/changelogs/master/added/20191013_change_color_temperature.md b/changelogs/0.4.0/added/20191013_change_color_temperature.md similarity index 100% rename from changelogs/master/added/20191013_change_color_temperature.md rename to changelogs/0.4.0/added/20191013_change_color_temperature.md diff --git a/changelogs/master/added/20191014_brightness_augmenters.md b/changelogs/0.4.0/added/20191014_brightness_augmenters.md similarity index 100% rename from changelogs/master/added/20191014_brightness_augmenters.md rename to changelogs/0.4.0/added/20191014_brightness_augmenters.md diff --git a/changelogs/master/added/20191016_dropout2d.md b/changelogs/0.4.0/added/20191016_dropout2d.md similarity index 100% rename from changelogs/master/added/20191016_dropout2d.md rename to changelogs/0.4.0/added/20191016_dropout2d.md diff --git a/changelogs/master/added/20191019_colorwise_grayscaling.md b/changelogs/0.4.0/added/20191019_colorwise_grayscaling.md similarity index 100% rename from changelogs/master/added/20191019_colorwise_grayscaling.md rename to changelogs/0.4.0/added/20191019_colorwise_grayscaling.md diff --git a/changelogs/master/added/20191020_cartoon.md b/changelogs/0.4.0/added/20191020_cartoon.md similarity index 100% rename from changelogs/master/added/20191020_cartoon.md rename to changelogs/0.4.0/added/20191020_cartoon.md diff --git a/changelogs/master/added/20191023_mean_shift_blur.md b/changelogs/0.4.0/added/20191023_mean_shift_blur.md similarity index 100% rename from changelogs/master/added/20191023_mean_shift_blur.md rename to changelogs/0.4.0/added/20191023_mean_shift_blur.md diff --git a/changelogs/master/added/20191027_jigsaw.md b/changelogs/0.4.0/added/20191027_jigsaw.md similarity index 100% rename from changelogs/master/added/20191027_jigsaw.md rename to changelogs/0.4.0/added/20191027_jigsaw.md diff --git a/changelogs/master/added/20191101_deterministic_list.md b/changelogs/0.4.0/added/20191101_deterministic_list.md similarity index 100% rename from changelogs/master/added/20191101_deterministic_list.md rename to changelogs/0.4.0/added/20191101_deterministic_list.md diff --git a/changelogs/master/added/20191102_autocontrast.md b/changelogs/0.4.0/added/20191102_autocontrast.md similarity index 100% rename from changelogs/master/added/20191102_autocontrast.md rename to changelogs/0.4.0/added/20191102_autocontrast.md diff --git a/changelogs/master/added/20191103_affine_shear_y.md b/changelogs/0.4.0/added/20191103_affine_shear_y.md similarity index 94% rename from changelogs/master/added/20191103_affine_shear_y.md rename to changelogs/0.4.0/added/20191103_affine_shear_y.md index a111c0caf..68e471098 100644 --- a/changelogs/master/added/20191103_affine_shear_y.md +++ b/changelogs/0.4.0/added/20191103_affine_shear_y.md @@ -1,4 +1,4 @@ -# Affine Shear on the Y-Axis +# Affine Shear on the Y-Axis #482 * [rarely breaking] Extended `Affine` to also support shearing on the y-axis (previously, only x-axis was possible). This feature can be used diff --git a/changelogs/master/added/20191103_equalize.md b/changelogs/0.4.0/added/20191103_equalize.md similarity index 100% rename from changelogs/master/added/20191103_equalize.md rename to changelogs/0.4.0/added/20191103_equalize.md diff --git a/changelogs/master/added/20191103_identity.md b/changelogs/0.4.0/added/20191103_identity.md similarity index 100% rename from changelogs/master/added/20191103_identity.md rename to changelogs/0.4.0/added/20191103_identity.md diff --git a/changelogs/master/added/20191105_affine_wrappers.md b/changelogs/0.4.0/added/20191105_affine_wrappers.md similarity index 89% rename from changelogs/master/added/20191105_affine_wrappers.md rename to changelogs/0.4.0/added/20191105_affine_wrappers.md index 69aa0d3b0..3bf1451c8 100644 --- a/changelogs/master/added/20191105_affine_wrappers.md +++ b/changelogs/0.4.0/added/20191105_affine_wrappers.md @@ -1,4 +1,4 @@ -# Added Wrappers around `Affine` +# Added Wrappers around `Affine` #484 * Added `imgaug.augmenters.geometric.ScaleX`. * Added `imgaug.augmenters.geometric.ScaleY`. diff --git a/changelogs/master/added/20191106_ooi_removal.md b/changelogs/0.4.0/added/20191106_ooi_removal.md similarity index 99% rename from changelogs/master/added/20191106_ooi_removal.md rename to changelogs/0.4.0/added/20191106_ooi_removal.md index a498acf13..b96dc54ca 100644 --- a/changelogs/master/added/20191106_ooi_removal.md +++ b/changelogs/0.4.0/added/20191106_ooi_removal.md @@ -1,4 +1,4 @@ -# Removal of Coordinate-Based Augmentables Outside of the Image Plane +# Removal of Coordinate-Based Augmentables Outside of the Image Plane #487 * Added `Keypoint.is_out_of_image()`. diff --git a/changelogs/master/added/20191110_bb_polygon_conversion.md b/changelogs/0.4.0/added/20191110_bb_polygon_conversion.md similarity index 100% rename from changelogs/master/added/20191110_bb_polygon_conversion.md rename to changelogs/0.4.0/added/20191110_bb_polygon_conversion.md diff --git a/changelogs/master/added/20191110_polygon_subdivision.md b/changelogs/0.4.0/added/20191110_polygon_subdivision.md similarity index 100% rename from changelogs/master/added/20191110_polygon_subdivision.md rename to changelogs/0.4.0/added/20191110_polygon_subdivision.md diff --git a/changelogs/master/added/20191110_withpolarwarping.md b/changelogs/0.4.0/added/20191110_withpolarwarping.md similarity index 100% rename from changelogs/master/added/20191110_withpolarwarping.md rename to changelogs/0.4.0/added/20191110_withpolarwarping.md diff --git a/changelogs/master/added/20191117_debug_images.md b/changelogs/0.4.0/added/20191117_debug_images.md similarity index 100% rename from changelogs/master/added/20191117_debug_images.md rename to changelogs/0.4.0/added/20191117_debug_images.md diff --git a/changelogs/master/added/20191117_pad_multi_cval.md b/changelogs/0.4.0/added/20191117_pad_multi_cval.md similarity index 100% rename from changelogs/master/added/20191117_pad_multi_cval.md rename to changelogs/0.4.0/added/20191117_pad_multi_cval.md diff --git a/changelogs/master/added/20191218_imagecorruptions.md b/changelogs/0.4.0/added/20191218_imagecorruptions.md similarity index 100% rename from changelogs/master/added/20191218_imagecorruptions.md rename to changelogs/0.4.0/added/20191218_imagecorruptions.md diff --git a/changelogs/master/added/20191220_cutout.md b/changelogs/0.4.0/added/20191220_cutout.md similarity index 100% rename from changelogs/master/added/20191220_cutout.md rename to changelogs/0.4.0/added/20191220_cutout.md diff --git a/changelogs/master/added/20191221_inplace_cba_methods.md b/changelogs/0.4.0/added/20191221_inplace_cba_methods.md similarity index 100% rename from changelogs/master/added/20191221_inplace_cba_methods.md rename to changelogs/0.4.0/added/20191221_inplace_cba_methods.md diff --git a/changelogs/master/added/20191224_pil_module.md b/changelogs/0.4.0/added/20191224_pil_module.md similarity index 100% rename from changelogs/master/added/20191224_pil_module.md rename to changelogs/0.4.0/added/20191224_pil_module.md diff --git a/changelogs/master/added/20191230_standardized_lut.md b/changelogs/0.4.0/added/20191230_standardized_lut.md similarity index 100% rename from changelogs/master/added/20191230_standardized_lut.md rename to changelogs/0.4.0/added/20191230_standardized_lut.md diff --git a/changelogs/master/added/20200101_bb_label_drawing.md b/changelogs/0.4.0/added/20200101_bb_label_drawing.md similarity index 100% rename from changelogs/master/added/20200101_bb_label_drawing.md rename to changelogs/0.4.0/added/20200101_bb_label_drawing.md diff --git a/changelogs/master/added/20200102_cbasoi_getitem.md b/changelogs/0.4.0/added/20200102_cbasoi_getitem.md similarity index 100% rename from changelogs/master/added/20200102_cbasoi_getitem.md rename to changelogs/0.4.0/added/20200102_cbasoi_getitem.md diff --git a/changelogs/master/added/20200105_discretize_round.md b/changelogs/0.4.0/added/20200105_discretize_round.md similarity index 100% rename from changelogs/master/added/20200105_discretize_round.md rename to changelogs/0.4.0/added/20200105_discretize_round.md diff --git a/changelogs/master/added/20200106_rain.md b/changelogs/0.4.0/added/20200106_rain.md similarity index 100% rename from changelogs/master/added/20200106_rain.md rename to changelogs/0.4.0/added/20200106_rain.md diff --git a/changelogs/master/added/20200106_randaugment.md b/changelogs/0.4.0/added/20200106_randaugment.md similarity index 100% rename from changelogs/master/added/20200106_randaugment.md rename to changelogs/0.4.0/added/20200106_randaugment.md diff --git a/changelogs/master/added/20200125_image_warnings.md b/changelogs/0.4.0/added/20200125_image_warnings.md similarity index 100% rename from changelogs/master/added/20200125_image_warnings.md rename to changelogs/0.4.0/added/20200125_image_warnings.md diff --git a/changelogs/master/changed/20190929_rngs_polygon_recoverer.md b/changelogs/0.4.0/changed/20190929_rngs_polygon_recoverer.md similarity index 65% rename from changelogs/master/changed/20190929_rngs_polygon_recoverer.md rename to changelogs/0.4.0/changed/20190929_rngs_polygon_recoverer.md index 84f4beab6..f6e90c68e 100644 --- a/changelogs/master/changed/20190929_rngs_polygon_recoverer.md +++ b/changelogs/0.4.0/changed/20190929_rngs_polygon_recoverer.md @@ -1,4 +1,6 @@ +# Improved RNG Handling during Polygon Augmentation #447 + * Changed `Augmenter.augment_polygons()` to copy the augmenter's RNG before starting concave polygon recovery. This is done for cleanliness and - should not have any effects for users. #447 -* Removed RNG copies in `_ConcavePolygonRecoverer` to improve performance. #447 + should not have any effects for users. +* Removed RNG copies in `_ConcavePolygonRecoverer` to improve performance. diff --git a/changelogs/master/changed/20191110_affine_translation_precision.md b/changelogs/0.4.0/changed/20191110_affine_translation_precision.md similarity index 100% rename from changelogs/master/changed/20191110_affine_translation_precision.md rename to changelogs/0.4.0/changed/20191110_affine_translation_precision.md diff --git a/changelogs/master/changed/20191128_affine_translate.md b/changelogs/0.4.0/changed/20191128_affine_translate.md similarity index 100% rename from changelogs/master/changed/20191128_affine_translate.md rename to changelogs/0.4.0/changed/20191128_affine_translate.md diff --git a/changelogs/master/changed/20191230_dont_import_msgs.md b/changelogs/0.4.0/changed/20191230_dont_import_msgs.md similarity index 100% rename from changelogs/master/changed/20191230_dont_import_msgs.md rename to changelogs/0.4.0/changed/20191230_dont_import_msgs.md diff --git a/changelogs/master/changed/20200103_standardized_shift_interfaces.md b/changelogs/0.4.0/changed/20200103_standardized_shift_interfaces.md similarity index 100% rename from changelogs/master/changed/20200103_standardized_shift_interfaces.md rename to changelogs/0.4.0/changed/20200103_standardized_shift_interfaces.md diff --git a/changelogs/master/changed/20200112_simplified_augmenter_args.md b/changelogs/0.4.0/changed/20200112_simplified_augmenter_args.md similarity index 100% rename from changelogs/master/changed/20200112_simplified_augmenter_args.md rename to changelogs/0.4.0/changed/20200112_simplified_augmenter_args.md diff --git a/changelogs/master/changed/20200115_changed_defaults.md b/changelogs/0.4.0/changed/20200115_changed_defaults.md similarity index 99% rename from changelogs/master/changed/20200115_changed_defaults.md rename to changelogs/0.4.0/changed/20200115_changed_defaults.md index bf4c8df4d..b3438641a 100644 --- a/changelogs/master/changed/20200115_changed_defaults.md +++ b/changelogs/0.4.0/changed/20200115_changed_defaults.md @@ -1,4 +1,4 @@ -# Better default values #582 +# Improved Default Values of Augmenters #582 **[breaking]** Most augmenters had previously default values that made them equivalent to identity functions. Users had to explicitly diff --git a/changelogs/master/changed/20200125_any_opencv_accepted.md b/changelogs/0.4.0/changed/20200125_any_opencv_accepted.md similarity index 100% rename from changelogs/master/changed/20200125_any_opencv_accepted.md rename to changelogs/0.4.0/changed/20200125_any_opencv_accepted.md diff --git a/changelogs/master/deprecated/20190926_rename_inplace.md b/changelogs/0.4.0/deprecated/20190926_rename_inplace.md similarity index 100% rename from changelogs/master/deprecated/20190926_rename_inplace.md rename to changelogs/0.4.0/deprecated/20190926_rename_inplace.md diff --git a/changelogs/master/deprecated/20191230_deprecate_affinecv2.md b/changelogs/0.4.0/deprecated/20191230_deprecate_affinecv2.md similarity index 100% rename from changelogs/master/deprecated/20191230_deprecate_affinecv2.md rename to changelogs/0.4.0/deprecated/20191230_deprecate_affinecv2.md diff --git a/changelogs/master/fixed/20190926_fixed_resize_dtype.md b/changelogs/0.4.0/fixed/20190926_fixed_resize_dtype.md similarity index 100% rename from changelogs/master/fixed/20190926_fixed_resize_dtype.md rename to changelogs/0.4.0/fixed/20190926_fixed_resize_dtype.md diff --git a/changelogs/master/fixed/20190928_fixed_affine_coords_aug.md b/changelogs/0.4.0/fixed/20190928_fixed_affine_coords_aug.md similarity index 100% rename from changelogs/master/fixed/20190928_fixed_affine_coords_aug.md rename to changelogs/0.4.0/fixed/20190928_fixed_affine_coords_aug.md diff --git a/changelogs/master/fixed/20190928_fixed_pwa_empty_kps_unaligned.md b/changelogs/0.4.0/fixed/20190928_fixed_pwa_empty_kps_unaligned.md similarity index 100% rename from changelogs/master/fixed/20190928_fixed_pwa_empty_kps_unaligned.md rename to changelogs/0.4.0/fixed/20190928_fixed_pwa_empty_kps_unaligned.md diff --git a/changelogs/master/fixed/20190928_fixed_type_val.md b/changelogs/0.4.0/fixed/20190928_fixed_type_val.md similarity index 100% rename from changelogs/master/fixed/20190928_fixed_type_val.md rename to changelogs/0.4.0/fixed/20190928_fixed_type_val.md diff --git a/changelogs/master/fixed/20190929_fixed_assert_is_iterable_of.md b/changelogs/0.4.0/fixed/20190929_fixed_assert_is_iterable_of.md similarity index 100% rename from changelogs/master/fixed/20190929_fixed_assert_is_iterable_of.md rename to changelogs/0.4.0/fixed/20190929_fixed_assert_is_iterable_of.md diff --git a/changelogs/master/fixed/20191003_fixed_image_normalization.md b/changelogs/0.4.0/fixed/20191003_fixed_image_normalization.md similarity index 100% rename from changelogs/master/fixed/20191003_fixed_image_normalization.md rename to changelogs/0.4.0/fixed/20191003_fixed_image_normalization.md diff --git a/changelogs/0.4.0/fixed/20191003_fixed_typo.md b/changelogs/0.4.0/fixed/20191003_fixed_typo.md new file mode 100644 index 000000000..ae766b793 --- /dev/null +++ b/changelogs/0.4.0/fixed/20191003_fixed_typo.md @@ -0,0 +1 @@ +* Fixed typo in image normalization. #451 diff --git a/changelogs/master/fixed/20191006_fixed_withchannels_alignment.md b/changelogs/0.4.0/fixed/20191006_fixed_withchannels_alignment.md similarity index 100% rename from changelogs/master/fixed/20191006_fixed_withchannels_alignment.md rename to changelogs/0.4.0/fixed/20191006_fixed_withchannels_alignment.md diff --git a/changelogs/master/fixed/20191106_fixed_random_state_funcs_missing.md b/changelogs/0.4.0/fixed/20191106_fixed_random_state_funcs_missing.md similarity index 100% rename from changelogs/master/fixed/20191106_fixed_random_state_funcs_missing.md rename to changelogs/0.4.0/fixed/20191106_fixed_random_state_funcs_missing.md diff --git a/changelogs/master/fixed/20191110_fixed_affine_map_aug.md b/changelogs/0.4.0/fixed/20191110_fixed_affine_map_aug.md similarity index 100% rename from changelogs/master/fixed/20191110_fixed_affine_map_aug.md rename to changelogs/0.4.0/fixed/20191110_fixed_affine_map_aug.md diff --git a/changelogs/master/fixed/20191111_fixed_snowflakeslayer_crash.md b/changelogs/0.4.0/fixed/20191111_fixed_snowflakeslayer_crash.md similarity index 100% rename from changelogs/master/fixed/20191111_fixed_snowflakeslayer_crash.md rename to changelogs/0.4.0/fixed/20191111_fixed_snowflakeslayer_crash.md diff --git a/changelogs/master/fixed/20191111_multiplyhueandsaturation_rng.md b/changelogs/0.4.0/fixed/20191111_multiplyhueandsaturation_rng.md similarity index 100% rename from changelogs/master/fixed/20191111_multiplyhueandsaturation_rng.md rename to changelogs/0.4.0/fixed/20191111_multiplyhueandsaturation_rng.md diff --git a/changelogs/master/fixed/20191124_fixed_cloud_layer_float.md b/changelogs/0.4.0/fixed/20191124_fixed_cloud_layer_float.md similarity index 63% rename from changelogs/master/fixed/20191124_fixed_cloud_layer_float.md rename to changelogs/0.4.0/fixed/20191124_fixed_cloud_layer_float.md index 2aa393f54..c9d53cbe4 100644 --- a/changelogs/master/fixed/20191124_fixed_cloud_layer_float.md +++ b/changelogs/0.4.0/fixed/20191124_fixed_cloud_layer_float.md @@ -1,2 +1,2 @@ * Fixed `CloudLayer.draw_on_image()` producing tuples instead of arrays - as output for `float` input images. \ No newline at end of file + as output for `float` input images. #540 \ No newline at end of file diff --git a/changelogs/master/fixed/20191128_fixed_affine_translate.md b/changelogs/0.4.0/fixed/20191128_fixed_affine_translate.md similarity index 100% rename from changelogs/master/fixed/20191128_fixed_affine_translate.md rename to changelogs/0.4.0/fixed/20191128_fixed_affine_translate.md diff --git a/changelogs/master/fixed/20191128_fixed_hanging_nixos.md b/changelogs/0.4.0/fixed/20191128_fixed_hanging_nixos.md similarity index 100% rename from changelogs/master/fixed/20191128_fixed_hanging_nixos.md rename to changelogs/0.4.0/fixed/20191128_fixed_hanging_nixos.md diff --git a/changelogs/master/fixed/20191217_collections_abc.md b/changelogs/0.4.0/fixed/20191217_collections_abc.md similarity index 100% rename from changelogs/master/fixed/20191217_collections_abc.md rename to changelogs/0.4.0/fixed/20191217_collections_abc.md diff --git a/changelogs/master/fixed/20191218_fixed_fromfunction_deprecated.md b/changelogs/0.4.0/fixed/20191218_fixed_fromfunction_deprecated.md similarity index 100% rename from changelogs/master/fixed/20191218_fixed_fromfunction_deprecated.md rename to changelogs/0.4.0/fixed/20191218_fixed_fromfunction_deprecated.md diff --git a/changelogs/master/fixed/20191222_fixed_numpy_1_18.md b/changelogs/0.4.0/fixed/20191222_fixed_numpy_1_18.md similarity index 100% rename from changelogs/master/fixed/20191222_fixed_numpy_1_18.md rename to changelogs/0.4.0/fixed/20191222_fixed_numpy_1_18.md diff --git a/changelogs/master/fixed/20191223_fixed_opencv_multicore_aug_hanging.md b/changelogs/0.4.0/fixed/20191223_fixed_opencv_multicore_aug_hanging.md similarity index 100% rename from changelogs/master/fixed/20191223_fixed_opencv_multicore_aug_hanging.md rename to changelogs/0.4.0/fixed/20191223_fixed_opencv_multicore_aug_hanging.md diff --git a/changelogs/master/fixed/20200110_fixed_seed.md b/changelogs/0.4.0/fixed/20200110_fixed_seed.md similarity index 100% rename from changelogs/master/fixed/20200110_fixed_seed.md rename to changelogs/0.4.0/fixed/20200110_fixed_seed.md diff --git a/changelogs/master/fixed/20200111_fixed_elastic_transformation_cval.md b/changelogs/0.4.0/fixed/20200111_fixed_elastic_transformation_cval.md similarity index 100% rename from changelogs/master/fixed/20200111_fixed_elastic_transformation_cval.md rename to changelogs/0.4.0/fixed/20200111_fixed_elastic_transformation_cval.md diff --git a/changelogs/master/fixed/20200113_fixed_weather_randomness.md b/changelogs/0.4.0/fixed/20200113_fixed_weather_randomness.md similarity index 100% rename from changelogs/master/fixed/20200113_fixed_weather_randomness.md rename to changelogs/0.4.0/fixed/20200113_fixed_weather_randomness.md diff --git a/changelogs/master/fixed/20200118_perspt_inaccuracy.md b/changelogs/0.4.0/fixed/20200118_perspt_inaccuracy.md similarity index 100% rename from changelogs/master/fixed/20200118_perspt_inaccuracy.md rename to changelogs/0.4.0/fixed/20200118_perspt_inaccuracy.md diff --git a/changelogs/master/fixed/20200122_fix_keepsizebyresize.md b/changelogs/0.4.0/fixed/20200122_fix_keepsizebyresize.md similarity index 100% rename from changelogs/master/fixed/20200122_fix_keepsizebyresize.md rename to changelogs/0.4.0/fixed/20200122_fix_keepsizebyresize.md diff --git a/changelogs/master/fixed/20200126_shapely_17a2.md b/changelogs/0.4.0/fixed/20200126_shapely_17a2.md similarity index 100% rename from changelogs/master/fixed/20200126_shapely_17a2.md rename to changelogs/0.4.0/fixed/20200126_shapely_17a2.md diff --git a/changelogs/master/refactored/20191124_pylint.md b/changelogs/0.4.0/refactored/20191124_pylint.md similarity index 100% rename from changelogs/master/refactored/20191124_pylint.md rename to changelogs/0.4.0/refactored/20191124_pylint.md diff --git a/changelogs/master/refactored/20200111_opencv_normalization.md b/changelogs/0.4.0/refactored/20200111_opencv_normalization.md similarity index 100% rename from changelogs/master/refactored/20200111_opencv_normalization.md rename to changelogs/0.4.0/refactored/20200111_opencv_normalization.md diff --git a/changelogs/master/renamed/20190926_rename_inplace.md b/changelogs/0.4.0/renamed/20190926_rename_inplace.md similarity index 100% rename from changelogs/master/renamed/20190926_rename_inplace.md rename to changelogs/0.4.0/renamed/20190926_rename_inplace.md diff --git a/changelogs/master/fixed/20191003_fixed_typo.md b/changelogs/master/fixed/20191003_fixed_typo.md deleted file mode 100644 index fdcd9547e..000000000 --- a/changelogs/master/fixed/20191003_fixed_typo.md +++ /dev/null @@ -1 +0,0 @@ -* Fixed typo in image normalization. diff --git a/changelogs/v0.4.0.summary.md b/changelogs/v0.4.0.summary.md new file mode 100644 index 000000000..dc55fdcfd --- /dev/null +++ b/changelogs/v0.4.0.summary.md @@ -0,0 +1,1865 @@ +# Table of Contents + +1. [Overview](#overview) +2. [Example Images](#example_images) +3. [Mixed-Category Patches](#mixed_category_patches) +4. [Added](#added) +5. [Changed](#changed) +6. [Refactored](#refactored) +7. [Fixed](#fixed) + + + + +# Overview + +Release `0.4.0` focused mainly on adding new augmenters and improving +the internal augmentation "backend". + +The following augmenters were added (see the +[overview](https://imgaug.readthedocs.io/en/latest/source/overview_of_augmenters.html) +docs for more details): +* `ChangeColorTemperature`: Gives images a red, orange or blue touch. +* New Brightness augmenters: `WithBrightnessChannels`, + `MultiplyAndAddToBrightness`, `MultiplyBrightness`, `AddToBrightness`. +* New Dropout augmenters: `Dropout2d`, `TotalDropout`. +* `RemoveSaturation`: Decreases the saturation of colors. Effects are similar + to `Grayscale`. +* `Cartoon`: Applies a cartoon-style to images (classical / not-learned). +* `MeanShiftBlur`: Blurs images using a mean-shift clustering method. + (Note: Very slow.) +* `Jigsaw`: Splits the image into rectangular cells and randomly switches + some pairs of neighbouring cells. (Note: Does not support bounding boxes, + polygons and line strings.) +* `WithPolarWarping`: Transforms images to polar coordinate space and applies + child augmenters there. +* `SaveDebugImageEveryNBatches`: Generates and saves at every `N`-th batch a + debug image visualizing all inputs within the batch. Useful to gauge + strength and effects of augmentations and quickly spot errors in ground truth + data (e.g. misaligned bounding boxes). +* `Cutout`: Removes rectangular subregions of images. Has some similarity with + `CoarseDropout`. +* `Rain` and `RainLayer`: Adds rain-like effects to images. +* `RandAugment`: Combination of multiple augmenters. Similar to the paper + description. (Note: Can currently only augment images.) +* `Identity`: Same as `Noop`. Does nothing. +* `UniformColorQuantizationToNBits`: Quantizes each image array component down + to `N` bits. Similar to `UniformColorQuantization`. Has the alias + `Posterize`. +* `Solarize`: Invert with threshold. +* `RemoveCBAsByOutOfImageFraction`, `ClipCBAsToImagePlanes`: Augmenters to + remove or clip coordinate-based augmentables, e.g. bounding boxes +* More blend augmenters: + * `BlendAlphaMask`: Uses batch-wise generated masks for alpha-blending. + * `BlendAlphaSomeColors`: Alpha-blends only within image regions having + specific randomly chosen colors. + * `BlendAlphaSegMapClassIds`: Alpha-blends only within image regions having + specific class ids in segmentation maps. + * `BlendAlphaBoundingBoxes`: Alpha-blends only within image regions covered + by bounding boxes having specific labels. + * `BlendAlphaHorizontalLinearGradient`: Alpha-blends using horizontal + linear gradients. + * `BlendAlphaVerticalLinearGradient`: Analogous. + * `BlendAlphaRegularGrid`: Places a regular grid on each image and + samples one alpha value per grid cell. Can be used e.g. to achieve + coarse dropout. + * `BlendAlphaCheckerboard`: Places also a regular grid on each image, + but neighbouring cells use alpha values that are inverse to each other. +* Shortcuts for `Affine`: `ScaleX`, `ScaleY`, `TranslateX`, `TranslateY`, + `Rotate`, `ShearX`, `ShearY`. +* Several new crop and pad augmenters: `CenterCropToFixedSize`, + `CenterPadToFixedSize`, `CropToMultiplesOf`, `CenterCropToMultiplesOf`, + `PadToMultiplesOf`, `CenterPadToMultiplesOf`, `CropToPowersOf`, + `CenterCropToPowersOf`, `PadToPowersOf`, `CenterPadToPowersOf`, + `CropToAspectRatio`, `CenterCropToAspectRatio`, `PadToAspectRatio`, + `CenterPadToAspectRatio`, `PadToSquare`, `CenterPadToSquare`, + `CropToSquare`, `CenterCropToSquare`. +* Wrappers around `imagecorruptions` package (verified to have identical + outputs): + `GaussianNoise`, `ShotNoise`, `ImpulseNoise`, `SpeckleNoise`, + `GaussianBlur`, `GlassBlur`, `DefocusBlur`, `MotionBlur`, `ZoomBlur`, + `Fog`, `Frost`, `Snow`, `Spatter`, `Contrast`, `Brightness`, `Saturate`, + `JpegCompression`, `Pixelate`, `ElasticTransform`. + The augmenters are accessible via `iaa.imgcorruptlike.`. +* Wrappers around `PIL` functions (verified to have identical outputs): + `Solarize`, `Posterize`, `Equalize`, `Autocontrast`, `EnhanceColor`, + `EnhanceContrast`, `EnhanceBrightness`, `EnhanceSharpness`, `FilterBlur`, + `FilterSmooth`, `FilterSmoothMore`, `FilterEdgeEnhance`, + `FilterEdgeEnhanceMore` `FilterFindEdges`, `FilterContour`, + `FilterEmboss`, `FilterSharpen`, `FilterDetail`, `Affine`. + The augmenters are accessible via `iaa.pillike.`. + +Aside from these new augmenters, the following major changes were made: +* Bounding boxes and line strings have now native augmentation methods. + Previously, they were converted to keypoints at the start of the + augmentation, which meant that child augmenters were unable to use + augmentation routines geared towards these two input types as they would + merely see a bunch of keypoints. +* Augmentation happens now batchwise. Previously it was done + input type-wise. This change should improve performance for batches with + different types of inputs by re-using computation results for multiple + inputs. It also makes the library more flexible. +* Improved the default parameters of augmenters. Most of them will now + produce medium-strength augmentations when instantiated without and + parameters. E.g. `CoarseDropout()` will now produce decent augmentations + instead of doing nothing. When using default parameters, + `Fliplr()` and `Flipud()` will always flip (p=100%). + `TotalDropout()` will always drop everything (p=100%). + `Grayscale()` and `RemoveSaturation()` will always fully grayscale/desaturate. + `Rot90()` will always rotate once (clockwise). `Invert()` will always + invert all components (p=100%). +* Reworked the standard parameters shared by all augmenters. + `random_state` was renamed to `seed`, e.g. `Affine(..., seed=1)` + is now valid. The parameter `deterministic` is now deprecated. +* Many methods were added to augmentables, e.g. `BoundingBoxesOnImage` + now supports index-based access (`bbs[0]` instead + of `bbs.bounding_boxes[0]`). +* The bounding box drawing methods now also draw each BB's label. +* All augmenters are now tested to be pickle-able without errors. +* The library is now compatible with numpy 1.18 and python 3.8. +* This release fixes two significant bugs in `Affine` that could lead + to unaligned outputs. It also fixes significant bugs related to + bounding box augmentation and various other issues. The update + is recommended. There are now around 5000 unique tests. + + + + +# Example Images + +## Brightness + +Three new brightness-related augmenters are introduced. The example below +shows `AddToBrightness`. First image is the input, the others show +`AddToBrightness(-100)` to `AddToBrightness(100)`. + + + + +## Cartoon + +A new cartoon style filter is introduced, shown below. Each row starts with +the input image. + + + + +## ChangeColorTemperature + +The color temperature of images can now be modified. The example below +shows `ChangeColorTemperature(kelvin=1000)` to +`ChangeColorTemperature(kelvin=5000)`, with the first image being the input. + + + + +## Cutout + +Cutout is added to the library. The first row shows the hyperparameters that +were used in the corresponding paper. The second row shows two cutout +iterations per image, using intensity values, random RGB values and gaussian +noise to fill in the pixels. First image in each row is the input. + + + + +## Dropout2d and TotalDropout + +Two new dropout augmenters, `Dropout2d` and `TotalDropout`, are added. +The example below shows `Dropout2d`. First image is the input. + + + + +## Jigsaw + +A jigsaw puzzle augmenter is added. The first row below shows its effects +using a grid size of `5x5`. The second row shows `10x10`. +First image in each row is the input. + + + + +## MeanShiftBlur + +A mean shift-based blur augmenter is added. First image below shows the input, +followed by `MeanShiftBlur(5.0)` to `MeanShiftBlur(40.0)`. + + + + +## Posterize + +The example below shows `Posterize` (aka `UniformQuantizationToNBits`) +with `n_bits=8` to `n_bits=1`. First image is the input. + + + + +## Solarize + +The example below shows `Solarize`, which is the same as `Invert` with a +threshold. First image is the input. + + + + +## Rain + +The example below shows the new `Rain` augmenter. First image is the input. + + + + +## RandAugment + +This release adds an implementation of `RandAugment` the following example +shows `RandAugment(n=2, m=20)`. First image is the input. + + + + +## WithPolarWarping + +The example below shows `WithPolarWarping()` in combination with +`CropAndPad` (first row), `Affine` (second row) and +`AveragePooling` (third row). First image in each row is the input. + + + +The augmenter supports all input types, but bounding boxes and polygons +should be used with caution. (Bounding boxes, because they tend to produce +unintuitive results in combination with rotation-like augmentations. +Polygons, because they can become invalid under geometric augmentations +and will have to be repaired, which can easily mess them up.) + + +## imagecorruptions wrappers + +Wrappers around the library `imagecorruptions` are added, which contains +augmentation methods introduced by `Hendrycks and Dietterich - Benchmarking +Neural Network Robustness to Common Corruptions and Surface Variations`. +The methods were used in some recent papers. The example below shows their +effects, always with `severity=3`. + + + + +## PIL wrappers + +Various wrappers around popular `PIL` methods are added. +The image below shows in the first row `Autocontrast`, in the second +`EnhanceColor` (strength of `0.1` to `1.9`), the third +`EnhanceSharpness` (strength of `0.1` to `1.9`), the fourth shows +various convolution-based filters (`FilterBlur`, `FilterSmooth`, +`FilterEdgeEnhance`, `FilterFindEdges`, `FilterContour`, `FilterSharpen`, +`FilterDetail` -- in that order) and the fourth row shows `pillike.Affine` +with the top-left as the transformation origin. +The first image in each row is the input. + + + + +## More Blending Augmenters + +Various new (alpha-)blending augmenters are introduced in this patch. + +The following example makes use of a segmentation map in which all cars +are marked with a segmentation class id. +It uses roughly +`BlendAlphaSegMapClassIds(BlendAlphaSomeColors(AddToHueAndSaturation(...)))` +in order to modify some colors within the car classes. +Left is the input image, right is the output: + +

+ + +

+ +Note that `BlendAlphaSegMapClassIds` must be called with all inputs +at the same time, e.g. via `augmenters(images=..., segmentation_maps...)`. + +This example changes the train color using +`BlendAlphaSegMapClassIds(AddToHueAndSaturation(...))`. The train has a +separate class in the segmentation map. + + + +The next example applies blending to some non color-based augmenters. It uses +roughly `BlendAlphaSegMapClassIds(AdditiveGaussianNoise(...))` (left) +and `BlendAlphaSegMapClassIds(Emboss(...))` (right). The street has a separate +class in the segmentation map. + +

+ + +

+ +This example shows how blending can be used to achieve dropout effects. +It uses roughly `BlendAlphaRegularGrid(Multiply(0.0))` (left) and +`BlendAlphaCheckerboard(Multiply(0.0))` (right). + +

+ + +

+ +This example shows `BlendAlphaSomeColors(RemoveSaturation(1.0))`, applied +to a more colorful image: + + + +This release also adds `BlendAlphaBoundingBoxes`, +`BlendAlphaHorizontalLinearGradient` and +`BlendAlphaVerticalLinearGradient`. These are not visualized here. + + +## SaveDebugImageEveryNBatches + +A new debug helper -- `SaveDebugImageEveryNBatches` -- was added. +The example below shows one of its outputs for a batch containing images, +segmentation maps and bounding boxes. + + + +Note that this augmenter must be called with all inputs at the same time, +e.g. via `augmenters(images=..., segmentation_maps...)` for image + segmap +inputs. + + +
+ +# Mixed-Category Patches + +## Reworked Augmentation Methods [#451](https://github.com/aleju/imgaug/pull/451) [#566](https://github.com/aleju/imgaug/pull/566) + +The internal backend of the library was changed so that augmentation now +happens batchwise instead of input-type-wise. Child augmenters still have +the option of using input-type-wise augmentation. All calls are now at some +point routed through `Augmenter.augment_batch_()` and child augmenters are +expected to implement `_augment_batch_()`. This change allows to re-use +information between different input types within the same batch, which in +turn improves performance and extends the space of possible augmentations. + +Note: It is now recommended to use a batch-wise augmentation call. I.e. +use `.augment_batch_()` or `.augment()` or `.__call__()`. These calls provide +all inputs of a batch at the same time and several of the new augmenters now +explicitly require that (e.g. `BlendAlphaBoundingBoxes`). Example: +```python +import numpy as np +import imgaug as ia +import imgaug.augmenters as iaa + +images = [np.zeros((32, 32, 3), dtype=np.uint8), + np.zeros((64, 64, 3), dtype=np.uint8)] +bbs = [ + [ia.BoundingBox(x1=0, y1=1, x2=2, y2=3)], + [ia.BoundingBox(x1=1, y1=2, x2=3, y2=4), + ia.BoundingBox(x1=2, y1=3, x2=4, y2=5)], +] + +bbsois = [ia.BoundingBoxesOnImage(bbs[0], shape=images[0]), + ia.BoundingBoxesOnImage(bbs[1], shape=images[1])] + +aug = iaa.Affine(rotate=(-30, 30)) + +# No longer recommended: +aug_det = aug.to_deterministic() +images_aug = aug_det.augment_images(images) +bbsois_aug = aug_det.augment_bounding_boxes(bbsois) + +# Now recommended: +images_aug, bbs_aug = aug(images=images, bounding_boxes=bbs) + +``` + +* Added methods: + * `augmentables.batches.Batch.to_normalized_batch()`. + * `augmentables.batches.Batch.get_augmentables()`. + * `augmentables.batches.UnnormalizedBatch.get_augmentables()`. + * `augmentables.batches.Batch.get_augmentable_names()`. + * `augmentables.batches.UnnormalizedBatch.get_augmentable_names()`. + * `augmentables.batches.Batch.to_batch_in_augmentation()`. + * `augmentables.batches.Batch.fill_from_batch_in_augmentation_()`. + * `augmentables.batches.UnnormalizedBatch.fill_from_augmented_normalized_batch()`. + * `augmenters.meta.Augmenter.augment_batch_()`, , + similar to `augment_batch()`, but explicitly works in-place and has a + `parent` parameter. + * `augmenters.meta.Augmenter._augment_batch_()`. + * `augmentables.polys.recover_psois_()`. + * `augmentables.utils.convert_cbaois_to_kpsois()`. + * `augmentables.utils.invert_convert_cbaois_to_kpsois_()`. + * `augmentables.utils.deepcopy_fast()`. + * `augmentables.bbs.BoundingBox.from_point_soup()`. + * `augmentables.bbs.BoundingBoxesOnImages.from_point_soups()`. + * Added method `to_xy_array()` to: + * `augmentables.bbs.BoundingBoxesOnImage`. + * `augmentables.polys.PolygonsOnImage`. + * `augmentables.lines.LineStringsOnImage`. + * Added methods `to_keypoints_on_image()`, + `invert_to_keypoints_on_image_()` and `fill_from_xy_array_()` to: + * `augmentables.kps.KeypointsOnImage`. + * `augmentables.bbs.BoundingBoxesOnImage`. + * `augmentables.polys.PolygonsOnImage`. + * `augmentables.lines.LineStringsOnImage`. + +* Added classes: + * `testutils.TemporaryDirectory` (context) + +* Changed: + * Changed the following methods to be thin wrappers around + `augment_batch_()`: + * `augmenters.meta.Augmenter.augment_images()` + * `augmenters.meta.Augmenter.augment_heatmaps()`. + * `augmenters.meta.Augmenter.augment_segmentation_maps()`. + * `augmenters.meta.Augmenter.augment_keypoints()`. + * `augmenters.meta.Augmenter.augment_bounding_boxes()`. + * `augmenters.meta.Augmenter.augment_polygons()`. + * `augmenters.meta.Augmenter.augment_line_strings()`. + * Changed `augment_image()`, `augment_images()`, `augment_heatmaps()`, + `augment_segmentation_maps()`, `augment_keypoints()`, + `augment_bounding_boxes()`, `augment_polygons()` and + `augment_line_strings()` to return `None` inputs without change. + Previously they resulted in an exception. This is more consistent with + the behaviour in the other `augment_*` methods. + * Changed `augment_images()` to no longer be abstract. It defaults + to not changing the input images. + * Changed `imgaug.augmentables.BoundingBoxesOnImage.from_xyxy_array()` + to also accept `(N, 2, 2)` arrays instead of only `(N, 4)`. + +Deprecated: + * Deprecated `imgaug.augmenters.meta.Augmenter.augment_batch()`. + Use `.augment_batch_()` instead. + +Refactored: + * Refactored most augmenters to use single `_augment_batch_()` method. + +Other changes: + * Added validation of input arguments to `KeypointsOnImage.from_xy_array()`. + * Improved validation of input arguments to + `BoundingBoxesOnImage.from_xyxy_array()`. + + +## Reworked Quantization [#467](https://github.com/aleju/imgaug/pull/467) + +This patch reworked the quantization routines to also support quantization +to `N` bits instead of `N` colors in a way that is similar to posterization +in `PIL`. The patch added corresponding `UniformColorQuantizationToNBits` +and `Posterize` augmenters, as well as a `quantize_uniform_to_n_bits()` +function. + +* Added classes: + * `augmenters.color.UniformColorQuantizationToNBits`. + * `augmenters.color.Posterize` (alias of `UniformColorQuantizationToNBits`). + +* Added functions: + * `augmenters.color.quantize_uniform_()`, the in-place + version of `quantize_uniform()`. + * `augmenters.color.quantize_uniform_to_n_bits()`. + * `augmenters.color.quantize_uniform_to_n_bits_()`. + * `augmenters.color.posterize()`, an alias of + `quantize_uniform_to_n_bits()` that produces the same outputs as + `PIL.ImageOps.posterize()`. + +* Added parameters: + * Added `to_bin_centers=True` to `quantize_uniform()`, controling + whether each bin `(a, b)` should be quantized to `a + (b-a)/2` or `a`. + +* Deprecated: + * Renamed `imgaug.augmenters.color.quantize_colors_uniform(image, n_colors)` + to `imgaug.augmenters.color.quantize_uniform(arr, nb_bins)`. The old name + is now deprecated. + * Renamed `imgaug.augmenters.color.quantize_colors_kmeans(image, n_colors)` + to `imgaug.augmenters.color.quantize_kmeans(arr, nb_clusters)`. The old + name is now deprecated. + +* Other changes: + * Improved performance of `quantize_uniform()` by roughly 10x (small images + around 64x64) to 100x (large images around 1024x1024). This also affects + `UniformColorQuantization`. + * Improved performance of `UniformColorQuantization` by using more in-place + functions. + +* Fixed: + * Fixed `quantize_uniform()` producing wrong outputs for non-contiguous + arrays. + + +## Improved Invert [#469](https://github.com/aleju/imgaug/pull/469) + +Added thresholds to `Invert` and the corresponding functions. This enables +solarization (inversion with thresholds). The patch also added +a corresponding `Solarize` augmenter and two solarization functions. + +* Added augmenter `imgaug.augmenters.Solarize`, a wrapper around `Invert`. +* Added function `imgaug.augmenters.arithmetic.solarize()`, a wrapper around + `solarize_()`. +* Added function `imgaug.augmenters.arithmetic.solarize_()`, a wrapper around + `invert_()`. +* Added function `imgaug.augmenters.arithmetic.invert_()`, an in-place version + of `imgaug.augmenters.arithmetic.invert()`. +* Added parameters `threshold` and `invert_above_threshold` to + `imgaug.augmenters.arithmetic.invert()` +* Added parameters `threshold` and `invert_above_threshold` to + `imgaug.augmenters.arithmetic.Invert`. +* Improved performance of `imgaug.augmenters.arithmetic.invert()` and + `imgaug.augmenters.arithmetic.Invert` for `uint8` images. + + +## All Augmenters are now Pickle-able [#493](https://github.com/aleju/imgaug/pull/493) [#575](https://github.com/aleju/imgaug/pull/575) + +Ensured that all augmenters can be pickled and un-pickled without errors. + +* Added function `imgaug.testutils.runtest_pickleable_uint8_img()`. +* Fixed `imgaug.augmenters.blur.MotionBlur` not being pickle-able. +* Fixed `imgaug.augmenters.meta.AssertLambda` not being pickle-able. +* Fixed `imgaug.augmenters.meta.AssertShape` not being pickle-able. +* Fixed `imgaug.augmenters.color.MultiplyHueAndSaturation` not supporting + all standard RNG datatypes for `random_state`. + + +## Extended Cropping and Padding Augmenters [#459](https://github.com/aleju/imgaug/pull/459) + +This patch extended the cropping and padding augmenters. It added +augmenters that crop/pad towards multiples of values (e.g. crop the +width until it is a multiple of `2`), towards powers of values (e.g. +crop the width until it is one of `1, 2, 4, 8, 16, ...`), towards +an aspect ratio (crop the width or height until `width/height = 2.0`) or +towards a squared size (e.g. crop the width or height until they are equal). +These augmenters are wrappers around `CropToFixedSize` and +`PadToFixedSize`. All `*FixedSize` augmenters also have now corresponding +`Center*ToFixedSize` aliases, e.g. `CenterCropToPowersOf`. These +are equivalent to using `position="center"`, e.g. `CenterCropToPowersOf` +is equivalent to `CropToPowersOf(..., position="center")`. + +The following functions were moved. Their old names are now deprecated. +* Moved `imgaug.imgaug.pad` to `imgaug.augmenters.size.pad` +* Moved `imgaug.imgaug.pad_to_aspect_ratio` to + `imgaug.augmenters.size.pad_to_aspect_ratio`. +* Moved `imgaug.imgaug.pad_to_multiples_of` to + `imgaug.augmenters.size.pad_to_multiples_of`. +* Moved `imgaug.imgaug.compute_paddings_for_aspect_ratio` to + `imgaug.augmenters.size.compute_paddings_to_reach_aspect_ratio`. +* Moved `imgaug.imgaug.compute_paddings_to_reach_multiples_of` + to `imgaug.augmenters.size.compute_paddings_to_reach_multiples_of`. + + +The following augmenters were added: +* Added augmenter `CenterCropToFixedSize`. +* Added augmenter `CenterPadToFixedSize`. +* Added augmenter `CropToMultiplesOf`. +* Added augmenter `CenterCropToMultiplesOf`. +* Added augmenter `PadToMultiplesOf`. +* Added augmenter `CenterPadToMultiplesOf`. +* Added augmenter `CropToPowersOf`. +* Added augmenter `CenterCropToPowersOf`. +* Added augmenter `PadToPowersOf`. +* Added augmenter `CenterPadToPowersOf`. +* Added augmenter `CropToAspectRatio`. +* Added augmenter `CenterCropToAspectRatio`. +* Added augmenter `PadToAspectRatio`. +* Added augmenter `CenterPadToAspectRatio`. +* Added augmenter `PadToSquare`. +* Added augmenter `CenterPadToSquare`. +* Added augmenter `CropToSquare`. +* Added augmenter `CenterCropToSquare`. + +All `Center` augmenters are wrappers around `` with parameter +`position="center"`. + + +Added functions: +* Added function + `imgaug.augmenters.size.compute_croppings_to_reach_aspect_ratio()`. +* Added function + `imgaug.augmenters.size.compute_croppings_to_reach_multiples_of()`. +* Added function + `imgaug.augmenters.size.compute_croppings_to_reach_powers_of()`. +* Added function + `imgaug.augmenters.size.compute_paddings_to_reach_powers_of()`. + + +Other changes: +* Extended augmenter `CropToFixedSize` to support `height` and/or `width` + parameters to be `None`, in which case the respective axis is not changed. +* Extended augmenter `PadToFixedSize` to support `height` and/or `width` + parameters to be `None`, in which case the respective axis is not changed. +* [rarely breaking] Changed `CropToFixedSize.get_parameters()` to also + return the `height` and `width` values. +* [rarely breaking] Changed `PadToFixedSize.get_parameters()` to also + return the `height` and `width` values. +* [rarely breaking] Changed the order of parameters returned by + `PadToFixedSize.get_parameters()` to match the order in + `PadToFixedSize.__init__()` +* Changed `PadToFixedSize` to prefer padding the right side over the left side + and the bottom side over the top side. E.g. if using a center pad and + `3` columns have to be padded, it will pad `1` on the left and `2` on the + right. Previously it was the other way round. This was changed to establish + more consistency with the various other pad and crop methods. +* Changed the projection of pad/crop values between images and non-images + to make the behaviour slightly more accurate in fringe cases. +* Improved behaviour of function + `imgaug.augmenters.size.compute_paddings_for_aspect_ratio()` for zero-sized + axes. +* Changed function `imgaug.augmenters.size.compute_paddings_for_aspect_ratio()` + to also support shape tuples instead of only ndarrays. +* Changed function + `imgaug.augmenters.size.compute_paddings_to_reach_multiples_of()` + to also support shape tuples instead of only ndarrays. + + +Fixes: +* Fixed a formatting error in an error message of + `compute_paddings_to_reach_multiples_of()`. + + +## More Choices for Image Blending [#462](https://github.com/aleju/imgaug/pull/462) [#556](https://github.com/aleju/imgaug/pull/556) + +The available augmenters for alpha-blending of images were +significantly extended. There are now new blending +augmenters available to alpha-blend acoording to: +* Some randomly chosen colors. (`BlendAlphaSomeColors`) +* Linear gradients. (`BlendAlphaHorizontalLinearGradient`, + `BlendAlphaVerticalLinearGradient`) +* Regular grids and checkerboard patterns. (`BlendAlphaRegularGrid`, + `BlendAlphaCheckerboard`) +* Only at locations that overlap with specific segmentation class + IDs (or the inverse of that). (`BlendAlphaSegMapClassIds`) +* Only within bounding boxes with specific labels (or the inverse + of that). (`BlendAlphaBoundingBoxes`) + +This allows to e.g. randomly remove some colors while leaving +other colors unchanged (`BlendAlphaSomeColors(Grayscale(1.0))`), +to change the color of some objects +(`BlendAlphaSegMapClassIds(AddToHue((-256, 256)))`), to add +cloud-patterns only to the top of images +(`BlendAlphaVerticalLinearGradient(Clouds())`) or to apply +augmenters in some coarse rectangular areas (e.g. +`BlendAlphaRegularGrid(Multiply(0.0))` to achieve a similar +effect to `CoarseDropout` or +`BlendAlphaRegularGrid(AveragePooling(8))` to pool in equally +coarse image sub-regions). + +Other mask-based alpha blending techniques can be achieved by +subclassing `IBatchwiseMaskGenerator` and providing an +instance of such a class to `BlendAlphaMask`. + +This patch also changes the naming of the blending augmenters +as follows: +* `Alpha` -> `BlendAlpha` +* `AlphaElementwise` -> `BlendAlphaElementwise` +* `SimplexNoiseAlpha` -> `BlendAlphaSimplexNoise` +* `FrequencyNoiseAlpha` -> `BlendAlphaFrequencyNoise` +The old names are now deprecated. +Furthermore, the parameters `first` and `second`, which were +used by all blending augmenters, have now the names `foreground` +and `background`. + +List of changes: +* Added `imgaug.augmenters.blend.BlendAlphaMask`, which uses + a mask generator instance to generate per batch alpha masks and + then alpha-blends using these masks. +* Added `imgaug.augmenters.blend.BlendAlphaSomeColors`. +* Added `imgaug.augmenters.blend.BlendAlphaHorizontalLinearGradient`. +* Added `imgaug.augmenters.blend.BlendAlphaVerticalLinearGradient`. +* Added `imgaug.augmenters.blend.BlendAlphaRegularGrid`. +* Added `imgaug.augmenters.blend.BlendAlphaCheckerboard`. +* Added `imgaug.augmenters.blend.BlendAlphaSegMapClassIds`. +* Added `imgaug.augmenters.blend.BlendAlphaBoundingBoxes`. +* Added `imgaug.augmenters.blend.IBatchwiseMaskGenerator`, + an interface for classes generating masks on a batch-by-batch + basis. +* Added `imgaug.augmenters.blend.StochasticParameterMaskGen`, + a helper to generate masks from `StochasticParameter` instances. +* Added `imgaug.augmenters.blend.SomeColorsMaskGen`, a generator + that produces masks marking randomly chosen colors in images. +* Added `imgaug.augmenters.blend.HorizontalLinearGradientMaskGen`, + a linear gradient mask generator. +* Added `imgaug.augmenters.blend.VerticalLinearGradientMaskGen`, + a linear gradient mask generator. +* Added `imgaug.augmenters.blend.RegularGridMaskGen`, + a checkerboard-like mask generator where every grid cell has + a random alpha value. +* Added `imgaug.augmenters.blend.CheckerboardMaskGen`, + a checkerboard-like mask generator where every grid cell has + the opposite alpha value of its 4-neighbours. +* Added `imgaug.augmenters.blend.SegMapClassIdsMaskGen`, a + segmentation map-based mask generator. +* Added `imgaug.augmenters.blend.BoundingBoxesMaskGen`, a bounding + box-based mask generator. +* Added `imgaug.augmenters.blend.InvertMaskGen`, an mask generator + that inverts masks produces by child generators. +* Changed `imgaug.parameters.SimplexNoise` and + `imgaug.parameters.FrequencyNoise` to also accept `(H, W, C)` + sampling shapes, instead of only `(H, W)`. +* Refactored `AlphaElementwise` to be a wrapper around + `BlendAlphaMask`. +* Renamed `Alpha` to `BlendAlpha`. + `Alpha` is now deprecated. +* Renamed `AlphaElementwise` to `BlendAlphaElementwise`. + `AlphaElementwise` is now deprecated. +* Renamed `SimplexNoiseAlpha` to `BlendAlphaSimplexNoise`. + `SimplexNoiseAlpha` is now deprecated. +* Renamed `FrequencyNoiseAlpha` to `BlendAlphaFrequencyNoise`. + `FrequencyNoiseAlpha` is now deprecated. +* Renamed arguments `first` and `second` to `foreground` and `background` + in `BlendAlpha`, `BlendAlphaElementwise`, `BlendAlphaSimplexNoise` and + `BlendAlphaFrequencyNoise`. +* Changed `imgaug.parameters.handle_categorical_string_param()` to allow + parameter `valid_values` to be `None`. +* Fixed a wrong error message in + `imgaug.augmenters.color.change_colorspace_()`. + + + + +# Added + +## Unwrapped Bounding Box Augmentation [#446](https://github.com/aleju/imgaug/pull/446) + +The bounding box augmentation was previously a wrapper around keypoint +augmentation. Bounding Boxes were simply converted to keypoints at the +start of the augmentation and then augmented as keypoints by all called +augmenters. This was now changed so that all augmenters receive +bounding boxes and can then chose how to augment them. This enables +augmentations specific to bounding boxes. + +* Added property `coords` to `BoundingBox`. The property returns an `(N,2)` + numpy array containing the coordinates of the top-left and bottom-right + bounding box corners. +* Added method `BoundingBox.coords_almost_equals(other)`. +* Added method `BoundingBox.almost_equals(other)`. +* Changed method `Polygon.almost_equals(other)` to no longer verify the + datatype. It is assumed now that the input is a Polygon. +* Added property `items` to `KeypointsOnImage`, `BoundingBoxesOnImage`, + `PolygonsOnImage`, `LineStringsOnImage`. The property returns the + keypoints/BBs/polygons/LineStrings contained by that instance. +* Added method `Polygon.coords_almost_equals(other)`. Alias for + `Polygon.exterior_almost_equals(other)`. +* Added property `Polygon.coords`. Alias for `Polygon.exterior`. +* Added property `Keypoint.coords`. +* Added method `Keypoint.coords_almost_equals(other)`. +* Added method `Keypoint.almost_equals(other)`. +* Added method `imgaug.testutils.assert_cbaois_equal()`. +* Added method `imgaug.testutils.shift_cbaoi()`. +* Added internal `_augment_bounding_boxes()` methods to various augmenters. + This allows to individually control how bounding boxes are supposed to + be augmented. Previously, the bounding box augmentation was a wrapper around + keypoint augmentation that did not allow such control. +* **[breaking]** Added parameter `parents` to + `Augmenter.augment_bounding_boxes()`. + This breaks if `hooks` was used as a *positional* argument in connection with + that method. +* [rarely breaking] Added parameter `func_bounding_boxes` to `Lambda`. + This breaks if one relied on the order of the augmenter's parameters instead + of their names. +* [rarely breaking] Added parameter `func_bounding_boxes` to `AssertLambda`. + This breaks if one relied on the order of the augmenter's parameters instead + of their names. +* [rarely breaking] Added parameter `check_bounding_boxes` to `AssertShape`. + This breaks if one relied on the order of the augmenter's parameters instead + of their names. + + +## Unwrapped Line String Augmentation [#450](https://github.com/aleju/imgaug/pull/450) + +This patch is the same as the bounding box unwrapping above, only applied to +line strings. + +* Added internal `_augment_line_strings()` methods to various augmenters. + This allows to individually control how line strings are supposed to + be augmented. Previously, the line string augmentation was a wrapper around + keypoint augmentation that did not allow such control. +* [rarely breaking] Added parameter `func_line_strings` to `Lambda`. + This breaks if one relied on the order of the augmenter's parameters instead + of their names. +* [rarely breaking] Added parameter `func_line_strings` to `AssertLambda`. + This breaks if one relied on the order of the augmenter's parameters instead + of their names. +* [rarely breaking] Added parameter `check_line_strings` to `AssertShape`. + This breaks if one relied on the order of the augmenter's parameters instead + of their names. + + +## Added fit_output to PerspectiveTransform [#452](https://github.com/aleju/imgaug/pull/452) [#456](https://github.com/aleju/imgaug/pull/456) + +This patch added `fit_output` to `PerspectiveTransform`. + +* [rarely breaking] PerspectiveTransform has now a `fit_output` parameter, + similar to `Affine`. This change may break code that relied on the order of + arguments to `__init__`. +* The sampling code of `PerspectiveTransform` was reworked and should now + be faster. + + +# Added `ChangeColorTemperature` Augmenter [#454](https://github.com/aleju/imgaug/pull/454) + +This patch added an augmenter and corresponding function to change the +color temperature of images. This adds e.g. red, orange or blue tints. + +* Added augmenter `imgaug.augmenters.color.ChangeColorTemperature`. +* Added function `imgaug.augmenters.color.change_color_temperatures_()`. +* Added function `imgaug.augmenters.color.change_color_temperature_()`. + + +## Added Brightness Augmenters [#455](https://github.com/aleju/imgaug/pull/455) + +This patch added brightness-related augmenters. At the core is +`WithBrightnessChannels`, which converts images to a choice of +colorspaces that have brightness-related channels, extracts these +channels and applies child augmenters to them. E.g. it might +transform to `L*a*b*` colorspace and extract `L`, then apply +a child augmenter and convert the modified `L*a*b*` back to `RGB`. + +* Added augmenter `imgaug.augmenters.color.WithBrightnessChannels`. +* Added augmenter `imgaug.augmenters.color.MultiplyAndAddToBrightness`. +* Added augmenter `imgaug.augmenters.color.MultiplyBrightness`. +* Added augmenter `imgaug.augmenters.color.AddToBrightness`. +* Added method `imgaug.parameters.handle_categorical_string_param()`. +* Changed `change_colorspaces_()` to accept any iterable of `str` for + argument `to_colorspaces`, not just `list`. + + +## Added More Dropout Augmenters [#458](https://github.com/aleju/imgaug/pull/458) + +This patch added more dropout augmenters. `Dropout2d` randomly zeros +whole channels, while `TotalDropout` randomly zeros whole images. +The latter augmenter can sometimes be used in connection with +blending operations. (Note though that in these cases it should not be +used with coordinate-based input data, such as bounding boxes, because +it removes that data from examples affected by total dropout. That +breaks the blending operation, which requires the number of coordinates +to be unchanged.) + +* Added a new augmenter `Dropout2d`, which drops channels in images with + a defineable probability `p`. Dropped channels will be filled with zeros. + By default, the augmenter keeps at least one channel in each image + unaltered (i.e. not dropped). +* Added new augmenter `TotalDropout`, which sets all components to zero + for `p` percent of all images. The augmenter should be used in connection + with e.g. blend augmenters. + + +## Added `RemoveSaturation` [#462](https://github.com/aleju/imgaug/pull/462) + +* Added `RemoveSaturation`, a shortcut for `MultiplySaturation((0.0, 1.0))` + with outputs similar to `Grayscale((0.0, 1.0))`. + + +## Added `Cartoon` Augmenter [#463](https://github.com/aleju/imgaug/pull/463) + +This patch added a filter to change the style of images to one that looks +more cartoon-ish. The filter used classical methods. As such it works well +on some images and badly on others. It seems to work better on images +that already have rather saturated colors and pronounced edges. + +* Added module `imgaug.augmenters.artistic`. +* Added function `imgaug.augmenters.artistic.stylize_cartoon(image)`. +* Added augmenter `imgaug.augmenters.artistic.Cartoon`. + + +## Added `MeanShiftBlur` Augmenter [#466](https://github.com/aleju/imgaug/pull/466) + +This patch added a mean shift-based blur filter. Note that it is very +slow when using the default parameters (high radius). + +* Added function `imgaug.augmenters.blur.blur_mean_shift_(image)`. +* Added augmenter `imgaug.augmenters.blur.MeanShiftBlur`. + + +## Added `DeterministicList` Parameter [#475](https://github.com/aleju/imgaug/pull/475) + +Added `imgaug.parameters.DeterministicList`. Upon a request to generate +samples of shape `S`, this parameter will create a new array of shape `S` +and fill it by cycling over its list of values repeatedly. + + +## Added `Jigsaw` Augmenter [#476](https://github.com/aleju/imgaug/pull/476) [#577](https://github.com/aleju/imgaug/pull/577) + +This patch added a jigsaw puzzle augmenter and corresponding functions. +The augmenter splits each image into a regular grid of cells, then +randomly picks some cells and switches them with one of their +8-neighbours. The process is repeated for `N` steps per image. + +Note: The augmenter will reject batches containing bounding boxes, +polygons or line strings. + +* Added function `imgaug.augmenters.geometric.apply_jigsaw()`. +* Added function `imgaug.augmenters.geometric.apply_jigsaw_to_coords()`. +* Added function `imgaug.augmenters.geometric.generate_jigsaw_destinations()`. + + +## Added Wrappers around Package `PIL` [#479](https://github.com/aleju/imgaug/pull/479) [#480](https://github.com/aleju/imgaug/pull/480) [#538](https://github.com/aleju/imgaug/pull/538) + +This patch added wrapper functions and augmenters around popular +`PIL` functions. The outputs of these functions and augmenters are +tested to be identical with the ones in `PIL`. They are intended +for research cases where papers have to be re-implemented as +accurately as possible. + +* Added module `imgaug.augmenters.pillike`, which contains augmenters and + functions corresponding to commonly used PIL functions. Their outputs + are guaranteed to be identical to the PIL outputs. +* Added the following functions to the module: + * `imgaug.augmenters.pillike.equalize` + * `imgaug.augmenters.pillike.equalize_` + * `imgaug.augmenters.pillike.autocontrast` + * `imgaug.augmenters.pillike.autocontrast_` + * `imgaug.augmenters.pillike.solarize` + * `imgaug.augmenters.pillike.solarize_` + * `imgaug.augmenters.pillike.posterize` + * `imgaug.augmenters.pillike.posterize_` + * `imgaug.augmenters.pillike.enhance_color` + * `imgaug.augmenters.pillike.enhance_contrast` + * `imgaug.augmenters.pillike.enhance_brightness` + * `imgaug.augmenters.pillike.enhance_sharpness` + * `imgaug.augmenters.pillike.filter_blur` + * `imgaug.augmenters.pillike.filter_smooth` + * `imgaug.augmenters.pillike.filter_smooth_more` + * `imgaug.augmenters.pillike.filter_edge_enhance` + * `imgaug.augmenters.pillike.filter_edge_enhance_more` + * `imgaug.augmenters.pillike.filter_find_edges` + * `imgaug.augmenters.pillike.filter_contour` + * `imgaug.augmenters.pillike.filter_emboss` + * `imgaug.augmenters.pillike.filter_sharpen` + * `imgaug.augmenters.pillike.filter_detail` + * `imgaug.augmenters.pillike.warp_affine` +* Added the following augmenters to the module: + * `imgaug.augmenters.pillike.Solarize` + * `imgaug.augmenters.pillike.Posterize`. + (Currently alias for `imgaug.augmenters.color.Posterize`.) + * `imgaug.augmenters.pillike.Equalize` + * `imgaug.augmenters.pillike.Autocontrast` + * `imgaug.augmenters.pillike.EnhanceColor` + * `imgaug.augmenters.pillike.EnhanceContrast` + * `imgaug.augmenters.pillike.EnhanceBrightness` + * `imgaug.augmenters.pillike.EnhanceSharpness` + * `imgaug.augmenters.pillike.FilterBlur` + * `imgaug.augmenters.pillike.FilterSmooth` + * `imgaug.augmenters.pillike.FilterSmoothMore` + * `imgaug.augmenters.pillike.FilterEdgeEnhance` + * `imgaug.augmenters.pillike.FilterEdgeEnhanceMore` + * `imgaug.augmenters.pillike.FilterFindEdges` + * `imgaug.augmenters.pillike.FilterContour` + * `imgaug.augmenters.pillike.FilterEmboss` + * `imgaug.augmenters.pillike.FilterSharpen` + * `imgaug.augmenters.pillike.FilterDetail` + * `imgaug.augmenters.pillike.Affine` + + +## Added `Identity` [#481](https://github.com/aleju/imgaug/pull/481) + +This patch added an identity function augmenter (`Identity`), which is +the same as `Noop` and will replace the latter one in the long run. + +* [rarely breaking] Added `imgaug.augmenters.meta.Identity`, an alias of + `Noop`. `Identity` is now the recommended augmenter for identity + transformations. This change can break code that explicitly relied on + exactly `Noop` being used, e.g. via `isinstance` checks. +* Renamed parameter `noop_if_topmost` to `identity_if_topmost` in + method `imgaug.augmenters.meta.Augmenter.remove_augmenters()`. The old name + is now deprecated. + + +## Added Shearing on the Y-Axis to `Affine` [#482](https://github.com/aleju/imgaug/pull/482) + +`Affine` was changed to now also support shearing on the y-axis. +Previously, only the x-axis was supported. Use e.g. +`Affine(shear={"y": (-20, 20))` now. + +* [rarely breaking] Extended `Affine` to also support shearing on the + y-axis (previously, only x-axis was possible). This feature can be used + via e.g. ``Affine(shear={"x": (-30, 30), "y": (-10, 10)})``. If instead + a single number is used (e.g. ``Affine(shear=15)``), shearing will be done + only on the x-axis. If a single ``tuple``, ``list`` or + ``StochasticParameter`` is used, the generated samples will be used + identically for both the x-axis and y-axis (this is consistent with + translation and scaling). To get independent random samples per axis use + the dictionary form. + + +## Added Wrappers around `Affine` [#484](https://github.com/aleju/imgaug/pull/484) + +This patch added a few convenience wrappers around `Affine`. + +* Added `imgaug.augmenters.geometric.ScaleX`. +* Added `imgaug.augmenters.geometric.ScaleY`. +* Added `imgaug.augmenters.geometric.TranslateX`. +* Added `imgaug.augmenters.geometric.TranslateY`. +* Added `imgaug.augmenters.geometric.Rotate`. +* Added `imgaug.augmenters.geometric.ShearX`. +* Added `imgaug.augmenters.geometric.ShearY`. + + +## Added More Methods to Remove Out-of-Image Augmentables [#487](https://github.com/aleju/imgaug/pull/487) + +This patch extended the methods to handle coordinate-based augmentables, +e.g. bounding boxes, that are partially/fully outside of the image plane. +They can now more easily be dropped if more than `p%` of their areas is +outside of the image plane. + +The patch also adds augmenters to remove and clip coordinate-based +augmentables that are outside of the image plane. + +* Added `Keypoint.is_out_of_image()`. + +* Added `BoundingBox.compute_out_of_image_area()`. +* Added `Polygon.compute_out_of_image_area()`. + +* Added `Keypoint.compute_out_of_image_fraction()` +* Added `BoundingBox.compute_out_of_image_fraction()`. +* Added `Polygon.compute_out_of_image_fraction()`. +* Added `LineString.compute_out_of_image_fraction()`. + +* Added `KeypointsOnImage.remove_out_of_image_fraction()`. +* Added `BoundingBoxesOnImage.remove_out_of_image_fraction()`. +* Added `PolygonsOnImage.remove_out_of_image_fraction()`. +* Added `LineStringsOnImage.remove_out_of_image_fraction()`. + +* Added `KeypointsOnImage.clip_out_of_image()`. + +* Added `imgaug.augmenters.meta.RemoveCBAsByOutOfImageFraction`. + Removes coordinate-based augmentables (e.g. BBs) that have at least a + specified fraction of their area outside of the image plane. +* Added `imgaug.augmenters.meta.ClipCBAsToImagePlanes`. + Clips off all parts from coordinate-based augmentables (e.g. BBs) that are + outside of the corresponding image. + +* Changed `Polygon.area` to return `0.0` if the polygon contains less than + three points (previously: exception). + + +## Added Bounding Box to Polygon Conversion [#489](https://github.com/aleju/imgaug/pull/489) + +* Added method `imgaug.augmentables.bbs.BoundingBox.to_polygon()`. +* Added method + `imgaug.augmentables.bbs.BoundingBoxesOnImage.to_polygons_on_image()`. + + +## Added Polygon Subdivision [#489](https://github.com/aleju/imgaug/pull/489) + +* Added method `imgaug.augmentables.polys.Polygon.subdivide(N)`. + The method increases the polygon's corner point count by interpolating + `N` points on each edge with regular distance. +* Added method `imgaug.augmentables.polys.PolygonsOnImage.subdivide(N)`. + + +## Added `WithPolarWarping` Augmenter [#489](https://github.com/aleju/imgaug/pull/489) + +This patch added an augmenter to transform images to polar coordinates +and apply child augmenters within that space. This leads to interesting +effects in combination with augmenters that affect pixel locations, such +as cropping or affine transformations. + +* Added augmenter `imgaug.augmenters.geometric.WithPolarWarping`, an + augmenter that applies child augmenters in a polar representation of the + image. + + +## Added Convenient Access Methods to Coordinate-Based Augmentables [#495](https://github.com/aleju/imgaug/pull/495) [#541](https://github.com/aleju/imgaug/pull/541) + +This patch added various magic functions to coordinate-based +augmentables that make their usage more convenient. Example: +```python +import imgaug as ia +bb1 = ia.BoundingBox(x1=0, y1=1, x2=2, y2=3) +bb2 = ia.BoundingBox(x1=1, y1=2, x2=3, y2=4) +bbsoi = ia.BoundingBoxesOnImage([bb1, bb2]) + +print(bbsoi[0]) # prints now str(bb1) +print(len(bbsoi)) # prints now 2 +for bb in bbsoi: # looping is now supported + print(bb) +``` + +* Added module `imgaug.augmentables.base`. +* Added interface `imgaug.augmentables.base.IAugmentable`, implemented by + `HeatmapsOnImage`, `SegmentationMapsOnImage`, `KeypointsOnImage`, + `BoundingBoxesOnImage`, `PolygonsOnImage` and `LineStringsOnImage`. +* Added ability to iterate over coordinate-based `*OnImage` instances + (keypoints, bounding boxes, polygons, line strings), e.g. + `bbsoi = BoundingBoxesOnImage(bbs, shape=...); for bb in bbsoi: ...`. + would iterate now over `bbs`. +* Added implementations of `__len__` methods to coordinate-based `*OnImage` + instances, e.g. + `bbsoi = BoundingBoxesOnImage(bbs, shape=...); print(len(bbsoi))` + would now print the number of bounding boxes in `bbsoi`. +* Added ability to iterate over coordinates of `BoundingBox` (top-left, + bottom-right), `Polygon` and `LineString` via `for xy in obj: ...`. +* Added ability to access coordinates of `BoundingBox`, `Polygon` and + `LineString` using indices or slices, e.g. `line_string[1:]` to get an + array of all coordinates except the first one. +* Added property `Keypoint.xy`. +* Added property `Keypoint.xy_int`. + + +## Added `SaveDebugImageEveryNBatches` Augmenter [#502](https://github.com/aleju/imgaug/pull/502) + +This patch added a debug augmenter `SaveDebugImageEveryNBatches` that +visualizes a whole batch and saves the corresponding image to a directory. +The visualization happens at every `Nth` batch. The plot contains +a visualization of all images within the batch, as well as all additional +input data (e.g. segmentation maps or bounding boxes overlayed with +images). The plot also contains various additional information, such as +observed value ranges (min/max values) of images, observed labels of +bounding boxes or observed segmentation classes. + +The augmenter can be used during training to evaluate the strength of +augmentations, whether all data is still aligned (e.g. bounding box +positions match object positions) and whether the data statistics match +the expectations (e.g. no segmentation map classes missing). + +The augmenter might be useful even if no augmentation is actually performed. + +* Added module `imgaug.augmenters.debug`. +* Added function `imgaug.augmenters.debug.draw_debug_image()`. The function + draws an image containing debugging information for a provided set of + images and non-image data (e.g. segmentation maps, bounding boxes) + corresponding to a single batch. The debug image visualizes these + informations (e.g. bounding boxes drawn on images) and offers relevant + information (e.g. actual value ranges of images, labels of bounding + boxes and their counts, etc.). +* Added augmenter `imgaug.augmenters.debug.SaveDebugImageEveryNBatches`. + Augmenter corresponding to `draw_debug_image()`. Saves an image at every + n-th batch into a provided folder. + + +## Added Multi-Channel cvals in `pad()` [#502](https://github.com/aleju/imgaug/pull/502) + +Improved `imgaug.augmenters.size.pad()` to support multi-channel values +for the `cval` parameter (e.g. RGB colors). + + +## Added Wrappers around Package `imagecorruptions` [#530](https://github.com/aleju/imgaug/pull/530) + +Added wrappers around the functions from package +[bethgelab/imagecorruptions](https://github.com/bethgelab/imagecorruptions). +The functions in that package were used in some recent papers and are added +here for convenience. +The wrappers produce arrays containing values identical to the output +arrays from the corresponding `imagecorruptions` functions when called +via the `imagecorruptions.corrupt()` (verified via unittests). +The interfaces of the wrapper functions are identical to the +`imagecorruptions` functions, with the only difference of also supporting +`seed` parameters. + +* Added module `imgaug.augmenters.imgcorruptlike`. The `like` signals that + the augmentation functions do not *have* to wrap `imagecorruptions` + internally. They merely have to produce the same outputs. +* Added the following functions to module `imgaug.augmenters.imgcorruptlike`: + * `apply_gaussian_noise()` + * `apply_shot_noise()` + * `apply_impulse_noise()` + * `apply_speckle_noise()` + * `apply_gaussian_blur()` + * `apply_glass_blur()` (improved performance over original function) + * `apply_defocus_blur()` + * `apply_motion_blur()` + * `apply_zoom_blur()` + * `apply_fog()` + * `apply_snow()` + * `apply_spatter()` + * `apply_contrast()` + * `apply_brightness()` + * `apply_saturate()` + * `apply_jpeg_compression()` + * `apply_pixelate()` + * `apply_elastic_transform()` +* Added function + `imgaug.augmenters.imgcorruptlike.get_corruption_names(subset)`. + Similar to `imagecorruptions.get_corruption_names(subset)`, but returns a + tuple + `(list of corruption method names, list of corruption method functions)`, + instead of only the names. +* Added the following augmenters to module `imgaug.augmenters.imgcorruptlike`: + * `GaussianNoise` + * `ShotNoise` + * `ImpulseNoise` + * `SpeckleNoise` + * `GaussianBlur` + * `GlassBlur` + * `DefocusBlur` + * `MotionBlur` + * `ZoomBlur` + * `Fog` + * `Frost` + * `Snow` + * `Spatter` + * `Contrast` + * `Brightness` + * `Saturate` + * `JpegCompression` + * `Pixelate` + * `ElasticTransform` +* Added context `imgaug.random.temporary_numpy_seed()`. + + +## Added `Cutout` Augmenter [#531](https://github.com/aleju/imgaug/pull/531) [#570](https://github.com/aleju/imgaug/pull/570) + +This patch added Cutout augmentation, similar to the paper proposal. +The augmetner has some similarity with `CoarseDropout`. + +* Added `imgaug.augmenters.arithmetic.apply_cutout_()`, which replaces + in-place a single rectangular area with a constant intensity value or a + constant color or gaussian noise. + See also the [paper](https://arxiv.org/abs/1708.04552) about Cutout. +* Added `imgaug.augmenters.arithmetic.apply_cutout()`. Same as + `apply_cutout_()`, but copies the input images before applying cutout. +* Added `imgaug.augmenters.arithmetic.Cutout`. + + +## Added in-place Methods for Coordinate-based Augmentables [#532](https://github.com/aleju/imgaug/pull/532) + +This patch added for many already existing methods corresponding in-place +variations. They are now used throughout the library, improving the +performance of augmentation in the case of e.g. bounding boxes. + +* Added `Keypoint.project_()`. +* Added `Keypoint.shift_()`. +* Added `KeypointsOnImage.on_()`. +* Added setter for `KeypontsOnImage.items`. +* Added setter for `BoundingBoxesOnImage.items`. +* Added setter for `LineStringsOnImage.items`. +* Added setter for `PolygonsOnImage.items`. +* Added `KeypointsOnImage.remove_out_of_image_fraction_()`. +* Added `KeypointsOnImage.clip_out_of_image_fraction_()`. +* Added `KeypointsOnImage.shift_()`. +* Added `BoundingBox.project_()`. +* Added `BoundingBox.extend_()`. +* Added `BoundingBox.clip_out_of_image_()`. +* Added `BoundingBox.shift_()`. +* Added `BoundingBoxesOnImage.on_()`. +* Added `BoundingBoxesOnImage.clip_out_of_image_()`. +* Added `BoundingBoxesOnImage.remove_out_of_image_()`. +* Added `BoundingBoxesOnImage.remove_out_of_image_fraction_()`. +* Added `BoundingBoxesOnImage.shift_()`. +* Added `imgaug.augmentables.utils.project_coords_()`. +* Added `LineString.project_()`. +* Added `LineString.shift_()`. +* Added `LineStringsOnImage.on_()`. +* Added `LineStringsOnImage.remove_out_of_image_()`. +* Added `LineStringsOnImage.remove_out_of_image_fraction_()`. +* Added `LineStringsOnImage.clip_out_of_image_()`. +* Added `LineStringsOnImage.shift_()`. +* Added `Polygon.project_()`. +* Added `Polygon.shift_()`. +* Added `Polygon.on_()`. +* Added `Polygon.subdivide_()`. +* Added `PolygonsOnImage.remove_out_of_image_()`. +* Added `PolygonsOnImage.remove_out_of_image_fraction_()`. +* Added `PolygonsOnImage.clip_out_of_image_()`. +* Added `PolygonsOnImage.shift_()`. +* Added `PolygonsOnImage.subdivide_()`. +* Switched `BoundingBoxesOnImage.copy()` to a custom copy operation (away + from module `copy` module). +* Added parameters `bounding_boxes` and `shape` to + BoundingBoxesOnImage.copy()`. +* Added parameters `bounding_boxes` and `shape` to + BoundingBoxesOnImage.deepcopy()`. +* Switched `KeypointsOnImage.copy()` to a custom copy operation (away + from module `copy` module). +* Switched `PolygonsOnImage.copy()` to a custom copy operation (away + from module `copy` module). +* Added parameters `polygons` and `shape` to + PolygonsOnImage.copy()`. +* Added parameters `polygons` and `shape` to + PolygonsOnImage.deepcopy()`. +* Switched augmenters to use in-place functions for keypoints, + bounding boxes, line strings and polygons. + + +## Added Standardized LUT Methods [#542](https://github.com/aleju/imgaug/pull/542) + +This patch standardized the handling of lookup tables throughout the library. + +* Added `imgaug.imgaug.apply_lut()`, which applies a lookup table to an image. +* Added `imgaug.imgaug.apply_lut_()`. In-place version of `apply_lut()`. +* Refactored all augmenters to use these new LUT functions. + This likely fixed some so-far undiscovered bugs in augmenters using LUT + tables. + + +## Added Drawing of Bounding Box Labels [#545](https://github.com/aleju/imgaug/pull/545) + +When drawing bounding boxes on images via `BoundingBox.draw_on_image()` +or `BoundingBoxesOnImage.draw_on_image()`, a box containing the label will now +be drawn over each bounding box's rectangle. If the bounding box's label is +set to `None`, the label box will not be drawn. For more detailed control, +use `BoundingBox.draw_label_on_image()`. + +* Added method `imgaug.augmentables.BoundingBox.draw_label_on_image()`. +* Added method `imgaug.augmentables.BoundingBox.draw_box_on_image()`. +* Changed method `imgaug.augmentables.BoundingBox.draw_on_image()` + to automatically draw a bounding box's label. + + +## Added Index-based Access to Coordinate-based `*OnImage` Instances [#547](https://github.com/aleju/imgaug/pull/547) + +Enabled index-based access to coordinate-based `*OnImage` instances, i.e. to +`KeypointsOnImage`, `BoundingBoxesOnImage`, `LineStringsOnImage` and +`PolygonsOnImage`. This allows to do things like +`bbsoi = BoundingBoxesOnImage(...); bbs = bbsoi[0:2];`. + +* Added `imgaug.augmentables.kps.KeypointsOnImage.__getitem__()`. +* Added `imgaug.augmentables.bbs.BoundingBoxesOnImage.__getitem__()`. +* Added `imgaug.augmentables.lines.LineStringsOnImage.__getitem__()`. +* Added `imgaug.augmentables.polys.PolygonsOnImage.__getitem__()`. + + +## Added `Rain` and `RainLayer` Augmenters [#551](https://github.com/aleju/imgaug/pull/551) + +Added augmenter(s) to create fake rain effects. They currently seem to work +best at around medium-sized images (~224px). + +* Added `imgaug.augmenters.weather.Rain`. +* Added `imgaug.augmenters.weather.RainLayer`. + + +## Added `round` Parameter to `Discretize` [#553](https://github.com/aleju/imgaug/pull/553) + +Added the parameter `round` to `imgaug.parameters.Discretize`. The parameter +defaults to `True`, i.e. the default behaviour of `Discretize` did not change. + + +## Added `RandAugment` Augmenter [#553](https://github.com/aleju/imgaug/pull/553) + +Added a RandAugment augmenter, similar to the one described in the paper +"RandAugment: Practical automated data augmentation with a reduced +search space". + +Note: This implementation makes a best guess about some hyperparameters +that were neither in the paper nor in the code repsitory clearly +defined. + +Note: This augmenter differs from the paper implementation by applying +a fix to their color augmentations. The ones in the paper's implementation +seemed to increase in strength as the magnitude was decreased below +a threshold. + +Note: This augmenter currently only accepts image inputs. Other input +types (e.g. bounding boxes) will be rejected. + +* Added module `imgaug.augmenters.collections` +* Added augmenter `imgaug.augmenters.collections.RandAugment`. + + +## Added and Improved Warnings for Probably-Wrong Image Inputs [#594](https://github.com/aleju/imgaug/pull/594) + +Improved the errors and warnings on image augmentation calls. +`augment_image()` will now produce a more self-explanatory error +message when calling it as in `augment_image(list of images)`. +Calls of single-image augmentation functions (e.g. +`augment(image=...)`) with inputs that look like multiple images +will now produce warnings. This is the case for `(H, W, C)` +inputs when `C>=32` (as that indicates that `(N, H, W)` was +actually provided). +Calls of multi-image augmentation functions (e.g. +`augment(images=...)`) with inputs that look like single images +will now produce warnings. This is the case for `(N, H, W)` +inputs when `W=1` or `W=3` (as that indicates that `(H, W, C)` +was actually provided.) + +* Added an assert in `augment_image()` to verify that inputs are + arrays. +* Added warnings for probably-wrong image inputs in + `augment_image()`, `augment_images()`, `augment()` (and its + alias `__call__()`). +* Added module `imgaug.augmenters.base`. +* Added warning + `imgaug.augmenters.base.SuspiciousMultiImageShapeWarning`. +* Added warning + `imgaug.augmenters.base.SuspiciousSingleImageShapeWarning`. +* Added `imgaug.testutils.assertWarns`, similar to `unittest`'s + `assertWarns`, but available in python <3.2. + + + + +# Changed + +## Improved RNG Handling during Polygon Augmentation [#447](https://github.com/aleju/imgaug/pull/447) + +Changed `Augmenter.augment_polygons()` to copy the augmenter's RNG +before starting concave polygon recovery. This is done for cleanliness and +should not have any effects for users. +Also removed RNG copies in `_ConcavePolygonRecoverer` to improve performance. + + +## Pooling Augmenters now Affect Maps [#457](https://github.com/aleju/imgaug/pull/457) + +Pooling augmenters were previously implemented so that they did not pool +the arrays of maps (i.e. heatmap arrays, segmentation map arrays). Only +the image shape saved within `HeatmapsOnImage.shape` and +`SegmentationMapsOnImage.shape` were updated. That was done because the library +can handle map arrays that are larger than the corresponding images and hence +no pooling was necessary for the augmentation to work correctly. This was now +changed and pooling augmenters will also pool map arrays +(if `keep_size=False`). The motiviation for this change is that the old +behaviour was unintuitive and inconsistent with other augmenters (e.g. `Crop`). + + +## Affine Translation Precision [#489](https://github.com/aleju/imgaug/pull/489) + +Removed a rounding operation in `Affine` translation that would unnecessarily +round floats to integers. This should make coordinate augmentation overall +more accurate. + + +## `Affine.get_parameters()` and `translate_px`/`translate_percent` [#508](https://github.com/aleju/imgaug/pull/508) + +Changed `Affine.get_parameters()` to always return a tuple `(x, y, mode)` +for translation, where `mode` is either `px` or `percent`, +and `x` and `y` are stochastic parameters. `y` may be `None` if the same +parameter (and hence samples) are used for both axes. + + +## Removed Outdated "Don't Import from this Module" Messages [#539](https://github.com/aleju/imgaug/pull/539) + +The docstring of each module in ``imgaug.augmenters`` previously included a +suggestion to not directly import from that module, but instead use +``imgaug.augmenters.``. That was due to the categorization +still being unstable. As the categorization has now been fairly stable +for a long time, the suggestion was removed from all modules. Calling +``imgaug.augmenters.`` instead of +``imgaug.augmenters..`` is however still the +preferred way. + + +## Standardized `shift()` Interfaces of Coordinate-Based Augmentables [#548](https://github.com/aleju/imgaug/pull/548) + +The interfaces for shift operations of all coordinate-based +augmentables (Keypoints, BoundingBoxes, LineStrings, Polygons) +were standardized. All of these augmentables have now the same +interface for shift operations. Previously, Keypoints used +a different interface (using `x` and `y` arguments) than the +other augmentables (using `top`, `right`, `bottom`, `left` +arguments). All augmentables use now the interface of Keypoints +as that is simpler and less ambiguous. Old arguments are still +accepted, but will produce deprecation warnings. Change the +arguments to `x` and `y` following `x=left-right` and +`y=top-bottom`. + +**[breaking]** This breaks if one relied on calling `shift()` functions of +`BoundingBox`, `LineString`, `Polygon`, `BoundingBoxesOnImage`, +`LineStringsOnImage` or `PolygonsOnImage` without named arguments. +E.g. `bb = BoundingBox(...); bb_shifted = bb.shift(1, 2, 3, 4);` +will produce unexpected outputs now (equivalent to +`shift(x=1, y=2, top=3, right=4, bottom=0, left=0)`), +while `bb_shifted = bb.shift(top=1, right=2, bottom=3, left=4)` will still +work as expected. + +* Added arguments `x`, `y` to `BoundingBox.shift()`, `LineString.shift()` + and `Polygon.shift()`. +* Added arguments `x`, `y` to `BoundingBoxesOnImage.shift()`, + `LineStringsOnImage.shift()` and `PolygonsOnImage.shift()`. +* Marked arguments `top`, `right`, `bottom`, `left` in + `BoundingBox.shift()`, `LineString.shift()` and `Polygon.shift()` + as deprecated. This also affects the corresponding `*OnImage` + classes. +* Added function `testutils.wrap_shift_deprecation()`. + + +## Simplified Standard Parameters of Augmenters [#567](https://github.com/aleju/imgaug/pull/567) [#595](https://github.com/aleju/imgaug/pull/595) + +The patch changed the standard parameters shared by all augmenters to a +reduced and more self-explanatory set. Previously, all augmenters +shared the parameters `name`, `random_state` and `deterministic`. +The new parameters are `seed` and `name`. + +`deterministic` was removed as it was hardly ever used and because +it caused frequently confusion with regards to its meaning. The +parameter is still accepted but will now produce a deprecation +warning. Use `.to_deterministic()` instead. + +Reminder: `to_deterministic()` is necessary if you want to get +the same samples in *consecutive* augmentation calls. It is *not* +necessary if you want your generated samples to be dependent on +an initial seed or random state as that is *always* the case +anyways. To use non-random initial seeds, use either +the `seed` parameter (augmenter-specific seeding) or +`imgaug.random.seed()` (global seeding, affects only augmenters +for which the `seed` parameter was not explicitly provided). + +`random_state` was renamed to `seed` as providing a seed value +is the more common use case compared to providing a random state. +Many users also seemed to be unaware that `random_state` accepted +seed values. The new name should make this more clear. +The old parameter `random_state` is still accepted, but will +likely be deprecated in the future. + +**[breaking]** This patch breaks if one relied on the order of +`name`, `random_state` and `deterministic`. The new order is now +`seed=..., name=..., random_state=..., deterministic=...` (with the +latter two parameters being outdated or deprecated) +as opposed to previously +`name=..., deterministic=..., random_state=...`. + + +## Improved Default Values of Augmenters [#582](https://github.com/aleju/imgaug/pull/582) + +**[breaking]** Most augmenters had previously default values that +made them equivalent to identity functions. Users had to explicitly +change the defaults to proper values in order to "activate" +augmentations. To simplify the usage of the library, the default +values of most augmenters were changed to medium-strength +augmentations. E.g. +`Sequential([Affine(), UniformVoronoi(), CoarseDropout()])` +should now produce decent augmentations. + +A few augmenters were set to always-on, maximum-strength +augmentations. This is the case for: + +* `Grayscale` (always fully grayscales images, use + `Grayscale((0.0, 1.0))` for random strengths) +* `RemoveSaturation` (same as `Grayscale`) +* `Fliplr` (always flips images, use `Fliplr(0.5)` for 50% + probability) +* `Flipud` (same as `Fliplr`) +* `TotalDropout` (always drops everything, use + `TotalDropout(0.1)` to drop everything for 10% of all images) +* `Invert` (always inverts images, use `Invert(0.1)` to invert + 10% of all images) +* `Rot90` (always rotates exactly once clockwise by 90 degrees, + use `Rot90((0, 3))` for any rotation) + +These settings seemed to better match user-expectations. +Such maximum-strength settings however were not chosen for all +augmenters where one might expect them. The defaults are set to +varying strengths for, e.g. `Superpixels` (replaces only some +superpixels with cellwise average colors), `UniformVoronoi` (also +only replaces some cells), `Sharpen` (alpha-blends with variable +strength, the same is the case for `Emboss`, `EdgeDetect` and +`DirectedEdgeDetect`) and `CLAHE` (variable clip limits). + +*Note*: Some of the new default values will cause issues with +non-`uint8` inputs. + +*Note*: The defaults for `per_channel` and `keep_size` were not +adjusted. It is currently still the default behaviour of all +augmenters to affect all channels in the same way and to resize +their outputs back to the input sizes. + +The exact changes to default values are listed below. + +**imgaug.arithmetic** + + * `Add` + * `value`: `0` -> `(-20, 20)` + * `AddElementwise` + * `value`: `0` -> `(-20, 20)` + * `AdditiveGaussianNoise` + * `scale`: `0` -> `(0, 15)` + * `AdditiveLaplaceNoise` + * `scale`: `0` -> `(0, 15)` + * `AdditivePoissonNoise` + * `scale`: `0` -> `(0, 15)` + * `Multiply` + * `mul`: `1.0` -> `(0.8, 1.2)` + * `MultiplyElementwise`: + * `mul`: `1.0` -> `(0.8, 1.2)` + * `Dropout`: + * `p`: `0.0` -> `(0.0, 0.05)` + * `CoarseDropout`: + * `p`: `0.0` -> `(0.02, 0.1)` + * `size_px`: `None` -> `(3, 8)` + * `min_size`: `4` -> `3` + * Default for `size_px` is only used if neither `size_percent` + nor `size_px` is provided by the user. + * `CoarseSaltAndPepper`: + * `p`: `0.0` -> `(0.02, 0.1)` + * `size_px`: `None` -> `(3, 8)` + * `min_size`: `4` -> `3` + * Default for `size_px` is only used if neither `size_percent` + nor `size_px` is provided by the user. + * `CoarseSalt`: + * `p`: `0.0` -> `(0.02, 0.1)` + * `size_px`: `None` -> `(3, 8)` + * `min_size`: `4` -> `3` + * Default for `size_px` is only used if neither `size_percent` + nor `size_px` is provided by the user. + * `CoarsePepper`: + * `p`: `0.0` -> `(0.02, 0.1)` + * `size_px`: `None` -> `(3, 8)` + * `min_size`: `4` -> `3` + * Default for `size_px` is only used if neither `size_percent` + nor `size_px` is provided by the user. + * `SaltAndPepper`: + * `p`: `0.0` -> `(0.0, 0.03)` + * `Salt`: + * `p`: `0.0` -> `(0.0, 0.03)` + * `Pepper`: + * `p`: `0.0` -> `(0.0, 0.05)` + * `ImpulseNoise`: + * `p`: `0.0` -> `(0.0, 0.03)` + * `Invert`: + * `p`: `0` -> `1` + * `JpegCompression`: + * `compression`: `50` -> `(0, 100)` + +**imgaug.blend** + + * `BlendAlpha` + * `factor`: `0` -> `(0.0, 1.0)` + * `BlendAlphaElementwise` + * `factor`: `0` -> `(0.0, 1.0)` + +**imgaug.blur** + + * `GaussianBlur`: + * `sigma`: `0` -> `(0.0, 3.0)` + * `AverageBlur`: + * `k`: `1` -> `(1, 7)` + * `MedianBlur`: + * `k`: `1` -> `(1, 7)` + * `BilateralBlur`: + * `d`: `1` -> `(1, 9)` + * `MotionBlur`: + * `k`: `5` -> `(3, 7)` + +**imgaug.color** + + * `MultiplyHueAndSaturation`: + * `mul_hue`: `None` -> `(0.5, 1.5)` + * `mul_saturation`: `None` -> `(0.0, 1.7)` + * These defaults are only used if the user provided neither + `mul` nor `mul_hue` nor `mul_saturation`. + * `MultiplyHue`: + * `mul`: `(-1.0, 1.0)` -> `(-3.0, 3.0)` + * `AddToHueAndSaturation`: + * `value_hue`: `None` -> `(-40, 40)` + * `value_saturation`: `None` -> `(-40, 40)` + * These defaults are only used if the user provided neither + `value` nor `value_hue` nor `value_saturation`. + * `Grayscale`: + * `alpha`: `0` -> `1` + +**imgaug.contrast** + + * `GammaContrast`: + * `gamma`: `1` -> `(0.7, 1.7)` + * `SigmoidContrast`: + * `gain`: `10` -> `(5, 6)` + * `cutoff`: `0.5` -> `(0.3, 0.6)` + * `LogContrast`: + * `gain`: `1` -> `(0.4, 1.6)` + * `LinearContrast`: + * `alpha`: `1` -> `(0.6, 1.4)` + * `AllChannelsCLAHE`: + * `clip_limit`: `40` -> `(0.1, 8)` + * `tile_grid_size_px`: `8` -> `(3, 12)` + * `CLAHE`: + * `clip_limit`: `40` -> `(0.1, 8)` + * `tile_grid_size_px`: `8` -> `(3, 12)` + +**convolutional** + + * `Sharpen`: + * `alpha`: `0` -> `(0.0, 0.2)` + * `lightness`: `1` -> `(0.8, 1.2)` + * `Emboss`: + * `alpha`: `0` -> `(0.0, 1.0)` + * `strength`: `1` -> `(0.25, 1.0)` + * `EdgeDetect`: + * `alpha`: `0` -> `(0.0, 0.75)` + * `DirectedEdgeDetect`: + * `alpha`: `0` -> `(0.0, 0.75)` + +**imgaug.flip** + + * `Fliplr`: + * `p`: `0` -> `1` + * `Flipud`: + * `p`: `0` -> `1` + +**imgaug.geometric** + + * `Affine`: + * `scale`: `1` -> `{"x": (0.9, 1.1), "y": (0.9, 1.1)}` + * `translate_percent`: None -> `{"x": (-0.1, 0.1), "y": (-0.1, 0.1)}` + * `rotate`: `0` -> `(-15, 15)` + * `shear`: `0` -> `shear={"x": (-10, 10), "y": (-10, 10)}` + * These defaults are only used if no affine transformation + parameter was set by the user. Otherwise the not-set + parameters default again towards the identity function. + * `PiecewiseAffine`: + * `scale`: `0` -> `(0.0, 0.04)` + * `nb_rows`: `4` -> `(2, 4)` + * `nb_cols`: `4` -> `(2, 4)` + * `PerspectiveTransform`: + * `scale`: `0` -> `(0.0, 0.06)` + * `ElasticTransformation`: + * `alpha`: `0` -> `(0.0, 40.0)` + * `sigma`: `0` -> `(4.0, 8.0)` + * `Rot90`: + * `k`: `(no default)` -> `k=1` + +**imgaug.pooling** + + * `AveragePooling`: + * `k`: `(no default)` -> `(1, 5)` + * `MaxPooling`: + * `k`: `(no default)` -> `(1, 5)` + * `MinPooling`: + * `k`: `(no default)` -> `(1, 5)` + * `MedianPooling`: + * `k`: `(no default)` -> `(1, 5)` + +**imgaug.segmentation** + + * `Superpixels`: + * `p_replace`: `0.0` -> `(0.5, 1.0)` + * `n_segments`: `100` -> `(50, 120)` + * `UniformVoronoi`: + * `n_points`: `(no default)` -> `(50, 500)` + * `p_replace`: `1.0` -> `(0.5, 1.0)`. + * `RegularGridVoronoi`: + * `n_rows`: `(no default)` -> `(10, 30)` + * `n_cols`: `(no default)` -> `(10, 30)` + * `p_drop_points`: `0.4` -> `(0.0, 0.5)` + * `p_replace`: `1.0` -> `(0.5, 1.0)` + * `RelativeRegularGridVoronoi`: Changed defaults from + * `n_rows_frac`: `(no default)` -> `(0.05, 0.15)` + * `n_cols_frac`: `(no default)` -> `(0.05, 0.15)` + * `p_drop_points`: `0.4` -> `(0.0, 0.5)` + * `p_replace`: `1.0` -> `(0.5, 1.0)` + +**imgaug.size** + + * `CropAndPad`: + * `percent`: `None` -> `(-0.1, 0.1)` + * This default is only used if the user has provided + neither `px` nor `percent`. + * `Pad`: + * `percent`: `None` -> `(0.0, 0.1)` + * This default is only used if the user has provided + neither `px` nor `percent`. + * `Crop`: + * `percent`: `None` -> `(0.0, 0.1)` + * This default is only used if the user has provided + neither `px` nor `percent`. + + +## `setup.py` Now Accepts any `opencv-*` Installation [#586](https://github.com/aleju/imgaug/pull/586) + +`setup.py` was changed so that it now accepts `opencv-python`, +`opencv-python-headless`, `opencv-contrib-python` and +`opencv-contrib-python-headless` as valid OpenCV installations. +Previously, only `opencv-python-headless` was accepted, which +could easily cause conflicts when another one of the mentioned +libraries was already installed. +If none of the mentioned libraries is installed, `setup.py` +will default to adding `opencv-python` as a requirement. + +Note that this may still cause issues if a single installation +call installs multiple libraries and the order is random. +`imgaug` will then currently request `opencv-python-headless` +to be installed, which may differ from what a later installed +library requests. Try to ensure that the other library is installed +first in these cases. + + +## Unified OpenCV Input Normalization [#565](https://github.com/aleju/imgaug/pull/565) + +Changed various augmenters to use the same normalization for OpenCV +inputs. This probably fixes some previously undiscovered bugs. + + +## Renamed In-place Methods [#444](https://github.com/aleju/imgaug/pull/444) + +* Renamed `Augmenter.reseed()` to `Augmenter.seed_()`. The old name is + now deprecated. +* Renamed `Augmenter.remove_augmenters_inplace()` to + `Augmenter.remove_augmenters_()`. The old name is now deprecated. + + +## Deprecated `AffineCv2` [#540](https://github.com/aleju/imgaug/pull/540) + +Deprecated `imgaug.augmenters.geometric.AffineCv2`. +Use `imgaug.augmenters.geometric.Affine` instead. [#540](https://github.com/aleju/imgaug/pull/540) + + + + +# Refactored + +## Refactored According to pylint Requirements [#504](https://github.com/aleju/imgaug/pull/504) + +* Refactored all core library files to fulfill (most) pylint requirements. +* [rarely breaking] Renamed + `imgaug.augmenters.size.KeepSizeByResize.get_shapes()` to `_get_shapes()`. +* Added a project-specific pylint configuration. + + + + +# Fixed + +* Fixed `Resize` always returning an `uint8` array during image augmentation + if the input was a single numpy array and all augmented images had the + same shape. [#442](https://github.com/aleju/imgaug/pull/442) [#443](https://github.com/aleju/imgaug/pull/443) +* Fixed `Affine` coordinate-based augmentation applying wrong offset + when shifting images to/from top-left corner. This would lead to an error + of around 0.5 to 1.0 pixels. [#446](https://github.com/aleju/imgaug/pull/446) +* Fixed keypoint augmentation in `PiecewiseAffine` potentially being + unaligned if a `KeypointsOnImage` instance contained no keypoints. [#446](https://github.com/aleju/imgaug/pull/446) +* Fixed `imgaug.validation.convert_iterable_to_string_of_types()` crashing due + to not converting types to strings before joining them. [#446](https://github.com/aleju/imgaug/pull/446) +* Fixed `imgaug.validation.assert_is_iterable_of()` producing a not + well-designed error if the input was not an iterable. [#446](https://github.com/aleju/imgaug/pull/446) +* Fixed image normalization crashing when an input ndarray of multiple images + was changed during augmentation to a list of multiple images with different + shapes *and* the original input ndarray represented a single image or + a collection of 2D `(H,W)` images. This problem affected `augment()`, + `augment_batch()` and `augment_batches()`. +* Fixed a typo in an image normalization error message. [#451](https://github.com/aleju/imgaug/pull/451) +* Fixed a problem in `WithChannels` that could lead random sampling in child + augmenters being unaligned between images and corresponding non-image + data. [#451](https://github.com/aleju/imgaug/pull/451) +* Added aliases to `imgaug.random.RNG` for some outdated numpy random number + sampling methods that existed in `numpy.random.RandomState` but not in + numpy's new RNG system (1.17+). These old methods are not used in `imgaug`, + but some custom augmenters and `Lambda` calls may require them when + interacting with the provided `random_state` instances. [#486](https://github.com/aleju/imgaug/pull/486) +* Fixed `Affine` producing unaligned augmentations between images and + segmentation maps or heatmaps when using `translate_px` and the segmentation + map or heatmap had a different height/width than corresponding image. [#489](https://github.com/aleju/imgaug/pull/489) +* Fixed a crash in `SnowflakesLayer` that could occur when using values + close to `1.0` for `flake_size`. [#471](https://github.com/aleju/imgaug/pull/471) +* Fixed `MultiplyHueAndSaturation` crashing if the RNG provided via + `random_state` was not `None` or `imgaug.random.RNG`. [#493](https://github.com/aleju/imgaug/pull/493) +* Fixed `CloudLayer.draw_on_image()` producing tuples instead of arrays + as output for `float` input images. [#540](https://github.com/aleju/imgaug/pull/540) +* Fixed `Affine` parameter `translate_px` behaving like `translate_percent` + if a continuous stochastic parameter was provided. + Analogously `translate_percent` would behave like `translate_px` if + a discrete stochastic parameter was provided. [#508](https://github.com/aleju/imgaug/pull/508) +* Fixed code hanging indefinitely when using multicore augmentation + on NixOS. [#414](https://github.com/aleju/imgaug/issues/414) [#510](https://github.com/aleju/imgaug/pull/510) +* Fixed a deprecation warning and potential crash in python 3.8 + related to the use of `collections` instead of `collections.abc`. [#527](https://github.com/aleju/imgaug/pull/527) +* Fixed deprecated `scipy.fromfunction()` being called. [#529](https://github.com/aleju/imgaug/pull/529) +* Fixed `imgaug.random.normalize_generator()` crashing in numpy 1.18. + The function relied on `numpy.random.bit_generator.BitGenerator`, which + was moved in numpy 1.18 to `numpy.random.BitGenerator` without a + deprecation period for the old name. [#534](https://github.com/aleju/imgaug/pull/534) +* Fixed an issue that could lead to endlessly hanging programs on some OS + when using multicore augmentation (e.g. via pool) and augmenters using + OpenCV. [#535](https://github.com/aleju/imgaug/pull/535) +* Fixed `imgaug.random.seed()` not seeding the global `RNG` in-place + in numpy 1.17+. The (unfixed) function instead created a new + global `RNG` with the given seed. This set the seed of augmenters + created *after* the `seed()` call, but not of augmenters created + *before* the `seed()` call as they would continue to use the old + global RNG. [#557](https://github.com/aleju/imgaug/pull/557) +* Fixed `cval` in `ElasticTransformation` resulting in new pixels in RGB images + being filled with `(cval, 0, 0)` instead of `(cval, cval, cval)`. [#561](https://github.com/aleju/imgaug/pull/561) [#562](https://github.com/aleju/imgaug/pull/562) +* Fixed some augmenters in module `weather` not transferring seed values + or random states that were provided upon creation to child augmenters. [#568](https://github.com/aleju/imgaug/pull/568) +* Fixed an inaccuracy in `PerspectiveTransform` that could lead to slightly + misaligned transformations between images and coordinate-based + augmentables (e.g. bounding boxes). The problem was more significant the + smaller the images and larger the `scale` values were. It was also + worsened by using `fit_output`. [#585](https://github.com/aleju/imgaug/pull/585) +* Fixed `KeepSizeByResize` potentially crashing if a single numpy array + was provided as the input for an iterable of images (as opposed to + a list of numpy arrays). [#590](https://github.com/aleju/imgaug/pull/590)