Является ли перекодирование изображений JPEG идемпотентной операцией?
Я знаю, что сжатие JPEG с потерями. У меня есть 2 вопроса:
Дана операция Т:
1. Возьмите изображение JPEG-80
2. Расшифруйте его в байтовый буфер
3. Кодировать заданный байтовый буфер как JPEG-80.
Является ли T идемпотентной операцией с точки зрения визуального качества? Или качество изображения будет ухудшаться, когда я повторяю T? То же самое относится и к кодеку JPEG-XR?
Спасибо!
Изменить: Поскольку были противоречивые ответы, было бы здорово, если бы вы могли предоставить ссылки!
2 ответа
Это не гарантировано, но это может случиться. Особенно, если вы будете повторять процесс кодирования -> декодирования -> кодирования -> декодирования достаточно много раз, он в конечном итоге остановится на фиксированной точке и больше не будет терять качество (при условии, что вы придерживаетесь того же качества и того же кодера).
Кодирование JPEG выполняется в несколько этапов:
- Преобразование RGB в YUV
- DCT (изменение в частотную область)
- Квантование (отбрасывание битов DCT)
- Сжатие без потерь
И декодирование это тот же процесс в обратном направлении.
Шаги 1 и 2 имеют ошибки округления (особенно в оптимизированных по скорости кодировщиках, использующих целочисленную математику), поэтому для идемпотентного перекодирования вам нужно быть удачным, чтобы ошибки кодирования и декодирования были небольшими или взаимно компенсировать друг друга.
Шаг 3, который является основным шагом с потерями, фактически идемпотентен. Если ваши декодированные пиксели преобразуются в достаточно схожий DCT, он снова будет квантоваться с теми же данными!
JPEG XR также использует YUV, поэтому он может испытывать некоторые ошибки округления, но OTOH вместо DCT использует другое преобразование, которое может быть вычислено без ошибок округления, поэтому в JPEG-XR обхода должно быть проще, чем в других форматах.
Если вы используете один и тот же механизм сжатия JPG с теми же настройками, он обычно будет идемпотентным. Я не знаю, гарантировано ли это, но я думаю, что большинство реализаций позаботятся об этом. Я точно знаю, что реализации со средой исполнения Java оказываются идемпотентными.
По определению операция с потерями отбрасывает данные, упрощая представление таким образом, что (в идеале) не заметно для конечного пользователя. Однако у кодера нет волшебного метода для определения того, какие пиксели важны, а какие нет, поэтому он кодирует все пиксели одинаково, даже если они являются артефактами!
Другими словами, кодер будет обрабатывать сжато с потерями изображение так же, как изображение без потерь. Изображение с потерями будет дополнительно упрощено, исключая дополнительные данные в процессе, потому что для всех кодировщиков известно, что пользователь намеревается представить артефакты.
Вот несколько примеров потери генерации JPEG: