Комментарии 13
С чего бы это?!
А downsampling?!
И если вы не очень понимаете процесс, то «color space» — это все цвета, которые в этом пространстве присутствуют; если меняется пространство, то и меняется и состав хранимых цветов. Если наглядно, то для RGB цвета находятся внутри треугольника, а для YCbCr внутри полуэлипса — без потерь не получится одну фигуру вписать в другую.
То, что у вас написано в «Разделение слоёв» в самом JPEG уже реализовано: яркостная компонента (ч/б изображение) хранится в высоком разрешении, а уточняющая цветовая компонента (как правило) в более низком.
Что за полуэллипс — не очень понятно.
на практике — нет :-)
Если вы видели визуализацию всяких цветовых пространств sRGB, Adobe RGB и т.п., то там рисуют некоторый сложный цветовой градиент, а на нём треугольники этих цветовых пространств — потому что координат три, а это «срез» по одинаковой яркости. В YCrCb, первая — яркость, а все допустимые цвета на этой плоскости заданы расстоянием до двух «полюсов» — т.е. всё что лежит внутри пересечения двух окружностей. Да, полуэлипс тут не при чём. Но суть не меняется — это довольно разные по своей форме пространства и без существенных потерь данных/точности преобразования между ними невозможны.
Y = 0.299 * R + 0.587 * G + 0.114 * B + 0;
Cb = -0.169 * R - 0.331 * G + 0.500 * B + 128;
Cr = 0.500 * R - 0.419 * G - 0.081 * B + 128;
R = Y + 1.402 * (Cr - 128);
G = Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128);
B = Y + 1.772 * (Cb - 128);
Отрицательных значений при преобразованиях не образуется, погрешности малы.
А теперь посчитайте, во что переходят значения RGB (0, 0, 0) и (0, 0, 1) при переводе в YCbCr.
Я подскажу: если мы работаем исключительно с 8-битными целыми, то в обоих случаях будет (128, 0, 0) из-за округления.
Нет потерь только при расширении диапазона значений — существуют кодеры, которые работают с вещественными значениями и используют вещественные значения в матрице квантования. И они действительно дают чуть большее качество.
Вы верно написали:
Сам по себе переход между RGB и YCrCb взаимно-однозначен и обратим.
С точки зрения линейной алгебры, это простая смена базиса.
Но с практической точки зрения, есть нюанс. Значения компонент RGB могут изменяться в строго определённом диапазоне: пространство у нас не R^3, а [0, 255]^3 (или любой другой диапазон). Если взять точку M из этого кубика, то при переходе из RGB в YCrCb точка M останется внутри него. А вот обратное уже неверно. Взяв произвольную точку из YCrCb, можно вылезти за пределы допустимых значений RGB.
А учитывая, что в дальнейшем сжатие компонент Y, Cr и Cb идёт независимо, если повышенный риск получить недопустимые значения.
Если мы можем варьировать исходные пиксели… Мы не знаем, использует ли какой-нибудь софт такую технологию.
Пример такого варьирования — размытие (blur). Тот же Photoshop это умеет. Но, поскольку этапы цветоделения и DCT могут выполняться без потерь (вопреки предыдущим комментариям, это именно без потерь, т.к. точность даже float с запасом перекрывает точность кодирования исходного изображения), варьирование исходных пикселей математически эквивалентно варьированию неквантованных DCT-коэффициентов — мы сводим задачу к подбору матрицы квантования. К такому подбору, кстати, сводится и варьирование квантованных коэффициентов для улучшения сжатия.
Технология JPEG: анализ пространства решений