LINUX.ORG.RU

Ликбез по неразрушающему редактированию при сжатии с потерями

 , , , ,


0

1

Если формат сжимает с потерями, значит при каждом изменении и сохранении всё будет пережиматься, размываться, будут теряться детали, добавляться артефакты… Но я знаю, что есть исключения. Например, JPEG можно поворачивать на 90 градусов и зеркалить. Вообще JPEG состоит из независимых блоков 8х8 или 16х16, любой из которых можно менять или удалять, не затрагивая остальные. Видео и звук можно обрезать по ключевым фреймам — при склейке первый кадр после шва должен быть ключевым, хвост вообще можно обрезать где угодно. А что ещё?

Можно ли преобразовать JPEG в какой-то из новых форматов без перекодирования? Помимо JPEG XL.

Можно ли конвертировать друг в друга без перекодирования какие-либо из форматов, использующих вейвлетное сжатие: DjVu, JPEG2000, WebP и т.п.?

Можно ли обрезать у видео края кадров без перекодирования? Например, убрать пустое чёрное пространство, добавленное к горизонтальному видео, чтобы сделать его вертикальным.

Перемещено hobbit из talks

★★★★★

Если формат сжимает с потерями, значит при каждом изменении и сохранении всё будет пережиматься, размываться, будут теряться детали, добавляться артефакты…

Нет, если формат сохранит нетронутую область тем же способом, что и раньше.

PPP328 ★★★★★
()
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от PPP328

Нет, если формат сохранит нетронутую область тем же способом, что и раньше.

Вот про такие случаи я и спрашиваю. Когда и как это возможно? JPEG разбивает картинку на независимые области, а остальные как? И что совместимо с JPEG-ом?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

JPEG разбивает картинку на независимые области,

Эээ, нет. Жпег еще портит цвета по всей картинке на этапе ресемплинга. Так что любое пересохранение (даже с теми же параметрами), если мы поменяли что-то в другом месте, будет портить всю картинку.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Жпег еще портит цвета по всей картинке на этапе ресемплинга.

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

Или я что-то не понял?

question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

Или я что-то не понял?

Только в том случае, если утилита явно поддерживает «неломающие» преобразования для жпега (не все это умеют). Если она не будет перерасчитывать ресемплинг, будет оперировать только в контексте блоков 8х8, то тогда с ними возможно проводить преобразование, такие как вращение конкретного блока, его замена или обрезка.

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

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Иными словами, потери происходят при преобразовании RGB -> YCbCr -> RGB. С точки зрения математики операция обратимая. Но не с точки зрения компьютера, у которого

  1. Числа ограничены в точности
  2. Бо’льшая часть чисел и вовсе неотобразима в бинарном виде (тот же 0.3)

Еще более понятно:

  1. Редактор открывает жпег, он в YCbCr.
  2. У редактора есть канва и монитор с цветовым полем RGB
  3. Редактор преобразует YCbCr в RGB с потерями и рисует на канве.
  4. Если на данном этапе редактор выкинул информацию о всех первоначальных значениях цветов пикселей, то обратно вы его уже не сохраните
  5. При экспорте в JPEG происходит преобразование RGB->YCbCr c потерями.
PPP328 ★★★★★
()
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от PPP328

Только в том случае, если утилита явно поддерживает «неломающие» преобразования для жпега

Естественно. Я это делал неоднократно. В основном, в IrfanView, пару раз jpegtran.

Я спрашиваю: для каких ещё форматов возможно то же?

Редактор преобразует YCbCr в RGB с потерями и рисует на канве.

Насколько я помню, тот же Gimp уже освоил YCbCr.

Но, как мне кажется, самые большие потери при редактировании JPEG-ов происходят при DCT туда-сюда. Поэтому, чтобы не вносить искажений, нужно не преобразовывать эти члены ряда Фурье, а пользоваться имеющимися. Как я понял, именно так перепаковывает JPEGи jpegtran, таким образом можно преобразовывать в JPEG XL. А что с другими перечисленными форматами?

question4 ★★★★★
() автор топика

Можно ли преобразовать JPEG в какой-то из новых форматов без перекодирования?

Гениальный вопрос. Либо ты не знаешь что такое формат, либо не знаешь что такое перекодирование

Можно ли обрезать у видео края кадров без перекодирования?

Нет, поучи матчасть

neocrust ★★★★★
()
Последнее исправление: neocrust (всего исправлений: 1)

Но я знаю, что есть исключения. Например, JPEG можно поворачивать на 90 градусов и зеркалить.

