Является ли перекодирование изображений JPEG идемпотентной операцией?

Я знаю, что сжатие JPEG с потерями. У меня есть 2 вопроса:

Дана операция Т:
1. Возьмите изображение JPEG-80
2. Расшифруйте его в байтовый буфер
3. Кодировать заданный байтовый буфер как JPEG-80.

Является ли T идемпотентной операцией с точки зрения визуального качества? Или качество изображения будет ухудшаться, когда я повторяю T? То же самое относится и к кодеку JPEG-XR?

Спасибо!

Изменить: Поскольку были противоречивые ответы, было бы здорово, если бы вы могли предоставить ссылки!

2 ответа

Это не гарантировано, но это может случиться. Особенно, если вы будете повторять процесс кодирования -> декодирования -> кодирования -> декодирования достаточно много раз, он в конечном итоге остановится на фиксированной точке и больше не будет терять качество (при условии, что вы придерживаетесь того же качества и того же кодера).

Кодирование JPEG выполняется в несколько этапов:

  1. Преобразование RGB в YUV
  2. DCT (изменение в частотную область)
  3. Квантование (отбрасывание битов DCT)
  4. Сжатие без потерь

И декодирование это тот же процесс в обратном направлении.

Шаги 1 и 2 имеют ошибки округления (особенно в оптимизированных по скорости кодировщиках, использующих целочисленную математику), поэтому для идемпотентного перекодирования вам нужно быть удачным, чтобы ошибки кодирования и декодирования были небольшими или взаимно компенсировать друг друга.

Шаг 3, который является основным шагом с потерями, фактически идемпотентен. Если ваши декодированные пиксели преобразуются в достаточно схожий DCT, он снова будет квантоваться с теми же данными!

JPEG XR также использует YUV, поэтому он может испытывать некоторые ошибки округления, но OTOH вместо DCT использует другое преобразование, которое может быть вычислено без ошибок округления, поэтому в JPEG-XR обхода должно быть проще, чем в других форматах.

Если вы используете один и тот же механизм сжатия JPG с теми же настройками, он обычно будет идемпотентным. Я не знаю, гарантировано ли это, но я думаю, что большинство реализаций позаботятся об этом. Я точно знаю, что реализации со средой исполнения Java оказываются идемпотентными.

По определению операция с потерями отбрасывает данные, упрощая представление таким образом, что (в идеале) не заметно для конечного пользователя. Однако у кодера нет волшебного метода для определения того, какие пиксели важны, а какие нет, поэтому он кодирует все пиксели одинаково, даже если они являются артефактами!

Другими словами, кодер будет обрабатывать сжато с потерями изображение так же, как изображение без потерь. Изображение с потерями будет дополнительно упрощено, исключая дополнительные данные в процессе, потому что для всех кодировщиков известно, что пользователь намеревается представить артефакты.

Вот несколько примеров потери генерации JPEG:

http://vimeo.com/3750507

http://en.wikipedia.org/wiki/File:JPEG_Generarion_Loss_rotating_90_(stitch_of_0,100,200,500,900,2000_times).png

Другие вопросы по тегам