2013-02-12 3 views
6

Я знаю, что сжатие JPEG является потерянным. У меня 2 вопроса:Перекодирует изображения JPEG в идемпотентную операцию?

Учитывая операцию Т:
1. Возьмите JPEG-80 изображение
2. Decode его в буфер байт
3. Encode данный байт буфер, как JPEG-80

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

Спасибо!

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

+0

Я не знаю точно, но я не стал бы рассчитывать на это. Особенно между разными двигателями. Даже при использовании одного двигателя приближения, которые могут иметь место, могут не приводить к тому же региону при применении дважды. –

+1

Я бы сказал, нет. После каждого кодирования в jpeg будет больше «потеря». – leppie

ответ

1

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

+0

Я использую WIC API: http://msdn.microsoft.com/en-us/library/windows/desktop/gg430027(v=vs.85).aspx – Sau

+0

Я предполагаю, что Дэйв пытался перекодировать изображение JPEG без сначала преобразуя его в растровое изображение, поэтому это доказательство не очень убедительно. Я не знаком ни с одним из API, но я подозреваю, что реализация Java-кодировщика Java, которую использовал Дэйв, вероятно, достаточно «умна», чтобы * не * перекодировать изображение в формате JPEG, если он помнит кодировку ранее. В конце концов, перекодирование JPEG обычно не является желательным, поэтому было бы разумно, чтобы API был терпимым к потенциально распространенному неправильному использованию функции, хотя, вероятно, он должен был бы предупредить о том, что происходит, что происходит «под капотом» «. – StockB

2

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

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

Вот некоторые примеры потери поколения 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

+3

Это не так просто. JPEG не всегда отбрасывает информацию, она квантует ее. Если входные данные будут соответствовать точно квантованным данным, это не изменится вообще. Это несколько похоже на уменьшение количества цветов на изображении - если входное изображение уже имеет несколько цветов, то оно не изменится (кроме того, что JPEG работает на частотах DCT, а не на цветах). – Kornel

+0

Это объясняет, почему пример Википедии повернул изображение на 90º. Вы должны поместить это в ответ или отредактировать мой. – StockB

1

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

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

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

И декодирование - это тот же процесс назад.

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^