Сжатие трех отдельных изображений в формате JPEG, содержащих временную избыточность?

Я связываю встроенное устройство с модулем камеры, который возвращает один сжатый кадр jpeg каждый раз, когда я его запускаю.

Я хотел бы сделать три последовательных снимка (примерно 1 кадр в 1/4 секунды) и дополнительно сжать изображения в один файл. Здесь предполагается, что существует большая временная избыточность, поэтому есть много места для большего сжатия трех кадров (по сравнению с отправкой трех отдельных изображений jpeg).

Я буду реализовывать решение на встроенном устройстве на C без каких-либо библиотек и ОС.

Камера будет делать снимки в области с очень небольшим движением (нет посетителей или экранов на заднем плане, может быть, дерево с качающимися ветвями), поэтому я думаю, что мое предположение об избыточности довольно твердое.

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

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


person michael    schedule 27.04.2010    source источник
comment
Я начинаю думать, что мне следует попробовать простой механизм сжатия, такой как RLE, для всех трех изображений.   -  person michael    schedule 28.04.2010


Ответы (4)


Я добавляю это как второй ответ, потому что теперь, когда я лучше понимаю вашу проблему, он ОЧЕНЬ отличается от моего первого.

Я считаю КРАЙНЕ маловероятным, что вы сможете напрямую работать с файлами jpeg. В сжатых файлах небольшое изменение имеет тенденцию распространяться на большую часть файла, в результате чего два файла не могут сравниваться во многих местах.

У меня есть два предложения.

1: заархивируйте изображения. Кажется слишком простым, вы, вероятно, уже думали об этом, но протокол zip хорошо известен и находится в свободном доступе, и он автоматически использует все возможные сходства. Снова просто возьмите камеру и сделайте три снимка; застегните их и посмотрите, как пойдет.

2: немного сложнее, но вы можете распаковать три jpeg в bmp, объединить bmp (выстроить их один за другим), а затем повторно сжать в jpeg. Протокол jpeg должен в полной мере использовать сходство трех изображений, и с вашей точки зрения работа будет минимальной.

person Bill K    schedule 27.04.2010
comment
Именно то, о чем я думал по всем трем пунктам (распространение небольших изменений через сжатый файл и два решения). Я собираюсь попробовать первый пример (используют ли программы zip преимущества сходства между файлами при сжатии нескольких файлов?). И если это достаточно хорошо (пока не знаю, что это значит), это то, что я сделаю, в противном случае я попробую декодирование / перекодирование (если я смогу втиснуть операцию в 10 КБ ОЗУ: P) - person michael; 28.04.2010
comment
Вам нужно хорошо понимать сжатие JPEG, но можно работать и с частично распакованными изображениями. JPEG выполняет DCT-кодирование с потерями для каждого блока 16x16 пикселей, затем RLE-кодирование без потерь с последующим кодированием результата методом Хаффмана. Вы можете в некоторой степени манипулировать данными, закодированными с потерями, но вам нужно отменить/повторить части алгоритма «без потерь». - person Roddy; 28.04.2010

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

Я не могу придумать простого способа сделать это в частотной области JPEG, но тогда вы можете распаковать Вычтите изображения 2 и 3 из изображения 1, чтобы получить дельта-изображения. Они должны сжиматься намного лучше и будут добавлены получателем обратно к изображению №1.

Оказывается, есть некоторые операции, которые вы можете выполнять в сжатом домене, которые может помочь. Вам нужно будет распаковать этапы Хаффмана / RLE в формате jpeg, а затем напрямую работать с коэффициентами DCT. Вы вполне можете выполнять вычитание изображений таким образом, и это не должно приводить к дополнительным артефактам.

person Roddy    schedule 27.04.2010
comment
Вероятно, лучше всего взять самое большое из трех изображений в качестве ключевого кадра и дельта двух других от него... - person michael; 28.04.2010
comment
Возможно, экономия места при хранении связанных изображений в виде дельт будет компенсирована повышенной видимостью шумовых артефактов в рекомбинированных изображениях. Это может быть связано с тем, что алгоритмы сжатия JPEG обычно оценивают шум с помощью мер восприятия (в отличие от простого числового отклонения), поэтому шум, вносимый в дельты, будет бросать вызов моделям восприятия при рекомбинации. Узоры, которые могут быть почти незаметны в серой дельте, могут выделяться при добавлении к цветам в базовом изображении. Также необходимо половину дельта-контрастности, чтобы справиться с возможными переливами, увеличивая мощность артефактов. - person strainer; 28.04.2010

Хотя я не изучал сигналы со времен университета, я думаю, что вы ищете видеокодек без потерь.

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

Lagarith — еще один кодек с открытым исходным кодом.

Вам нужно будет передать декодированные кадры JPEG в каждый из этих кодеков.

person Jeff Meatball Yang    schedule 27.04.2010
comment
хм, и huffyuv, и lagarith без потерь (слишком большие) и требуют от меня декодирования файлов jpeg. - person michael; 28.04.2010

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

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

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

Я не говорю, что это не сработает, просто я сначала запустил вручную.

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

person Bill K    schedule 27.04.2010
comment
Я предположил, что это что-то вроде стационарной камеры слежения, и изображения должны быть сжаты для восходящей линии связи GSM или какого-то дорогостоящего механизма передачи... Может быть, я ошибаюсь? - person Roddy; 28.04.2010
comment
Я согласен, что в любом случае будут некоторые различия в изображениях. поэтому файлы jpeg будут иметь немного разные размеры, что означает, что выполнение прямой дельты файлов отключено (если я не реализую некоторую функцию вычисления дельты, которая может принимать массивы переменных размеров). Я надеялся, что у кого-то есть предложение по использованию избыточности изображений, а не предоставление решения, которое требует возврата изображений обратно в необработанный bmp, а затем повторного сжатия с чем-то другим. - person michael; 28.04.2010
comment
Я. ссылка дорогая (по мощности в основном). Но стоимость мощности для управления встроенной системой относительно невелика по сравнению с мощностью передачи, используемой радио. - person michael; 28.04.2010