File: noise.py

package info (click to toggle)
python-sigima 1.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 25,608 kB
  • sloc: python: 35,251; makefile: 3
file content (107 lines) | stat: -rw-r--r-- 3,131 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.

"""
Noise addition computation module.
----------------------------------
"""

# pylint: disable=invalid-name  # Allows short reference names like x, y...

# Note:
# ----
# - All `guidata.dataset.DataSet` parameter classes must also be imported in the
#   `sigima.params` module.
# - All functions decorated by `computation_function` must be imported in the upper
#   level `sigima.proc.image` module.

from __future__ import annotations

import guidata.dataset as gds

from sigima.objects.base import (
    NormalDistributionParam,
    PoissonDistributionParam,
    UniformDistributionParam,
)
from sigima.objects.image import (
    ImageObj,
    NormalDistribution2DParam,
    PoissonDistribution2DParam,
    UniformDistribution2DParam,
    create_image_from_param,
)
from sigima.proc.decorator import computation_function
from sigima.proc.image.arithmetic import addition
from sigima.proc.image.base import dst_1_to_1


@computation_function()
def add_gaussian_noise(src: ImageObj, p: NormalDistributionParam) -> ImageObj:
    """Add Gaussian (normal) noise to the input image.

    Args:
        src: Source image.
        p: Parameters.

    Returns:
        Result image object.
    """
    param = NormalDistribution2DParam()  # Do not confuse with NormalDistributionParam
    gds.update_dataset(param, p)
    assert src.data is not None
    shape = src.data.shape
    param.height = shape[0]
    param.width = shape[1]
    param.dtype = src.data.dtype
    noise = create_image_from_param(param)
    dst = dst_1_to_1(src, "add_gaussian_noise", f"mu={p.mu},sigma={p.sigma}")
    dst.data = addition([dst, noise]).data
    return dst


@computation_function()
def add_poisson_noise(src: ImageObj, p: PoissonDistributionParam) -> ImageObj:
    """Add Poisson noise to the input image.

    Args:
        src: Source image.
        p: Parameters.

    Returns:
        Result image object.
    """
    param = PoissonDistribution2DParam()  # Do not confuse with PoissonDistributionParam
    gds.update_dataset(param, p)
    assert src.data is not None
    shape = src.data.shape
    param.height = shape[0]
    param.width = shape[1]
    param.dtype = src.data.dtype
    noise = create_image_from_param(param)
    dst = dst_1_to_1(src, "add_poisson_noise", f"lam={p.lam}")
    dst.data = addition([dst, noise]).data
    return dst


@computation_function()
def add_uniform_noise(src: ImageObj, p: UniformDistributionParam) -> ImageObj:
    """Add uniform noise to the input image.

    Args:
        src: Source image.
        p: Parameters.

    Returns:
        Result image object.
    """
    param = UniformDistribution2DParam()  # Do not confuse with UniformDistributionParam
    gds.update_dataset(param, p)
    assert src.data is not None
    shape = src.data.shape
    param.height = shape[0]
    param.width = shape[1]
    param.dtype = src.data.dtype
    noise = create_image_from_param(param)
    dst = dst_1_to_1(src, "add_uniform_noise", f"low={p.vmin}, high={p.vmax}")
    dst.data = addition([dst, noise]).data
    return dst