Простой, но эффективный способ сохранить серию небольших изменений в изображении? - PullRequest
1 голос
/ 31 марта 2010

У меня есть серия изображений. Каждый из них, как правило (но не всегда), похож на предыдущий, с обновленными 3 или 4 маленькими прямоугольными областями. Мне нужно записать эти изменения, используя минимум дискового пространства.

Исходные изображения не сжаты, но я бы хотел, чтобы дельты были сжаты.

Мне нужно иметь возможность воссоздать изображения точно в качестве входных данных (поэтому видеокодек с потерями не подходит.)

Я думаю о чем-то вроде:

  • Составьте новое изображение с негативом старого изображения
  • Сохранить составное изображение в любом общем формате, который можно сжать с помощью RLE (возможно, PNG.)
  • Повторное создание второго изображения путем наложения предыдущего изображения с дельтой.

Хотя изображения имеют альфа-канал, я могу игнорировать его для целей этой функции.

Существует ли простой в реализации алгоритм или бесплатная библиотека Java с такой возможностью?

Ответы [ 3 ]

1 голос
/ 31 марта 2010

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

1 голос
/ 31 марта 2010

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

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

0 0 0 1 1 1 2 2 3 3
0 0 1 1 0 0 1 1 2 2
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 0 0 1 1 1 1 1 0 2
2 2 2 2 2 1 1 2 2 2

... и ...

0 0 0 1 1 1 2 2 3 3
0 1 1 1 0 0 1 1 2 2
0 1 2 4 0 0 0 1 1 2
0 1 2 3 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 3 3 2 1 2
0 0 1 1 0 3 3 2 1 2
0 0 0 1 1 2 2 2 0 2
2 2 2 2 2 1 1 2 2 2

Сначала вы придете к маске, в которой пиксели, строки, строки и столбцы имеют различия ...

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 1 0 0 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
0   0 0 0 0 0 0 0 0 0 0

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

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0

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

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

0 голосов
/ 31 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...