Сжатие изображений JPEG
Я смотрю на проблему уменьшения места для хранения при хранении нескольких изображений JPEG вместе как одного большего изображения. Основная интуиция заключается в том, что изображения, как правило, имеют некоторое сходство (например, изображения, снятые в том же месте или в одно и то же время), и можем ли мы использовать это сходство для экономии места?
Общий поток: вход JPG
Изображения -> Каждое изображение преобразуется в RGB
Плитки изображений -> Реорганизовать похожие RGB
плитки вместе -> снова преобразовать в JPG
формат. Естественно, при извлечении изображений нам нужно будет повернуть процесс вспять.
Используя коэффициент постоянного тока компонента Y в качестве меры сходства для реорганизации тайлов, я получил ~8% экономии пространства для 10 изображений. Когда я делаю это для 100 изображений, экономия уменьшается до ~3%.
Как получить экономию после реорганизации тайлов - т.е. какая часть процесса кодирования JPEG использует преимущества этой реорганизации тайлов изображений?
Вместо коэффициента DC компонента Y есть другие метрики, о которых вы могли бы подумать, что они будут лучше использованы при кодировании JPEG
После доработки:
Есть ли какой-нибудь другой формат изображения помимо JPG, который может лучше использовать подобного рода сходство при объединении нескольких изображений? Например, PNG?
2 ответа
Скорее всего, вы используете JFIF для кодирования.
Я не уверен, как вы ожидаете, что этот метод будет работать. Если я правильно понимаю, вы разбиваете изображения на фрагменты, объединяя их в одно мегапиксельное изображение с "похожими" фрагментами, расположенными близко друг к другу.
AFAIK, реализации JPEG делают отдельный DCT для каждого фрагмента 8x8 в изображении, называемом макроблоком. Иными словами, JPEG не может использовать преимущества когерентности между соседними макроблоками (что, по-видимому, является основным допущением для вашей технологии сжатия).
Если ваши собственные плитки больше, чем макроблоки, вы не увидите никаких улучшений, кроме экономии в пространстве заголовка изображения.
Например: 10 заголовков изображений JPG, замененных на 1, обеспечат вам экономию пространства на 90%, но только в заголовке. Когда вы смотрите на файл в целом, заголовок - это небольшая часть всего файла, поэтому экономия места невелика. При замене 100 заголовков изображений на 1 вы экономите 99%, но опять же только на заголовке. В обоих случаях все макроблоки все еще кодируются и сохраняются точно так же, как и раньше.
Есть две области, где вы увидите преимущества:
Во-первых, когда вы размещаете похожие области рядом друг с другом (особенно, если края изображений идеально совпадают без разрыва - хотя это будет очень редко), часть DCT (частотное пространство) алгоритма jpeg работает путем постепенного приближения большого -области (не уверен, что это самый большой размер), затем посмотреть на погрешность между аппроксимацией большой области и нескольких меньших областей, и получить более корректировку локализации.
Я подозреваю, что этот эффект невелик, если только ваши изображения не очень похожи или не очень малы (так что их края длинные пропорционально их площади).
Во-вторых, часть кодирования Хаффмана сжатия jpeg будет иметь преимущество, потому что одни и те же битовые комбинации будут появляться в нескольких подизображениях и сжиматься с одним (коротким) токеном).
Этот аспект не будет зависеть от того, в каком порядке вы сжимаете изображения - если они находятся на одном изображении.