Tiff: алгоритм декодирования PackBits - PullRequest
0 голосов
/ 05 марта 2019

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

Имея небольшой опыт в реальной информатике, у меня возникают проблемы с пониманием руководящих принципов в документации TIFF, а именно:

В обратной процедуре лучше всего кодировать 2-повтор байтового запуска как повторный запуск, за исключением случаев, когда перед ним идет и после него идет буквальный запуск.В этом случае лучше всего объединить три цикла в один буквальный цикл.Всегда кодируйте 3-байтовые повторы как повторы.Это суть алгоритма.Вот некоторые дополнительные правила:

• Упакуйте каждый ряд отдельно.Не сжимать через границы строк.

• Количество несжатых байтов в строке определяется как (ImageWidth + 7) / 8. Если требуется, чтобы несжатый битовый массив имел четное количество байтов в строке, распакуйте его.в выровненные слова буфера.

• Если длина цикла превышает 128 байтов, закодируйте оставшуюся часть цикла как один или несколько дополнительных повторяющихся циклов.

источник: https://www.fileformat.info/format/tiff/corion-packbits.htm

Я понимаю, как реализовать псевдокод и декодировать образец строки, сжатой с помощью PackBits в Matlab.Тем не менее, я потерялся при разборе 16-битного файла Tiff в оттенках серого.Мой вопрос: как мне это сделать?Я не совсем понимаю, что это означает в репликации , а также что такое буфер с выравниванием по словам .Когда я начинаю декодировать форму данных с первого байта, я просто получаю ерунду.

Будет полезна помощь в понимании логики декомпрессии, также будет полезна ссылка на распаковку кода Tiff PackBits.

~ Jakub

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

Tiff_file = 'compressed.tiff';
%open and read tiff file file
imInfo = imfinfo(Tiff_file);
fId = fopen(Tiff_file);
im = fread(fId);
fclose(fId);

%parse the file
output = zeros(1,imInfo.Width * imInfo.Height * 2);%preallocate
thisLoc = 1;
for strip = 1:length(imInfo.StripOffsets)
    thisLength = imInfo.StripByteCounts(strip);
    thisOffset = imInfo.StripOffsets(strip);
    thisStrip = im(thisOffset + 1 : thisOffset + thisLength);
    pntr = 1; %start at the first byte
    %loop throught the coded data
    while pntr <  thisLength
        key = thisStrip(pntr);
        if key >= 129
            key = 257 - key;
            datTmp = repmat(thisStrip(pntr+1), [1 key]);
            output(thisLoc:thisLoc+key-1) = datTmp;
            thisLoc = thisLoc+key;
            pntr = pntr + 2;
        elseif key == 128 %nope
            pntr = pntr + 1;
        else
            datTmp = thisStrip(pntr + 1 : pntr + 1 + key);
            output(thisLoc:thisLoc+key) = datTmp;
            thisLoc = thisLoc + key+1;
            pntr = pntr + key + 2;
        end
    end
end

im = typecast(uint8(output),'uint16');
%reshape decoded data.
im = reshape(im,[imInfo.Width imInfo.Height])';
...