FilmGrain

Targets:
image
Image Types:uint8, float32

Analog film grain: luminance-dependent, spatially correlated noise. Distinct from i.i.d. GaussNoise or ShotNoise. Use for vintage or film-like augmentation.

Unlike GaussNoise or ShotNoise, film grain is:

  • Luminance-dependent: darker areas show more visible grain
  • Spatially correlated: grain is clumped, not i.i.d. per-pixel
  • Optionally chromatic: separate grain patterns per channel
Arguments
intensity_range
tuple[float, float]
[0.1,0.3]

Range for grain intensity. Higher values give more prominent grain. Default: (0.1, 0.3).

grain_size_range
tuple[int, int]
[1,3]

Grain resolution as divisor of image size. 1 = full resolution (fine); larger = coarser, more clumped. Default: (1, 3).

p
float
0.5

Probability of applying the transform. Default: 0.5.

Examples
>>> import numpy as np
>>> import albumentations as A
>>> image = np.random.randint(0, 256, (100, 100, 3), dtype=np.uint8)
>>>
>>> transform = A.FilmGrain(intensity_range=(0.1, 0.3), grain_size_range=(1, 3), p=1.0)
>>> result = transform(image=image)["image"]
Notes
  • Grain is generated at lower resolution and upscaled → spatial correlation (clumping) like real film.
  • Visibility modulated by inverse luminance; darker regions show more grain (silver halide-like behavior).
See Also
  • GaussNoise: i.i.d. Gaussian noise; use for sensor or transmission noise.
  • ShotNoise: Poisson (photon) noise in linear space; use for low-light sensor noise.