Я правильно тебя понял, что если выполнить magick xyz.jpg rotate 90 xyz.jpg (пусть даже миллион раз), новых артефактов не появится?

jsx
()
Ответ на: комментарий от jsx

Я правильно тебя понял, что если выполнить magick xyz.jpg rotate 90 xyz.jpg (пусть даже миллион раз), новых артефактов не появится?

Неправильно.

Про ImageMagick я не говорил. Возможно, такая фича в нём когда-нибудь появится и даже будет применяется автоматически, но в мануале я такого не нашёл.

На форуме ImageMagick утверждают, что он так не умеет, и советуют jpegtran, который я упоминал выше (у меня в пакете libjpeg-turbo). Команды -flip horizontal, -flip vertical, -rotate 90, -rotate 180, -rotate 270, -transpose, -transverse.

question4 ★★★★★
() автор топика
Ответ на: комментарий от neocrust

Можно ли преобразовать JPEG в какой-то из новых форматов без перекодирования?

Гениальный вопрос. Либо ты не знаешь что такое формат, либо не знаешь что такое перекодирование

Я называл «перекодированием» несколько разных вещей, чтобы не забираться глубоко в дебри. Был неправ.

Насколько я помню, JPEG преобразует изображение в цветовое пространство YCbCr, проводит дельта-кодирование, разбивает на независимые квадраты, в каждом квадрате раскладывает в 2-мерный ряд Фурье, отбрасывая часть членов, результат сжимает алгоритмом Хаффмана, реже арифметическим. Потери — от Фурье с отбрасыванием и преобразований YCbCr ↔ RGB.

При преобразовании в другой формат можно взять готовые результаты Фурье, можно из них получить YCbCr, а можно вернуться в RGB и сжимать его. Последнее может обеспечить лучшее сжатие, но и максимум артефактов тоже.

Соответственно, вопрос правильнее было бы сформулировать: «В какие форматы можно конвертировать JPEG, избежав эти преобразования, или хотя бы одно?» Знаю, что JPEG XL может избежать обоих.

Про DjVu, WebP, JPEG2000 я встречал упоминания, что они используют те же идеи, но вместо ряда по косинусам используют другие функции. Одинаковые ли функции в этих форматах? Или может в каких-то из них предусмотрен легаси-вариант с косинусами?

Можно ли обрезать у видео края кадров без перекодирования?

Нет, поучи матчасть

Тогда почему при сильном сжатии видео оно покрывается квадратами?

question4 ★★★★★
() автор топика

библиотека ndi хвастается тем, что у них сжатие одноразовое. Т.е. все последующие разжатия и сжатия не поменяют ни единого байта в картинке.

Возможно это подходит для промежуточного редактирования

max_lapshin ★★★★★
()

Можно ли обрезать у видео края кадров без перекодирования? Например, убрать пустое чёрное пространство, добавленное к горизонтальному видео, чтобы сделать его вертикальным.

Можно. Полоски там всё ещё будут закодированы, но в метаданных будет указана правильная область, и большинство плееров будут показывать их так, будто полоски обрезаны.

CrX ★★★★★
()
Ответ на: комментарий от max_lapshin

библиотека ndi

Можно ссылку? Под этим названием много разных вещей. Это https://ndi.video/ ? Версия под Линукс есть?

у них сжатие одноразовое.

Сжатие в их собственный формат, или в какие-то из широко распространённых?

question4 ★★★★★
() автор топика
Ответ на: комментарий от CrX

Можно. Полоски там всё ещё будут закодированы, но в метаданных будет указана правильная область, и большинство плееров будут показывать их так, будто полоски обрезаны.

Спасибо, про такую возможность не вспомнил.

Но вопрос возник из-за видео, где сверху и снизу ролика крутился многоцветный и высокодетализованный логотип канала. Имхо, занимающий большую часть объёма файла. Поэтому захотелось иметь возможность такие вещи вырезать без вреда целевому изображению.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Да, это оно.

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

Есть одна ветка про опенсорс ndi и там упоминается про SpeedHQ

https://www.reddit.com/r/VIDEOENGINEERING/comments/hbifrh/open_source_ndi_library/

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

https://www.reddit.com/r/VIDEOENGINEERING/comments/hbifrh/open_source_ndi_library/

Спасибо. Там ссылка на код: https://code.videolan.org/jbk/libndi

Но там только чтение, и за 4 года никакого движения. Ни в ffmpeg, ни в vlc его нет.

SpeedHQ

Посмотрел по ключевому слову. Пишут, что SpeedHQ — вариант MPEG-2, и ndi использует его функции. Интересно.

question4 ★★★★★
() автор топика