Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB从32位tiff堆栈加载和保存单个图像_Matlab_Stack_Frame_Tiff - Fatal编程技术网

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

MATLAB从32位tiff堆栈加载和保存单个图像,matlab,stack,frame,tiff,Matlab,Stack,Frame,Tiff,我用的是MATLAB_R2011a_学生。我有一些图像堆栈保存为32位TIFF,一些超过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(

我用的是MATLAB_R2011a_学生。我有一些图像堆栈保存为32位TIFF,一些超过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位的,我保存的方式不是最好的方式) 无论哪种方式,此代码都适用于看似随机的帧数(例如在一个文件中)。tiff上述代码适用于第1-165帧,但165帧后的所有帧都不适用于另一个文件。tiff代码适用于第1-8帧,但8帧后的所有帧都不适用)当此操作正常时,我还在输出图像中得到一条奇怪的水平线:

???使用==>rtifc时出错 指定的TIFF图像索引无效

错误==>readtif在52处 [X,map,details]=rtifc(args)

==>imread在443处出错 [X,map]=feval(fmt_.read,文件名,外部参数{:})

谢谢

在我看来,处理tiff堆栈的最佳方法是使用几年来可用的。我必须承认,我对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

希望这能有所帮助。

我不太明白对不起。您正在尝试打开/保存哪个图像?1633号?你所说的堆栈是指一个多tiff文件,对吗?是的,在这个例子中,我试图打开第163个图像,并得到错误消息。所谓堆栈,我的意思是它被保存为一个tiff文件,但它是一个3d阵列,可以分成多个tiff(当在imageJ中打开时,它被作为堆栈打开)。那么你尝试过我的建议了吗?谢谢!这似乎比我所拥有的要好一点。当我使用imtool()时,我仍然需要使用对比度拉伸才能看到任何东西。有没有办法将其保持为32位浮点,并且能够将单个帧/片数作为32位浮点查看或保存?好问题!我曾经遇到过uint16数据的类似问题,诀窍是使用
imwrite
如下:
imwrite(uint8(YourImage/255),…)
;因此,在uint32数据的情况下,我怀疑以下方法应该有效:
imwrite(uint8(YourImage/65535),…)因为它以某种方式保存为uint8…也许有什么我不明白,但上面的技巧对我有效:)这对我无效..我得到了所有零值的图像。所以我们的想法是将32位浮点打开为uint16并保存为uint8?在所有这些步骤中都不会丢失数据?另外,当我尝试使用某些32TIFF时,我会得到“BigTIFF尚不受支持”或“这是一个BigTIFF文件。此版本的libtiff不支持此格式…”我四处查看,这些应该得到支持。。想法?哦,我打错了,你确实可以打开uint32的图像;我写了16封信对此表示歉意。至于保留部分,是的,我同意你的看法;这是我在ImageJ中打开truecolor图像的唯一方法。否则,另存为uint16而不修改数据会导致ImageJ以复合而非truecolor方式打开我的图像。我想有人比我更了解这件事