Сжатие трех отдельных JPEG-изображений, содержащих временную избыточность? - PullRequest
2 голосов
/ 28 апреля 2010

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

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 28 апреля 2010

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

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

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

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

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

1 голос
/ 28 апреля 2010

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

Я не могу придумать простой способ сделать это в частотной области JPEG, но вы можете затем распаковать СУБТРАКТНЫЕ изображения 2 и 3 из изображения 1, чтобы получить дельта изображения . Они должны сжиматься намного лучше и будут добавлены получателем к изображению # 1.

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

0 голосов
/ 28 апреля 2010

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

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

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

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

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

0 голосов
/ 28 апреля 2010

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

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

Lagarith - другой кодек с открытым исходным кодом.

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

...