在例程中打开由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])';