"""
Author: Ismael Seidel
Affiliation: Embedded Computing Lab (ECL), Federal University of Santa Catarina (UFSC)
Description:
This module generates quality heatmaps for light field views at different bitrates,
visualizing spatial quality variations across encoded views using matplotlib.
"""
import os
from pathlib import Path
import sys
# Add the parent directory to the Python path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from lfc_toolkit.src.configuration.configuration_reader import \
ConfigurationReader, read_config_from_argv
from lfc_toolkit.src.ctc.lightfield_factory import LightFieldFactory
from lfc_toolkit.src.data_handlers.formatters import \
get_formatted_filename_for_lf
from lfc_toolkit.src.quality.heatmap import HeatmapMatplotlib
[docs]
def main(configuration: ConfigurationReader = None) -> None:
"""Generate quality heatmaps for all configured light fields and codecs.
Creates matplotlib-based heatmaps visualizing spatial quality variations
for each light field view at different target bitrates and quality metrics.
Heatmaps are saved to the configured output path organized by codec name.
:param configuration: Configuration reader instance (read from argv if None)
:type configuration: ConfigurationReader
:return: None
:rtype: None
"""
if not configuration:
configuration = read_config_from_argv()
print("Using the paths from", configuration)
try:
heatmap_configurations = configuration["quality_heatmaps"]
except KeyError:
print("Error: 'quality_heatmaps' section is missing in the configuration.")
return
heatmaps_output_path = heatmap_configurations["path"]
metrics = heatmap_configurations["metrics"]
show_values = heatmap_configurations.get("show_values", False)
cmap = heatmap_configurations.get("cmap", "viridis")
codecs = configuration["codecs-to-run"]
sample_codecs = configuration["sample-codecs-to-run"]
# Combined object
codecs.update(sample_codecs)
for name in configuration.lightfield_names:
print(f"({name} LF)")
bpps = configuration.lightfield_configurations[name]["target-rates"]
for codec_name, codec_info in codecs.items():
print(f"Generating quality heatmaps for {codec_name}")
output_path = f"{heatmaps_output_path}/{codec_name}"
os.makedirs(output_path, exist_ok=True)
for metric in metrics:
unit, used_tool = configuration.get_used_quality_unit_and_tool(
metric=metric
)
used_tool_details = configuration["quality"]["wrappers"][
used_tool
]
used_tool_short_name = used_tool_details["short_name"]
used_tool_raw_type = used_tool_details["raw_type"]
for target_rate in bpps:
lightfield = LightFieldFactory.get_raw_lightfield(
configuration=configuration,
lightfield_name=name,
raw_type=used_tool_raw_type,
bpp_for_naming=target_rate,
)
path = ""
if codec_name in sample_codecs:
samples_path = sample_codecs.get(codec_name).get("samples_path", {}).get(used_tool_short_name, "")
if samples_path:
path = samples_path
else:
path = Path(codec_info['results']) / "metrics_reports" / used_tool_short_name
heatmap = HeatmapMatplotlib(
path=path,
lightfield=lightfield,
tool_name=used_tool_short_name,
target_rate=target_rate,
distortion_name=metric,
distortion_unit=unit,
title="Teste",
configuration=configuration
)
filename = get_formatted_filename_for_lf(
output_path,
lightfield=lightfield,
file_extension=heatmap_configurations["format"],
extra_end=f"{metric}_{target_rate}",
)
heatmap.plot(
show_values=show_values,
filename=filename,
codec_name=f"{codec_info.get('rd_preferences', {}).get('title', codec_name)}",
cmap=cmap,
)
if __name__ == "__main__":
main()