Tiff:解码PackBits的算法

时间:2019-03-04 22:29:17

标签: image-processing compression tiff

在例程中打开由Matlab显微镜软件生成的TIFF文件时,我陷入了读取压缩图像的困境。在这一点上,我很荣幸能够了解如何以PackBits格式解码tiff数据。

由于缺乏实际计算机科学的经验,我很难理解TIFF文档中的准则,更具体地说:

  

在逆例程中,最好将2字节重复运行编码为   复制运行,除非在文字运行之前和之后。在   在这种情况下,最好将三个运行合并为一个文字运行。   复制运行时,始终对3字节重复进行编码。那是本质   算法。以下是一些其他规则:

     

•打包每行   分别。不要跨行压缩。

     

•每行的未压缩字节数定义为(ImageWidth + 7)/8。如果要求未压缩的位图每行具有偶数字节,则将其解压缩为字对齐的缓冲区。

     

•如果运行大于128字节,则将运行的其余部分编码为一个或多个其他复制运行。

来源:https://www.fileformat.info/format/tiff/corion-packbits.htm

我了解如何实现伪代码,以及如何在Matlab中解码使用PackBits压缩的示例字符串。但是,我在解析16位灰度Tiff文件的过程中迷路了。我的问题是我该怎么做?我不太了解复制运行的含义,也不是什么字对齐缓冲区。 当我开始解码第一个字节的数据形式时,我只是胡说八道。

我们将帮助您了解解压缩的逻辑,此外,指向Tiff PackBits解压缩代码的链接也将很有帮助。

〜雅库布

编辑:我使用了解压缩算法,但我的错误是错误地解释了字节,这是一个代码,如果将来有人会对类似的问题感兴趣的话。

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])';

0 个答案:

没有答案