def DirectedEdgeDetect(alpha=0, direction=(0.0, 1.0), name=None, deterministic=False, random_state=None): """ Detect edges from specified angles and alpha-blend with the input image. This augmenter first detects edges along a certain angle. Usually, edges are detected in x- or y-direction, while here the edge detection kernel is rotated to match a specified angle. The result of applying the kernel is a black (non-edges) and white (edges) image. That image is alpha-blended with the input image. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Blending factor of the edge image. At ``0.0``, only the original image is visible, at ``1.0`` only the edge image is visible. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` per image. * If a list, a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from that parameter per image. direction : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Angle (in degrees) of edges to pronounce, where ``0`` represents ``0`` degrees and ``1.0`` represents 360 degrees (both clockwise, starting at the top). Default value is ``(0.0, 1.0)``, i.e. pick a random angle per image. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from the parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.DirectedEdgeDetect(alpha=1.0, direction=0) Turn input images into edge images in which edges are detected from the top side of the image (i.e. the top sides of horizontal edges are part of the edge image, while vertical edges are ignored). >>> aug = iaa.DirectedEdgeDetect(alpha=1.0, direction=90/360) Same as before, but edges are detected from the right. Horizontal edges are now ignored. >>> aug = iaa.DirectedEdgeDetect(alpha=1.0, direction=(0.0, 1.0)) Same as before, but edges are detected from a random angle sampled uniformly from the interval ``[0deg, 360deg]``. >>> aug = iaa.DirectedEdgeDetect(alpha=(0.0, 0.3), direction=0) Similar to the previous examples, but here the edge image is alpha-blended with the input image. The result is a mixture between the edge image and the input image. The blending factor is randomly sampled between ``0%`` and ``30%``. """ alpha_param = iap.handle_continuous_param( alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) direction_param = iap.handle_continuous_param( direction, "direction", value_range=None, tuple_to_uniform=True, list_to_choice=True) def create_matrices(_image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) direction_sample = direction_param.draw_sample( random_state=random_state_func) deg = int(direction_sample * 360) % 360 rad = np.deg2rad(deg) x = np.cos(rad - 0.5*np.pi) y = np.sin(rad - 0.5*np.pi) direction_vector = np.array([x, y]) matrix_effect = np.array([ [0, 0, 0], [0, 0, 0], [0, 0, 0] ], dtype=np.float32) for x, y in itertools.product([-1, 0, 1], [-1, 0, 1]): if (x, y) != (0, 0): cell_vector = np.array([x, y]) distance_deg = np.rad2deg( ia.angle_between_vectors(cell_vector, direction_vector)) distance = distance_deg / 180 similarity = (1 - distance)**4 matrix_effect[y+1, x+1] = similarity matrix_effect = matrix_effect / np.sum(matrix_effect) matrix_effect = matrix_effect * (-1) matrix_effect[1, 1] = 1 matrix_nochange = np.array([ [0, 0, 0], [0, 1, 0], [0, 0, 0] ], dtype=np.float32) matrix = ( (1-alpha_sample) * matrix_nochange + alpha_sample * matrix_effect ) return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(),) return Convolve( create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def MotionBlur(k=5, angle=(0, 360), direction=(-1.0, 1.0), order=1, name=None, deterministic=False, random_state=None): """ Blur images in a way that fakes camera or object movements. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- k : int or tuple of int or list of int or imgaug.parameters.StochasticParameter, optional Kernel size to use. * If a single int, then that value will be used for the height and width of the kernel. * If a tuple of two ints ``(a, b)``, then the kernel size will be sampled from the interval ``[a..b]``. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, then ``N`` samples will be drawn from that parameter per ``N`` input images, each representing the kernel size for the nth image. angle : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Angle of the motion blur in degrees (clockwise, relative to top center direction). * If a number, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. direction : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Forward/backward direction of the motion blur. Lower values towards -1.0 will point the motion blur towards the back (with angle provided via `angle`). Higher values towards 1.0 will point the motion blur forward. A value of 0.0 leads to a uniformly (but still angled) motion blur. * If a number, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. order : int or iterable of int or imgaug.ALL or imgaug.parameters.StochasticParameter, optional Interpolation order to use when rotating the kernel according to `angle`. See :func:`imgaug.augmenters.geometric.Affine.__init__`. Recommended to be ``0`` or ``1``, with ``0`` being faster, but less continuous/smooth as `angle` is changed, particularly around multiple of 45 degrees. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or imgaug.random.RNG or numpy.random.Generator or numpy.random.bit_generator.BitGenerator or numpy.random.SeedSequence or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = iaa.MotionBlur(k=15) Apply motion blur with a kernel size of ``15x15`` pixels to images. >>> aug = iaa.MotionBlur(k=15, angle=[-45, 45]) Apply motion blur with a kernel size of ``15x15`` pixels and a blur angle of either ``-45`` or ``45`` degrees (randomly picked per image). """ # TODO allow (1, None) and set to identity matrix if k == 1 k_param = iap.handle_discrete_param(k, "k", value_range=(3, None), tuple_to_uniform=True, list_to_choice=True, allow_floats=False) angle_param = iap.handle_continuous_param(angle, "angle", value_range=None, tuple_to_uniform=True, list_to_choice=True) direction_param = iap.handle_continuous_param(direction, "direction", value_range=(-1.0 - 1e-6, 1.0 + 1e-6), tuple_to_uniform=True, list_to_choice=True) def create_matrices(image, nb_channels, random_state_func): # avoid cyclic import between blur and geometric from . import geometric as iaa_geometric # force discrete for k_sample via int() in case of stochastic parameter k_sample = int(k_param.draw_sample(random_state=random_state_func)) angle_sample = angle_param.draw_sample(random_state=random_state_func) direction_sample = direction_param.draw_sample( random_state=random_state_func) k_sample = k_sample if k_sample % 2 != 0 else k_sample + 1 direction_sample = np.clip(direction_sample, -1.0, 1.0) direction_sample = (direction_sample + 1.0) / 2.0 matrix = np.zeros((k_sample, k_sample), dtype=np.float32) matrix[:, k_sample // 2] = np.linspace(float(direction_sample), 1.0 - float(direction_sample), num=k_sample) rot = iaa_geometric.Affine(rotate=angle_sample, order=order) matrix = (rot.augment_image( (matrix * 255).astype(np.uint8)) / 255.0).astype(np.float32) return [matrix / np.sum(matrix)] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return iaa_convolutional.Convolve(create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def Emboss(alpha=0, strength=1, name=None, deterministic=False, random_state=None): """ Emboss images and alpha-blend the result with the original input images. The embossed version pronounces highlights and shadows, letting the image look as if it was recreated on a metal plate ("embossed"). dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Blending factor of the embossed image. At ``0.0``, only the original image is visible, at ``1.0`` only its embossed version is visible. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` per image. * If a list, a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from that parameter per image. strength : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Parameter that controls the strength of the embossing. Sane values are somewhere in the interval ``[0.0, 2.0]`` with ``1.0`` being the standard embossing effect. Default value is ``1.0``. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from the parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.Emboss(alpha=(0.0, 1.0), strength=(0.5, 1.5)) Emboss an image with a strength sampled uniformly from the interval ``[0.5, 1.5]`` and alpha-blend the result with the original input image using a random blending factor between ``0%`` and ``100%``. """ alpha_param = iap.handle_continuous_param( alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) strength_param = iap.handle_continuous_param( strength, "strength", value_range=(0, None), tuple_to_uniform=True, list_to_choice=True) def create_matrices(image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) strength_sample = strength_param.draw_sample( random_state=random_state_func) matrix_nochange = np.array([ [0, 0, 0], [0, 1, 0], [0, 0, 0] ], dtype=np.float32) matrix_effect = np.array([ [-1-strength_sample, 0-strength_sample, 0], [0-strength_sample, 1, 0+strength_sample], [0, 0+strength_sample, 1+strength_sample] ], dtype=np.float32) matrix = ( (1-alpha_sample) * matrix_nochange + alpha_sample * matrix_effect ) return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(),) return Convolve( create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def EdgeDetect(alpha=0, name=None, deterministic=False, random_state=None): """ Generate a black & white edge image and alpha-blend it with the input image. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Blending factor of the edge image. At ``0.0``, only the original image is visible, at ``1.0`` only the edge image is visible. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` per image. * If a list, a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from that parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.EdgeDetect(alpha=(0.0, 1.0)) Detect edges in an image, mark them as black (non-edge) and white (edges) and alpha-blend the result with the original input image using a random blending factor between ``0%`` and ``100%``. """ alpha_param = iap.handle_continuous_param( alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) def create_matrices(_image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) matrix_nochange = np.array([ [0, 0, 0], [0, 1, 0], [0, 0, 0] ], dtype=np.float32) matrix_effect = np.array([ [0, 1, 0], [1, -4, 1], [0, 1, 0] ], dtype=np.float32) matrix = ( (1-alpha_sample) * matrix_nochange + alpha_sample * matrix_effect ) return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(),) return Convolve( create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def DirectedEdgeDetect(alpha=0, direction=(0.0, 1.0), name=None, deterministic=False, random_state=None): """ Augmenter that detects edges that have certain directions and marks them in a black and white image and then overlays the result with the original image. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Visibility of the sharpened image. At 0, only the original image is visible, at 1.0 only its sharpened version is visible. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. direction : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Angle of edges to pronounce, where 0 represents 0 degrees and 1.0 represents 360 degrees (both clockwise, starting at the top). Default value is ``(0.0, 1.0)``, i.e. pick a random angle per image. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = DirectedEdgeDetect(alpha=1.0, direction=0) turns input images into edge images in which edges are detected from top side of the image (i.e. the top sides of horizontal edges are added to the output). >>> aug = DirectedEdgeDetect(alpha=1.0, direction=90/360) same as before, but detecting edges from the right (right side of each vertical edge). >>> aug = DirectedEdgeDetect(alpha=1.0, direction=(0.0, 1.0)) same as before, but detecting edges from a variable direction (anything between 0 and 1.0, i.e. 0 degrees and 360 degrees, starting from the top and moving clockwise). >>> aug = DirectedEdgeDetect(alpha=(0.0, 0.3), direction=0) generates edge images (edges detected from the top) and overlays them with the input images by a variable amount between 0 and 30 percent (e.g. for 0.3 then ``0.7*old_image + 0.3*edge_image``). """ alpha_param = iap.handle_continuous_param(alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) direction_param = iap.handle_continuous_param(direction, "direction", value_range=None, tuple_to_uniform=True, list_to_choice=True) def create_matrices(_image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) direction_sample = direction_param.draw_sample( random_state=random_state_func) deg = int(direction_sample * 360) % 360 rad = np.deg2rad(deg) x = np.cos(rad - 0.5 * np.pi) y = np.sin(rad - 0.5 * np.pi) direction_vector = np.array([x, y]) matrix_effect = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]], dtype=np.float32) for x in [-1, 0, 1]: for y in [-1, 0, 1]: if (x, y) != (0, 0): cell_vector = np.array([x, y]) distance_deg = np.rad2deg( ia.angle_between_vectors(cell_vector, direction_vector)) distance = distance_deg / 180 similarity = (1 - distance)**4 matrix_effect[y + 1, x + 1] = similarity matrix_effect = matrix_effect / np.sum(matrix_effect) matrix_effect = matrix_effect * (-1) matrix_effect[1, 1] = 1 matrix_nochange = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]], dtype=np.float32) matrix = ( 1 - alpha_sample) * matrix_nochange + alpha_sample * matrix_effect return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return Convolve(create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def Sharpen(alpha=0, lightness=1, name=None, deterministic=False, random_state=None): """ Sharpen images and alpha-blend the result with the original input images. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Blending factor of the sharpened image. At ``0.0``, only the original image is visible, at ``1.0`` only its sharpened version is visible. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` per image. * If a list, a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from that parameter per image. lightness : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Lightness/brightness of the sharped image. Sane values are somewhere in the interval ``[0.5, 2.0]``. The value ``0.0`` results in an edge map. Values higher than ``1.0`` create bright images. Default value is ``1.0``. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value will be sampled from the interval ``[a, b]`` per image. * If a list, a random value will be sampled from that list per image. * If a ``StochasticParameter``, a value will be sampled from that parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.Sharpen(alpha=(0.0, 1.0)) Sharpens input images and blends the sharpened image with the input image using a random blending factor between ``0%`` and ``100%`` (uniformly sampled). >>> aug = iaa.Sharpen(alpha=(0.0, 1.0), lightness=(0.75, 2.0)) Sharpens input images with a variable `lightness` sampled uniformly from the interval ``[0.75, 2.0]`` and with a fully random blending factor (as in the above example). """ alpha_param = iap.handle_continuous_param( alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) lightness_param = iap.handle_continuous_param( lightness, "lightness", value_range=(0, None), tuple_to_uniform=True, list_to_choice=True) def create_matrices(image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) lightness_sample = lightness_param.draw_sample( random_state=random_state_func) matrix_nochange = np.array([ [0, 0, 0], [0, 1, 0], [0, 0, 0] ], dtype=np.float32) matrix_effect = np.array([ [-1, -1, -1], [-1, 8+lightness_sample, -1], [-1, -1, -1] ], dtype=np.float32) matrix = ( (1-alpha_sample) * matrix_nochange + alpha_sample * matrix_effect ) return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(),) return Convolve( create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def Emboss(alpha=0, strength=1, name=None, deterministic=False, random_state=None): """ Augmenter that embosses images and overlays the result with the original image. The embossed version pronounces highlights and shadows, letting the image look as if it was recreated on a metal plate ("embossed"). dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Visibility of the sharpened image. At 0, only the original image is visible, at 1.0 only its sharpened version is visible. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. strength : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Parameter that controls the strength of the embossing. Sane values are somewhere in the range ``(0, 2)`` with 1 being the standard embossing effect. Default value is 1. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = Emboss(alpha=(0.0, 1.0), strength=(0.5, 1.5)) embosses an image with a variable strength in the range ``0.5 <= x <= 1.5`` and overlays the result with a variable alpha in the range ``0.0 <= a <= 1.0`` over the old image. """ alpha_param = iap.handle_continuous_param(alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) strength_param = iap.handle_continuous_param(strength, "strength", value_range=(0, None), tuple_to_uniform=True, list_to_choice=True) def create_matrices(image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) strength_sample = strength_param.draw_sample( random_state=random_state_func) matrix_nochange = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]], dtype=np.float32) matrix_effect = np.array( [[-1 - strength_sample, 0 - strength_sample, 0], [0 - strength_sample, 1, 0 + strength_sample], [0, 0 + strength_sample, 1 + strength_sample]], dtype=np.float32) matrix = ( 1 - alpha_sample) * matrix_nochange + alpha_sample * matrix_effect return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return Convolve(create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def EdgeDetect(alpha=0, name=None, deterministic=False, random_state=None): """ Augmenter that detects all edges in images, marks them in a black and white image and then overlays the result with the original image. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Visibility of the sharpened image. At 0, only the original image is visible, at 1.0 only its sharpened version is visible. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = EdgeDetect(alpha=(0.0, 1.0)) detects edges in an image and overlays the result with a variable alpha in the range ``0.0 <= a <= 1.0`` over the old image. """ alpha_param = iap.handle_continuous_param(alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) def create_matrices(_image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) matrix_nochange = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]], dtype=np.float32) matrix_effect = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]], dtype=np.float32) matrix = ( 1 - alpha_sample) * matrix_nochange + alpha_sample * matrix_effect return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return Convolve(create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def Snowflakes(density=(0.005, 0.075), density_uniformity=(0.3, 0.9), flake_size=(0.2, 0.7), flake_size_uniformity=(0.4, 0.8), angle=(-30, 30), speed=(0.007, 0.03), name=None, deterministic=False, random_state=None): """ Add falling snowflakes to images. This is a wrapper around ``SnowflakesLayer``. It executes 1 to 3 layers per image. dtype support:: * ``uint8``: yes; tested * ``uint16``: no (1) * ``uint32``: no (1) * ``uint64``: no (1) * ``int8``: no (1) * ``int16``: no (1) * ``int32``: no (1) * ``int64``: no (1) * ``float16``: no (1) * ``float32``: no (1) * ``float64``: no (1) * ``float128``: no (1) * ``bool``: no (1) - (1) Parameters of this augmenter are optimized for the value range of ``uint8``. While other dtypes may be accepted, they will lead to images augmented in ways inappropriate for the respective dtype. Parameters ---------- density : number or tuple of number or list of number or imgaug.parameters.StochasticParameter Density of the snowflake layer, as a probability of each pixel in low resolution space to be a snowflake. Valid values are in the interval ``[0.0, 1.0]``. Recommended to be in the interval ``[0.01, 0.075]``. * If a number, then that value will always be used. * If a tuple ``(a, b)``, then a value will be uniformly sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, then a value will be sampled per image from that parameter. density_uniformity : number or tuple of number or list of number or imgaug.parameters.StochasticParameter Size uniformity of the snowflakes. Higher values denote more similarly sized snowflakes. Valid values are in the interval ``[0.0, 1.0]``. Recommended to be around ``0.5``. * If a number, then that value will always be used. * If a tuple ``(a, b)``, then a value will be uniformly sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, then a value will be sampled per image from that parameter. flake_size : number or tuple of number or list of number or imgaug.parameters.StochasticParameter Size of the snowflakes. This parameter controls the resolution at which snowflakes are sampled. Higher values mean that the resolution is closer to the input image's resolution and hence each sampled snowflake will be smaller (because of the smaller pixel size). Valid values are in the interval ``(0.0, 1.0]``. Recommended values: * On ``96x128`` a value of ``(0.1, 0.4)`` worked well. * On ``192x256`` a value of ``(0.2, 0.7)`` worked well. * On ``960x1280`` a value of ``(0.7, 0.95)`` worked well. Datatype behaviour: * If a number, then that value will always be used. * If a tuple ``(a, b)``, then a value will be uniformly sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, then a value will be sampled per image from that parameter. flake_size_uniformity : number or tuple of number or list of number or imgaug.parameters.StochasticParameter Controls the size uniformity of the snowflakes. Higher values mean that the snowflakes are more similarly sized. Valid values are in the interval ``[0.0, 1.0]``. Recommended to be around ``0.5``. * If a number, then that value will always be used. * If a tuple ``(a, b)``, then a value will be uniformly sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, then a value will be sampled per image from that parameter. angle : number or tuple of number or list of number or imgaug.parameters.StochasticParameter Angle in degrees of motion blur applied to the snowflakes, where ``0.0`` is motion blur that points straight upwards. Recommended to be in the interval ``[-30, 30]``. See also :func:`imgaug.augmenters.blur.MotionBlur.__init__`. * If a number, then that value will always be used. * If a tuple ``(a, b)``, then a value will be uniformly sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, then a value will be sampled per image from that parameter. speed : number or tuple of number or list of number or imgaug.parameters.StochasticParameter Perceived falling speed of the snowflakes. This parameter controls the motion blur's kernel size. It follows roughly the form ``kernel_size = image_size * speed``. Hence, values around ``1.0`` denote that the motion blur should "stretch" each snowflake over the whole image. Valid values are in the interval ``[0.0, 1.0]``. Recommended values: * On ``96x128`` a value of ``(0.01, 0.05)`` worked well. * On ``192x256`` a value of ``(0.007, 0.03)`` worked well. * On ``960x1280`` a value of ``(0.001, 0.03)`` worked well. Datatype behaviour: * If a number, then that value will always be used. * If a tuple ``(a, b)``, then a value will be uniformly sampled from the interval ``[a, b]`` per image. * If a list, then a random value will be sampled from that list per image. * If a ``StochasticParameter``, then a value will be sampled per image from that parameter. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.Snowflakes(flake_size=(0.1, 0.4), speed=(0.01, 0.05)) Adds snowflakes to small images (around ``96x128``). >>> aug = iaa.Snowflakes(flake_size=(0.2, 0.7), speed=(0.007, 0.03)) Adds snowflakes to medium-sized images (around ``192x256``). >>> aug = iaa.Snowflakes(flake_size=(0.7, 0.95), speed=(0.001, 0.03)) Adds snowflakes to large images (around ``960x1280``). """ if name is None: name = "Unnamed%s" % (ia.caller_name(), ) layer = SnowflakesLayer(density=density, density_uniformity=density_uniformity, flake_size=flake_size, flake_size_uniformity=flake_size_uniformity, angle=angle, speed=speed, blur_sigma_fraction=(0.0001, 0.001)) return meta.SomeOf((1, 3), children=[layer.deepcopy() for _ in range(3)], random_order=False, name=name, deterministic=deterministic, random_state=random_state)
def Sharpen(alpha=0, lightness=1, name=None, deterministic=False, random_state=None): """ Augmenter that sharpens images and overlays the result with the original image. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Visibility of the sharpened image. At 0, only the original image is visible, at 1.0 only its sharpened version is visible. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. lightness : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Parameter that controls the lightness/brightness of the sharped image. Sane values are somewhere in the range ``(0.5, 2)``. The value 0 results in an edge map. Values higher than 1 create bright images. Default value is 1. * If an int or float, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = Sharpen(alpha=(0.0, 1.0)) sharpens input images and overlays the sharpened image by a variable amount over the old image. >>> aug = Sharpen(alpha=(0.0, 1.0), lightness=(0.75, 2.0)) sharpens input images with a variable lightness in the range ``0.75 <= x <= 2.0`` and with a variable alpha. """ alpha_param = iap.handle_continuous_param(alpha, "alpha", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True) lightness_param = iap.handle_continuous_param(lightness, "lightness", value_range=(0, None), tuple_to_uniform=True, list_to_choice=True) def create_matrices(image, nb_channels, random_state_func): alpha_sample = alpha_param.draw_sample(random_state=random_state_func) ia.do_assert(0 <= alpha_sample <= 1.0) lightness_sample = lightness_param.draw_sample( random_state=random_state_func) matrix_nochange = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]], dtype=np.float32) matrix_effect = np.array( [[-1, -1, -1], [-1, 8 + lightness_sample, -1], [-1, -1, -1]], dtype=np.float32) matrix = ( 1 - alpha_sample) * matrix_nochange + alpha_sample * matrix_effect return [matrix] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return Convolve(create_matrices, name=name, deterministic=deterministic, random_state=random_state)
def Fog(name=None, deterministic=False, random_state=None): """ Add fog to images. This is a wrapper around ``CloudLayer``. It executes a single layer per image with a configuration leading to fairly dense clouds with low-frequency patterns. This augmenter seems to be fairly robust w.r.t. the image size. Tested with ``96x128``, ``192x256`` and ``960x1280``. dtype support:: * ``uint8``: yes; tested * ``uint16``: no (1) * ``uint32``: no (1) * ``uint64``: no (1) * ``int8``: no (1) * ``int16``: no (1) * ``int32``: no (1) * ``int64``: no (1) * ``float16``: no (1) * ``float32``: no (1) * ``float64``: no (1) * ``float128``: no (1) * ``bool``: no (1) - (1) Parameters of this augmenter are optimized for the value range of ``uint8``. While other dtypes may be accepted, they will lead to images augmented in ways inappropriate for the respective dtype. Parameters ---------- name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.Fog() Creates an augmenter that adds fog to images. """ if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return CloudLayer(intensity_mean=(220, 255), intensity_freq_exponent=(-2.0, -1.5), intensity_coarse_scale=2, alpha_min=(0.7, 0.9), alpha_multiplier=0.3, alpha_size_px_max=(2, 8), alpha_freq_exponent=(-4.0, -2.0), sparsity=0.9, density_multiplier=(0.4, 0.9), name=name, deterministic=deterministic, random_state=random_state)
def Clouds(name=None, deterministic=False, random_state=None): """ Add clouds to images. This is a wrapper around ``CloudLayer``. It executes 1 to 2 layers per image, leading to varying densities and frequency patterns of clouds. This augmenter seems to be fairly robust w.r.t. the image size. Tested with ``96x128``, ``192x256`` and ``960x1280``. dtype support:: * ``uint8``: yes; tested * ``uint16``: no (1) * ``uint32``: no (1) * ``uint64``: no (1) * ``int8``: no (1) * ``int16``: no (1) * ``int32``: no (1) * ``int64``: no (1) * ``float16``: no (1) * ``float32``: no (1) * ``float64``: no (1) * ``float128``: no (1) * ``bool``: no (1) - (1) Parameters of this augmenter are optimized for the value range of ``uint8``. While other dtypes may be accepted, they will lead to images augmented in ways inappropriate for the respective dtype. Parameters ---------- name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> import imgaug.augmenters as iaa >>> aug = iaa.Clouds() Creates an augmenter that adds clouds to images. """ if name is None: name = "Unnamed%s" % (ia.caller_name(), ) layers = [ CloudLayer(intensity_mean=(196, 255), intensity_freq_exponent=(-2.5, -2.0), intensity_coarse_scale=10, alpha_min=0, alpha_multiplier=(0.25, 0.75), alpha_size_px_max=(2, 8), alpha_freq_exponent=(-2.5, -2.0), sparsity=(0.8, 1.0), density_multiplier=(0.5, 1.0)), CloudLayer(intensity_mean=(196, 255), intensity_freq_exponent=(-2.0, -1.0), intensity_coarse_scale=10, alpha_min=0, alpha_multiplier=(0.5, 1.0), alpha_size_px_max=(64, 128), alpha_freq_exponent=(-2.0, -1.0), sparsity=(1.0, 1.4), density_multiplier=(0.8, 1.5)) ] return meta.SomeOf((1, 2), children=layers, random_order=False, name=name, deterministic=deterministic, random_state=random_state)
def Grayscale(alpha=0, from_colorspace="RGB", name=None, deterministic=False, random_state=None): """ Augmenter to convert images to their grayscale versions. NOTE: Number of output channels is still 3, i.e. this augmenter just "removes" color. TODO check dtype support dtype support:: * ``uint8``: yes; fully tested * ``uint16``: ? * ``uint32``: ? * ``uint64``: ? * ``int8``: ? * ``int16``: ? * ``int32``: ? * ``int64``: ? * ``float16``: ? * ``float32``: ? * ``float64``: ? * ``float128``: ? * ``bool``: ? Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional The alpha value of the grayscale image when overlayed over the old image. A value close to 1.0 means, that mostly the new grayscale image is visible. A value close to 0.0 means, that mostly the old image is visible. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. from_colorspace : str, optional The source colorspace (of the input images). Allowed strings are: ``RGB``, ``BGR``, ``GRAY``, ``CIE``, ``YCrCb``, ``HSV``, ``HLS``, ``Lab``, ``Luv``. See :func:`imgaug.augmenters.color.ChangeColorspace.__init__`. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = iaa.Grayscale(alpha=1.0) creates an augmenter that turns images to their grayscale versions. >>> aug = iaa.Grayscale(alpha=(0.0, 1.0)) creates an augmenter that turns images to their grayscale versions with an alpha value in the range ``0 <= alpha <= 1``. An alpha value of 0.5 would mean, that the output image is 50 percent of the input image and 50 percent of the grayscale image (i.e. 50 percent of color removed). """ if name is None: name = "Unnamed%s" % (ia.caller_name(), ) return ChangeColorspace(to_colorspace=ChangeColorspace.GRAY, alpha=alpha, from_colorspace=from_colorspace, name=name, deterministic=deterministic, random_state=random_state)
def Grayscale(alpha=0, from_colorspace="RGB", name=None, deterministic=False, random_state=None): """ Augmenter to convert images to their grayscale versions. NOTE: Number of output channels is still 3, i.e. this augmenter just "removes" color. TODO check dtype support dtype support:: * ``uint8``: yes; fully tested * ``uint16``: ? * ``uint32``: ? * ``uint64``: ? * ``int8``: ? * ``int16``: ? * ``int32``: ? * ``int64``: ? * ``float16``: ? * ``float32``: ? * ``float64``: ? * ``float128``: ? * ``bool``: ? Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional The alpha value of the grayscale image when overlayed over the old image. A value close to 1.0 means, that mostly the new grayscale image is visible. A value close to 0.0 means, that mostly the old image is visible. * If a number, exactly that value will always be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. from_colorspace : str, optional The source colorspace (of the input images). Allowed strings are: ``RGB``, ``BGR``, ``GRAY``, ``CIE``, ``YCrCb``, ``HSV``, ``HLS``, ``Lab``, ``Luv``. See :func:`imgaug.augmenters.color.ChangeColorspace.__init__`. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = iaa.Grayscale(alpha=1.0) creates an augmenter that turns images to their grayscale versions. >>> aug = iaa.Grayscale(alpha=(0.0, 1.0)) creates an augmenter that turns images to their grayscale versions with an alpha value in the range ``0 <= alpha <= 1``. An alpha value of 0.5 would mean, that the output image is 50 percent of the input image and 50 percent of the grayscale image (i.e. 50 percent of color removed). """ if name is None: name = "Unnamed%s" % (ia.caller_name(),) return ChangeColorspace(to_colorspace=ChangeColorspace.GRAY, alpha=alpha, from_colorspace=from_colorspace, name=name, deterministic=deterministic, random_state=random_state)
def MotionBlur(k=5, angle=(0, 360), direction=(-1.0, 1.0), order=1, name=None, deterministic=False, random_state=None): """ Augmenter that sharpens images and overlays the result with the original image. dtype support:: See ``imgaug.augmenters.convolutional.Convolve``. Parameters ---------- k : int or tuple of int or list of int or imgaug.parameters.StochasticParameter, optional Kernel size to use. * If a single int, then that value will be used for the height and width of the kernel. * If a tuple of two ints ``(a, b)``, then the kernel size will be sampled from the interval ``[a..b]``. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, then ``N`` samples will be drawn from that parameter per ``N`` input images, each representing the kernel size for the nth image. angle : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Angle of the motion blur in degrees (clockwise, relative to top center direction). * If a number, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. direction : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Forward/backward direction of the motion blur. Lower values towards -1.0 will point the motion blur towards the back (with angle provided via `angle`). Higher values towards 1.0 will point the motion blur forward. A value of 0.0 leads to a uniformly (but still angled) motion blur. * If a number, exactly that value will be used. * If a tuple ``(a, b)``, a random value from the range ``a <= x <= b`` will be sampled per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, a value will be sampled from the parameter per image. order : int or iterable of int or imgaug.ALL or imgaug.parameters.StochasticParameter, optional Interpolation order to use when rotating the kernel according to `angle`. See :func:`imgaug.augmenters.geometric.Affine.__init__`. Recommended to be ``0`` or ``1``, with ``0`` being faster, but less continuous/smooth as `angle` is changed, particularly around multiple of 45 degrees. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Examples -------- >>> aug = iaa.MotionBlur(k=15) Create a motion blur augmenter with kernel size of 15x15. >>> aug = iaa.MotionBlur(k=15, angle=[-45, 45]) Create a motion blur augmenter with kernel size of 15x15 and a blur angle of either -45 or 45 degrees (randomly picked per image). """ # TODO allow (1, None) and set to identity matrix if k == 1 k_param = iap.handle_discrete_param(k, "k", value_range=(3, None), tuple_to_uniform=True, list_to_choice=True, allow_floats=False) angle_param = iap.handle_continuous_param(angle, "angle", value_range=None, tuple_to_uniform=True, list_to_choice=True) direction_param = iap.handle_continuous_param(direction, "direction", value_range=(-1.0-1e-6, 1.0+1e-6), tuple_to_uniform=True, list_to_choice=True) def create_matrices(image, nb_channels, random_state_func): # avoid cyclic import between blur and geometric from . import geometric as iaa_geometric # force discrete for k_sample via int() in case of stochastic parameter k_sample = int(k_param.draw_sample(random_state=random_state_func)) angle_sample = angle_param.draw_sample(random_state=random_state_func) direction_sample = direction_param.draw_sample(random_state=random_state_func) k_sample = k_sample if k_sample % 2 != 0 else k_sample + 1 direction_sample = np.clip(direction_sample, -1.0, 1.0) direction_sample = (direction_sample + 1.0) / 2.0 matrix = np.zeros((k_sample, k_sample), dtype=np.float32) matrix[:, k_sample//2] = np.linspace(float(direction_sample), 1.0 - float(direction_sample), num=k_sample) rot = iaa_geometric.Affine(rotate=angle_sample, order=order) matrix = (rot.augment_image((matrix * 255).astype(np.uint8)) / 255.0).astype(np.float32) return [matrix/np.sum(matrix)] * nb_channels if name is None: name = "Unnamed%s" % (ia.caller_name(),) return iaa_convolutional.Convolve(create_matrices, name=name, deterministic=deterministic, random_state=random_state)