Задание №4

Добавить предикторы и квантование.

Предикторы

Обычно в изображении соседние пиксели отличаются несильно. Чтобы воспользоваться этим для увеличения сжатия используются предикторы. Предиктор позволяет “предсказать” значение данного пикселя по его контексту. Чем точнее предсказание, тем лучше, потому что запоминается ошибка предсказания, т.е. разность данного пикселя и предсказанного значения. Если предсказания хорошие, то разности будут маленькими, что приведет к сильно неравномерному их распределению (пик около нуля). Энтропия у такого распределения будет меньше, чем у исходного изображения.

Четыре пикселя изображения:

c b
a x

x – пиксель, который нужно предсказать, a – пиксель слева от x, b – пиксель справа от x, c – слева сверху от x. Таким образом (a, b, c) – контекст пикселя x.

Предсказания для значения x можно сделать любые, основываясь на значениях a, b, c, т.е. предсказание – это некоторая функция от a, b и c. Для исходного и измененного изображения нужно вывести энтропию ошибки предсказания и коэффициент сжатия после использования следующих предикторов:

По желанию можно добавить свои предикторы (P5, P6 и т.д). Энтропия по ошибкам предсказания должна выводиться рядом с энтропией канала.

Квантование

Квантование используется совместно с предикторами. В данном случае квантование заключается в том, что ошибка предсказания делится на некоторое фиксированное целое число \(Q\) и запоминается результат. Деление целочисленное.

Пусть используется предсказание по предыдущему пикселю, тогда ошибка предсказания: \(e = x-a\). Запоминать нужно не \(e\), а \(e' = e/Q\). После этого значение пикселя \(x\) заменяется на \(x' = e'Q + a\), которое используется для дальнейших предсказаний (в данном случае пикселя, который стоит справа от x). Это сделано для того, чтобы из проквантованных значений ошибки предсказания получить обратно изображение.

Рассмотрим числовой пример. Дана последовательность чисел:

\[125, 140, 142, 139, 170, 149, 200.\]

Предсказание без квантования (или \(Q = 1\)):

\[125, 15, 2, -3, 31, -21, 51.\]

Здесь первое число без изменений, а остальные – это разности с предыдущим. Пусть теперь \(Q = 3\). Тогда получим следующую последовательность:

\[125, 5, 0, -1, 10, -7, 17,\]

которая будет декодирована в

\[125, 140, 140, 139, 169, 149, 200.\]

Ввиду квантования, получившаяся последовательность отличается от исходной, но абсолютная ошибка строго меньше \(Q\).

Величину квантования можно задавать в интерфейсе. На данном этапе сглаживание, которое было сделано в предыдущем задании можно убрать – теперь измененное изображение является проквантованным (можно использовать любой предиктор).