我正在使用MATLAB_R2011a_student。我有一些图像堆栈保存为32位tiffs,一些超过1000帧。我希望能够从堆栈中拉出一个特定的帧并将其保存为32位tiff或一些可读格式,其中原始数据不会丢失。目前我的代码如下所示:
clear, clc;
k=163;
image=('/Users/me/Filename.tiff');
A = uint8(imread(image, k));
B=A(:,:,1);
J=imadjust(B,stretchlim(B),[]);
imwrite(J,'/Users/me/163.tif','tif');
(我假设把它读成8位,我保存的方式不是最好的方法) 无论哪种方式,此代码适用于看似随机数量的帧(例如,在一个文件中。上述代码适用于帧1-165但165之后没有帧,对于不同的文件。当代码适用于帧1- 8但是8)之后的所有帧都没有。当这确实有效时,我在输出图像中也得到一条奇怪的水平线:
???使用==>时出错rtifc 指定的TIFF图像索引无效。
==>中的错误52岁的读书 [X,map,details] = rtifc(args);
==>中的错误imread at 443 [X,map] = feval(fmt_s.read,filename,extraArgs {:});
谢谢!
答案 0 :(得分:0)
处理tiff堆栈的最佳方式(在我看来)是使用几年后可用的Tiff library。我必须承认,我对OOP了解不多,但我设法理解足够加载tiff堆栈并操纵它。这就是我希望一年前见过的那种简单的演示哈哈。 / p>
我在下面的示例中加载单个堆栈并将其全部存储到3D数组中。我使用imfinfo
来获取有关图像的信息,特别是图像/堆栈的数量和实际的图像尺寸。如果需要,您可以选择使用适当的索引仅加载一个图像。请尝试以下代码并使用它;你了解我的意思。
clear
clc
%// Get tiff files you wish to open
hFiles = dir('*.tif');
%// Here I only have 1 multi-tiff file containing 30 images. Hence hInfo is a 30x1 structure.
hInfo = imfinfo(hFiles(1).name);
%// Set parameters.
ImageHeight = hInfo(1).Height;
ImageWidth = hInfo(1).Width;
SliceNumber = numel(hInfo);
%// Open Tiff object
Stack_TiffObject = Tiff(hFiles.name,'r');
%// Initialize array containing your images.
ImageMatrix = zeros(ImageHeight,ImageWidth,SliceNumber,'uint32');
for k = 1:SliceNumber
%// Loop through each image
Stack_TiffObject.setDirectory(k)
%// Put it in the array
ImageMatrix(:,:,k) = Stack_TiffObject.read();
end
%// Close the Tiff object
Stack_TiffObject.close
希望有所帮助。