MATLAB从32位tiff堆栈加载和保存单个图像

时间:2015-06-25 14:33:46

标签: matlab stack frame tiff

我正在使用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 {:});

谢谢!

1 个答案:

答案 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

希望有所帮助。