Colorspace Dataset¶
Allows you to see the impact of the color space on compression.
Download¶
mendevi download colorspace.db.xz.torrent
colorspace.json.xz (845 Ko).
colorspace.db.xz.torrent (571 Mo).
Pipeline¶
This is the pipeline used for measurements:
The input video
park_joy.mkvwas losslessly transcoded with different colorspaces to form the set of reference videosreference_park_joy_*_fhd.mp4, including the defaultreference_park_joy_fhd.mp4.Each of the
reference_park_joy_*videos was lossly encoded by varying several parameters but without changing the colorspace. These videos form thesample*collection.
Plots¶
Distortion as a function of bitrate for several colorspaces¶
On the left column, the sample videos are directly compared (without color conversion) to their lossless reference
reference_park_joy_*_fhd.mp4.On the right column, the sample videos are transformed back using the inverse color transformation and then, compared to the same default reference
reference_park_joy_fhd.mp4.
mendevi plot colorspace.db -x rate -y ssim_comp -c eotf -m '(prim, range)' -wx "ref_stem=='park_joy'" -f "not name.startswith('ref')" -t t_met_metric
Impact of EOTF on energy consumption¶
mendevi plot colorspace.db -x rate -y energy -c eotf -m '(prim, range)' -wx encoder -s 'sharey="row"' 'sharey=False'
Lossless color transformation¶
The reference videos park_joy_* are transformed back using the inverse color transformation and then, compared to the same reference park_joy. In view of the PSNR, the conversion can be considered lossless.
mendevi plot colorspace.db -x rate -y psnr -c eotf -m '(prim, range)' -f "'reference' in name"
Visualize transfer functions¶
import cutcutcodec
import matplotlib.pyplot as plt
import torch
from mendevi.cst.plot import COLORS, FIGSIZE
# get curves
l2v_names: dict = {}
for name, (l2v, _) in cutcutcodec.core.colorspace.cst.TRC.items():
l2v_names[l2v] = l2v_names.get(l2v, [])
l2v_names[l2v].append(name)
# matplotlib plot chart
fig = plt.figure(layout="constrained", figsize=FIGSIZE)
axe = fig.subplots()
axe.grid()
fig.supylabel("v")
fig.supxlabel("l")
# plot data
l = torch.linspace(0, 1, 1000)
for i, (l2v, names) in enumerate(l2v_names.items()):
axe.plot(l, cutcutcodec.Lambdify(l2v)(l), label=min(names), color=COLORS[i])
axe.legend()
plt.savefig("transfer.svg", format="svg")
plt.show()
Reproduce¶
for prim in bt601 bt709 bt2020
do
for trans in linear bt709 gamma22 gamma28 smpte170m smpte2084
do
mendevi prepare park_joy.mkv -p fhd --primaries $prim --transfer $trans --range tv
mendevi prepare park_joy.mkv -p fhd --primaries $prim --transfer $trans --range pc
done
done
mendevi encode -c libx264 -c libsvtav1 reference*
mendevi probe --ref reference_park_joy_fhd.mp4 reference* sample*