2010-04-27 4 views
2

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

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

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

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

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

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

+0

Я начинаю думать, что я должен попробовать простой механизм сжатия, такой как RLE для всех трех изображений. – michael

ответ

1

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

Я нахожу, что ВЫСОКО маловероятно, что вы сможете напрямую работать с файлами jpeg. В сжатых файлах небольшое изменение распространяется на большую часть файла, что приводит к тому, что два файла не могут сравниться во многих местах.

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

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

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

+0

Именно то, что я думал по всем трем пунктам (распространение небольших изменений через сжатый файл и два решения). Я собираюсь попробовать пример один (Do zip-программы используют преимущества поперечного файла при смене нескольких файлов?). И если он достаточно хорош (dunno, что это еще значит), то что я буду делать, в противном случае я попробую декодировать/перекодировать (если я могу сжать операцию в 10K RAM: P) – michael

+1

Вам нужно хорошее понимание сжатия JPEG, но можно работать с частично распакованными изображениями. JPEG выполняет кодирование с потерей DCT на каждом блоке 16x16 пикселей, а затем без потерь RLE-кодирование, за которым следует кодировка Хаффмана.Вы можете в некоторой степени манипулировать закодированными данными с потерями, но вам нужно отменить/переделать «без потерь» части алгоритма. – Roddy

0

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

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

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

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

+0

Если это jpeg, это уже потеряно, не так ли? –

+0

hmm, оба huffyuv и lagarith без потерь (слишком большие) и требуют, чтобы я расшифровывал файлы jpeg. – michael

0

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

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

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

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

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

+0

Я предположил, что это что-то вроде неподвижной камеры безопасности, и изображения должны быть сжаты для восходящей линии GSM или какого-то дорогого механизма передачи ... Может, я ошибаюсь? – Roddy

+0

Я согласен с тем, что на снимках будет какая-то вариация, несмотря ни на что. поэтому файлы jpeg будут иметь несколько разные размеры, а это означает, что удаление прямой дельта файлов отключено (если я не реализую функцию delta calc func, которая может принимать массивы переменных размеров). Я надеялся, что у кого-то есть предложение воспользоваться преимуществами избыточности на снимках, а не предоставить решение, которое потребовало бы возврата изображений обратно к необработанному BMP, а затем повторного сжатия с чем-то другим. – michael

+0

Ya ссылка дорога (в основном в основном). Но стоимость мощности для вождения встроенной системы относительно мала по сравнению с мощностью передачи, используемой радио. – michael

1

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

Я не могу придумать простой способ, которым вы можете это сделать в частотной области JPEG, но вы можете распаковать затем SUBTRACT images 2 and 3 from image 1 to get delta images. Они должны сжиматься намного лучше и будут добавлены обратно к изображению # 1 приемником.

Получается, что some operations you can do in the compressed domain может помочь. Вам нужно разжать ступени Huffman/RLE в jpeg, а затем напрямую работать с коэффициентами DCT. Таким образом, вы можете уметь делать вычитание изображения, и оно не должно вводить дополнительные артефакты.

+0

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

+0

@michael, да, понял. См. Дополнительную ссылку, которую я добавил к ответу ... – Roddy

+0

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