• Postprocess

Gray Scale postprocess

By: SKY ENGINE AI
scroll down ↓to find out moregray-scale_3_resourcesTutorial

Gray Scale postprocess

In this case we will present you Gray Scale postprocess step.

Agenda:

  • Grey Scale usage
  • Color weights parameter

Scene setup

Let's use custom scene composer to set up the scene.
Scene consists of:

  • white sphere - location: (0, 0, 0)
  • red sphere - location: (1, 0, 0)
  • green sphere - location: (0, 1, 0)
  • blue sphere - location: (0, 0, 1)
  • camera - location: (3, 0, 3)
  • direction light - direction: (-1, -1, 0)
    from skyrenderer.cases.utils import GrayScaleSceneComposer
    from skyrenderer.render_chain import RenderChain
    scene_composer = GrayScaleSceneComposer(antialiasing_level=2048)
    scene_composer.setup_scene()
2025-02-14 12:47:21,683 | skyrenderer.scene.renderer_context |  INFO: Root paths:
- root path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer
- assets path: /dli/mount/assets
- config path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer/config
- gpu sources path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer/optix_sources/sources
- cache path: /dli/mount/cache
- ptx cache path: compiled_ptx/ptx
- ocio path: ocio_configs/aces_1.2/config.ocio

Grey Scale usage

Grayscale postprocess converts an image with a full range of colors into a monochromatic version
that only uses shades of gray.

Let's create two renders, first of them will be a result of a render chain consisting of a single
visible light render step.

    scene_composer.renderer_context.define_render_chain(
        RenderChain(
            render_steps=[scene_composer.visible_light_render_step],
            width=500,
            height=500,
        ),
    )
    colorful_render = scene_composer.get_render()
2025-02-14 12:47:22,595 | skyrenderer.utils.time_measurement |  INFO: Setup time: 872 ms

2025-02-14 12:47:22,701 | skyrenderer.utils.time_measurement |  INFO: Context update time: 106 ms

2025-02-14 12:47:26,419 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-14 12:47:26,422 | skyrenderer.utils.time_measurement |  INFO: Render time: 3.72 seconds

The second render will have an additional Grayscale Postprocess step.

    from skyrenderer.render_chain import GrayscalePostprocess
    gray_scale_step = GrayscalePostprocess(
        scene_composer.renderer_context,
    )
    scene_composer.renderer_context.define_render_chain(
        RenderChain(
            render_steps=[scene_composer.visible_light_render_step, gray_scale_step],
            width=500,
            height=500,
        ),
    )
    grayscale_render = scene_composer.get_render()
    scene_composer.visualize_grid((colorful_render, grayscale_render), (500, 1000), 2)
gray-scale_1_resourcesTutorial
2025-02-14 12:47:26,504 | skyrenderer.utils.time_measurement |  INFO: Setup time: 62 ms

2025-02-14 12:47:26,672 | skyrenderer.utils.time_measurement |  INFO: Context update time: 166 ms

2025-02-14 12:47:28,266 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-14 12:47:28,269 | skyrenderer.utils.time_measurement |  INFO: Render time: 1.60 seconds

Color weights parameter

The previous grayscale render was a bit too dark, we will try to brighten it. For this purpose we can use
the color_weights parameter. It is a list of 3 floats corresponding to RGB colors. The higher the values of this
parameter, the given color will be processed into a brighter gray.

Let's create a parameter provider and pass a list of low color weights:

    gray_scale_params = GrayscalePostprocess.create_parameter_provider(
        scene_composer.renderer_context, color_weights=[1, 1, 1]
    )
    gray_scale_step = GrayscalePostprocess(scene_composer.renderer_context, gray_scale_params)
    scene_composer.renderer_context.define_render_chain(
        RenderChain(
            render_steps=[scene_composer.visible_light_render_step, gray_scale_step],
            width=500,
            height=500,
        ),
    )
    bright_grayscale_render = scene_composer.get_render()
    render_dict = {
        "Colorful render": colorful_render,
        "Default parameters": grayscale_render,
        "Color weights [1, 1 ,1]": bright_grayscale_render,
    }
    scene_composer.visualize_grid_desc(render_dict, (500, 1500), 3, font_scale=2)
gray-scale_2_resourcesTutorial
2025-02-14 12:47:28,540 | skyrenderer.utils.time_measurement |  INFO: Setup time: 55 ms

2025-02-14 12:47:28,702 | skyrenderer.utils.time_measurement |  INFO: Context update time: 159 ms

2025-02-14 12:47:30,007 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-14 12:47:30,008 | skyrenderer.utils.time_measurement |  INFO: Render time: 1.31 seconds

We can also set different weights for red, green and blue colors. In the last render we expect red color
to be translated to brighter and green to darker gray.

    gray_scale_params = GrayscalePostprocess.create_parameter_provider(
        scene_composer.renderer_context, color_weights=[2, 0.5, 1]
    )
    gray_scale_step = GrayscalePostprocess(scene_composer.renderer_context, gray_scale_params)
    scene_composer.renderer_context.define_render_chain(
        RenderChain(
            render_steps=[scene_composer.visible_light_render_step, gray_scale_step],
            width=500,
            height=500,
        ),
    )
    various_grayscale_render = scene_composer.get_render()
    render_dict = {
        "Colorful render": colorful_render,
        "Color weights [1, 1 ,1]": bright_grayscale_render,
        "Color weights [2, 0.5, 1]": various_grayscale_render,
    }
    scene_composer.visualize_grid_desc(render_dict, (500, 1500), 3, font_scale=2)
gray-scale_3_resourcesTutorial
2025-02-14 12:47:30,230 | skyrenderer.utils.time_measurement |  INFO: Setup time: 56 ms

2025-02-14 12:47:30,317 | skyrenderer.utils.time_measurement |  INFO: Context update time: 86 ms

2025-02-14 12:47:31,585 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-14 12:47:31,585 | skyrenderer.utils.time_measurement |  INFO: Render time: 1.27 seconds

Summary

In this section you have learnt:

  • Grayscale postprocess step translates RGB colors to the shades of gray.
  • Dolor weights parameter can make translate the RGB colors to lighter or darker shades of gray.
  • The higher the values of color weights the given color will be processed into a brighter gray.