我使用的是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位,而我保存的方式不是最好的方法)无论哪种方式,这段代码都适用于似乎随机数量的帧(例如,在一个file.tiff中,上面的代码适用于帧1- 165,但165之后的帧都不起作用,对于不同的file.tiff,代码适用于帧1-8,但8之后的帧都不起作用)当它起作用时,我也会在输出图像中得到一条奇怪的水平线:
???使用TIFF时出错,指定的==>图像索引无效。
在52 X的==> readtif中出错,映射,详细信息=rtifc(参数);
在443X时输入错误,map = feval(fmt_s.read,==>,extraArgs{:});
谢谢!
发布于 2015-06-25 15:10:56
处理tiff堆栈的最好方法(在我看来)是使用几年来可用的Tiff library。我必须承认我对OOP不是很了解,但是我已经足够理解加载一个tiff堆栈并操纵它,这就是我希望一年前看到的那种简单的演示,哈哈。
在下面的例子中,我加载了一个堆栈,并将其存储到一个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
希望这能有所帮助。
https://stackoverflow.com/questions/31053382
复制相似问题