Могут ли два (или более) jpeg2000 быть объединены в один больший без декодирования их в растровое изображение?

У меня есть четыре файла .j2k (без потерь) известного идентичного размера, и я хочу объединить их в один больший файл .j2k. Теперь, конечно, простой и рабочий способ состоит в том, чтобы распаковать их в растровое изображение и сжать большее растровое изображение в файл .j2k, но это требует больших затрат производительности. Есть ли более простой способ? И если да, можете ли вы выделить его псевдокодом?

ОБНОВИТЬ

Основываясь на предложении @malat, я попробовал следующее (см. мой репозиторий Github для полных источников и примеров изображений):

// for the simplicity I'm using same image to make 4 tiles 2x2
jpeg.header.Xsiz *= 2;
jpeg.header.Ysiz *= 2;
vector<j2k_tile_part> tiles = jpeg.tiles;

BOOST_FOREACH(j2k_tile_part& part, jpeg.tiles)
{
part.Isot = 2;
}

for (int i = 0; i < 3; i++)
{
BOOST_FOREACH(const j2k_tile_part& part, tiles)
{
j2k_tile_part clone(part);
switch(i)
{
case 0:
clone.Isot = 3;
break;
case 1:
clone.Isot = 0;
break;
case 2:
clone.Isot = 1;
break;
}
jpeg.tiles.push_back(clone);
}
}

jpeg.save_file(output_file);

Что работает (с точки зрения изображения, имеющего правильный размер и заполненного данными изображения). Это выглядит нормально только для первой плитки, но другие плитки облажались. Я хотя плитки закодированы отдельно — я не прав? Я также попытался скопировать маркеры COD и QCC из основного заголовка в заголовок плитки — но это тоже не помогло.

Комбинированное изображение

2

Решение

Вот как бы я это сделал. Просто начни это задом наперед. Давайте предположим, что ваше целевое изображение имеет размер 512×512, а каждая из 4-х плиток (вход J2K) имеет размер 256×256. В этом случае давайте создадим поддельный (но действительный) эквивалент файла JP2:

$ wget http://www.ece.rice.edu/~wakin/images/lena512color.tiff
$ kdu_compress -i lena512color.tif -o out.jp2 Stiles="{256,256}"  Clevels:T0C1=0  Cuse_sop:T3=yes  Cycc:T2=no

Не слишком переживай Clevels:T0C1=0 Cuse_sop:T3=yes Cycc:T2=noони полезны только для того, чтобы убедиться, что COC а также QCC производятся после COD а также QCD из основного заголовка.

Теперь, когда у вас есть действительный контейнер JP2 (формат), вам просто нужно заменить каждый отдельный фрагмент (действительный кодовый поток J2K) своим (их должно быть 4).

Еще одна важная вещь, чтобы проверить, что все кодовые потоки имеют SOT length, Помните, что допустимо, чтобы длина SOT равнялась нулю (неопределенная длина) только для самой последней плитки.

Если вы хотите пойти дальше, вам необходимо убедиться, что:

  • Попробуй повторно QCD а также COD если ваше изображение имеет идентичные параметры (я предположил, что они несколько отличались)
  • добавлять TLM маркеры
0

Другие решения


По вопросам рекламы [email protected]