Colors#

In the Dead Leaves Model, the color of each object can be sampled from different types of distributions. The colors are specified via the color_param_distribution dictionary sampling color through a LeafAppearanceSampler. Different color spaces or sources are supported, as described below.

Gray-scale#

Gray-scale leaves are defined using a single channel, "gray". You can specify any supported distribution for the gray values. For example, a normal distribution centered at 0.5:

{
    "gray": <distribution>
}
  • Range: 0 (black) to 1 (white), values sampled outside this range are clipped.

  • Use case: Simplest and common setup for monochromatic images.

Example

Hide code cell source

from deadleaves import LeafGeometryGenerator, LeafAppearanceSampler, ImageRenderer

model = LeafGeometryGenerator(
    "circular", 
    {"area": {"powerlaw": {"low": 100.0, "high": 10000.0, "k": 1.5}}},
    (256,256)
)
leaf_table, segmentation_map = model.generate_segmentation()

colormodel = LeafAppearanceSampler(leaf_table)
colormodel.sample_color({"gray": {"uniform": {"low": 0.0, "high": 1.0}}})

renderer = ImageRenderer(colormodel.leaf_table, segmentation_map)
renderer.render_image()
renderer.show(figsize = (3,3))
../_images/f34dbac0d00728f6e0734ba24aae2d4c2f862a080e2a34cacf931c93a4d5c6f0.png

RGB#

RGB colors are defined using three channels: "R", "G", and "B". Each channel has its own distribution, allowing for fully random or correlated color sampling:

{
    "R": <distribution>, 
    "G": <distribution>, 
    "B": <distribution>
}
  • Range for each channel: 0 to 1

  • Use case: Full-color images where red, green, and blue components are sampled independently or according to specific distributions.

Example

Hide code cell source

from deadleaves import LeafGeometryGenerator, LeafAppearanceSampler, ImageRenderer

model = LeafGeometryGenerator(
    "circular", 
    {"area": {"powerlaw": {"low": 100.0, "high": 10000.0, "k": 1.5}}},
    (256,256)
)
leaf_table, segmentation_map = model.generate_segmentation()

colormodel = LeafAppearanceSampler(leaf_table)
colormodel.sample_color(
    {
        "R": {"uniform": {"low": 0.0, "high": 1.0}},
        "G": {"uniform": {"low": 0.0, "high": 1.0}},
        "B": {"uniform": {"low": 0.0, "high": 1.0}}
        }
)

renderer = ImageRenderer(colormodel.leaf_table, segmentation_map)
renderer.render_image()
renderer.show(figsize = (3,3))
../_images/eada2dd638ecb5989c77cd83cffe368c9725d444094e22a380eb907a44168394.png

HSV#

HSV is an alternative color space that can be useful for separating hue from saturation and luminance:

{
    "H": <distribution>, 
    "S": <distribution>, 
    "V": <distribution>
}
  • Range for each channel: 0 to 1

  • Use case: Easily sample colors with controlled hue.

Example

Hide code cell source

from deadleaves import LeafGeometryGenerator, LeafAppearanceSampler, ImageRenderer

model = LeafGeometryGenerator(
    "circular", 
    {"area": {"powerlaw": {"low": 100.0, "high": 10000.0, "k": 1.5}}},
    (256,256)
)
leaf_table, segmentation_map = model.generate_segmentation()

colormodel = LeafAppearanceSampler(leaf_table)
colormodel.sample_color(
    {
        "H": {"normal": {"loc": 0.5, "scale": 0.1}},
        "S": {"normal": {"loc": 0.5, "scale": 0.1}},
        "V": {"normal": {"loc": 0.5, "scale": 0.1}}
        }
)

renderer = ImageRenderer(colormodel.leaf_table, segmentation_map)
renderer.render_image()
renderer.show(figsize = (3,3))
../_images/a2d48ff29ccb4d59708f3c5d09350aa7cff597ab4af7a3375e549e174c3c65b9.png

From Image#

You can also sample colors from an existing image. This allows the Dead Leaves to imitate real color distributions from a source:

{
    "source": {"image": {"dir": <value>}}
}
  • dir: Path to the folder of images to sample from

  • Use case: Generate synthetic images that match the palette of a real image.

Example

Hide code cell source

from deadleaves import LeafGeometryGenerator, LeafAppearanceSampler, ImageRenderer

model = LeafGeometryGenerator(
    "circular", 
    {"area": {"powerlaw": {"low": 100.0, "high": 10000.0, "k": 1.5}}},
    (256,256)
)
leaf_table, segmentation_map = model.generate_segmentation()

colormodel = LeafAppearanceSampler(leaf_table)
colormodel.sample_color({"source": {"image": {"dir": "../../examples/images"}}})

renderer = ImageRenderer(colormodel.leaf_table, segmentation_map)
renderer.render_image()
renderer.show(figsize = (3,3))
../_images/6a5a1a6fff142255d880513979088ad4ea74d9300dd43a9168b283b1f0fe9fb5.png