Skip to content

image_operations

ImageNoiseAdder

Add random noise to an image, given a ratio and optional seed number.

If seed is passed other than None, then the instance is configued with a seeded random number generator (RNG). Otherwise, the instance is configured with a non-seeded RNG.

Source code in src/artificial_artwork/image/image_operations.py
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
@define(slots=True, kw_only=True)
class ImageNoiseAdder:
    """Add random noise to an image, given a ratio and optional seed number.

    If seed is passed other than None, then the instance is configued with a
    seeded random number generator (RNG). Otherwise, the instance is configured
    with a non-seeded RNG.
    """

    seed: t.Union[int, None] = field(default=None)
    min_pixel_value: int = field(default=-20)
    max_pixel_value: int = field(default=20)

    # Private Attributes
    _default_rng: RandomArrayGenerator = field(
        init=False,
        default=Factory(
            lambda self: self._create_rng(
                self.seed,
            ),
            takes_self=True,
        ),
    )

    def __call__(
        self, image: NDArray, ratio: float, seed: t.Union[int, None] = None
    ) -> NDArray:
        """Generates a noisy image by adding random noise to the content_image

        If instance has been configured without Seed, and you wish to continue
        using the same RNG, then pass no seed.

        If instance has been configured with Seed, and you wish to continue
        using the same RNG, then pass no seed.

        If instance has been configured with Seed, and you wish to use a new
        RNG, then pass a new seed.
        """
        if ratio < 0 or 1 < ratio:
            raise InvalidRatioError("Expected a ratio value x such that 0 <= x <= 1")

        if seed is not None:  # user want to re-configure new RNG Stochastic Process
            # with a provided seed
            self._default_rng = self._create_rng(seed)
        # if seed is None:  # user wants to continue sampling from the configured RNG
        # we continue using the 'default Stochastic Process' for sampling
        random_noise_pixel_array = self._default_rng(  # numpy float32 array
            self.min_pixel_value,
            self.max_pixel_value,
            image.shape,
        )
        # Set the input_image to be a weighted average of the content_image and a noise_image
        return random_noise_pixel_array * ratio + image * (1 - ratio)

    # Private methods
    @staticmethod
    def _create_rng(seed: t.Union[int, None]) -> RandomArrayGenerator:
        """Handle request to re-configure RNG potentially seeded with provided seed."""
        _rng = np.random.default_rng(seed=seed)
        rng: RandomArrayGenerator = _rng.uniform

        def _rng_float32(
            minimum_pixel_value: int,
            maximum_pixel_value: int,
            pixel_array_shape: t.Tuple[int, ...],
        ) -> NDArray:
            return rng(
                minimum_pixel_value,
                maximum_pixel_value,
                pixel_array_shape,
            ).astype("float32")

        return _rng_float32

__call__(image, ratio, seed=None)

Generates a noisy image by adding random noise to the content_image

If instance has been configured without Seed, and you wish to continue using the same RNG, then pass no seed.

If instance has been configured with Seed, and you wish to continue using the same RNG, then pass no seed.

If instance has been configured with Seed, and you wish to use a new RNG, then pass a new seed.

Source code in src/artificial_artwork/image/image_operations.py
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
def __call__(
    self, image: NDArray, ratio: float, seed: t.Union[int, None] = None
) -> NDArray:
    """Generates a noisy image by adding random noise to the content_image

    If instance has been configured without Seed, and you wish to continue
    using the same RNG, then pass no seed.

    If instance has been configured with Seed, and you wish to continue
    using the same RNG, then pass no seed.

    If instance has been configured with Seed, and you wish to use a new
    RNG, then pass a new seed.
    """
    if ratio < 0 or 1 < ratio:
        raise InvalidRatioError("Expected a ratio value x such that 0 <= x <= 1")

    if seed is not None:  # user want to re-configure new RNG Stochastic Process
        # with a provided seed
        self._default_rng = self._create_rng(seed)
    # if seed is None:  # user wants to continue sampling from the configured RNG
    # we continue using the 'default Stochastic Process' for sampling
    random_noise_pixel_array = self._default_rng(  # numpy float32 array
        self.min_pixel_value,
        self.max_pixel_value,
        image.shape,
    )
    # Set the input_image to be a weighted average of the content_image and a noise_image
    return random_noise_pixel_array * ratio + image * (1 - ratio)

noisy(image, ratio, seed=None)

Generates a noisy image by adding random noise to the content_image

Source code in src/artificial_artwork/image/image_operations.py
120
121
122
123
124
125
126
127
128
129
130
131
132
def noisy(
    image: NDArray,
    ratio: float,
    seed: int = None,
) -> NDArray:
    """Generates a noisy image by adding random noise to the content_image"""
    if ratio < 0 or 1 < ratio:
        raise InvalidRatioError("Expected a ratio value x such that 0 <= x <= 1")

    noise_image = np.random.uniform(-20, 20, image.shape).astype("float32")

    # Set the input_image to be a weighted average of the content_image and a noise_image
    return noise_image * ratio + image * (1 - ratio)

subtract(image, array)

Normalize the input image.

Parameters:

Name Type Description Default
image NDArray

[description]

required

Raises:

Type Description
ShapeMissmatchError

in case of ValueError due to numpy broadcasting failing

Returns:

Name Type Description
NDArray NDArray

[description]

Source code in src/artificial_artwork/image/image_operations.py
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def subtract(image: NDArray, array: NDArray) -> NDArray:
    """Normalize the input image.

    Args:
        image (NDArray): [description]

    Raises:
        ShapeMissmatchError: in case of ValueError due to numpy broadcasting failing

    Returns:
        NDArray: [description]
    """
    try:
        return image - array
    except ValueError as numpy_broadcast_error:
        raise ShapeMissmatchError(
            "Expected arrays with matching shapes."
        ) from numpy_broadcast_error