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/96de95731fae683597e2fce59ed6cc980b2be5a07a5fa70e692e8faafd46cc03.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/6903991a3dc0c2163d9200ce4dcc4d45bb2230df90aa29bda65d1ed891f67fad.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/69b45cccaa4a53bde8a56ea66d442c3079f53db05c3be7783a1fd07c5ee6696c.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/5b872250e5f5da90525bf875f63c18b1c740df4b9da8ddf028acb5882c35754c.png