读取三维TIFF
前言
Matlab用来读取图像的函数是imread(),顾名思义image read,同样的道理写图片的函数是imwrite();
但是imread()函数可以用来读取二维的图像,例如jpg、png、bmp格式以及二维的tiff图像,对于三维的Tiff图像,却无法读取整张图像,如果直接使用imread,那么被读取的是三维数据中的第一帧。
那么如何读取三维的TIFF图像呢?
读取三维TIFF
1. 获取图像信息
-
clear all
-
clc;
-
filepath='test.tif'; %%图像名称与路径
-
Info=imfinfo(filepath); %%获取图片信息并判断是否为tif
首先,我们来看Info中存储着那些信息;
其中存储着图像的基本信息,比如整个图像的大小FileSize,存储了单张图像的尺寸Width与Height,存储了图像有多少张字段,以及图像的位深 BitDepth等信息。
获得这些信息后,我们就可以准备读入图像了。
-
tif='tif';
-
format=Info.Format;
-
if (strcmp(format ,tif)==0)
-
disp('载入的不是tif图像,请确认载入的数据'); %%确保载入的图像是tiff图像
-
end
-
Slice=size(Info,1); %%获取图片z向帧数
-
Width=Info.Width;
-
Height=Info.Height;
2. 准备数组
我们已经获得了图像的信息,在这之后,我们需要声明一个三维的数组,然后一层一层的读入图像就可以了;
-
Image=zeros(Height,Width,Slice);
-
for i=1:Slice
-
Image(:,:,i)=imread(filepath,i); %%一层一层的读入图像
-
end
至此,我们读入图像的过程就已经结束,Image这个数组就是我们所获得的三维图像,后续我们只需要对这个数组进行操作即可。
写三维TIFF图像
写图像我们就用imwrite()函数就好,但是在使用的过程中,总是出现问题,不得不说matlab对于三位TIFF图像的支持不够。所以,我都是现将图像的每一帧进行输出最后利用其它软件进行合并,例如Fiji。
-
for i=1:Slice
-
J=uint8(Image(:,:,i)); %%一层一层写出图像
-
%%imwrite(J,[dir,'.tif'],'WriteMode','Append');
-
imwrite(J,[num2str(i,'%04d'),'.tif']);
-
end
以上代码中,被注释掉的就是直接写TIFF的代码,当TIFF图像帧数不多时,可以尝试用该方法,就是加上一个Append的写出模式,这种模式下,不可以使用parobj,否则图像是乱序的。 在这里需要提醒大家,在写出图像的时候,要保证图像序号的一致性,比如,100张图像,序号应该是0001-0100.tif,而不是1-100.tif,后者的话,Fiji等软件时无法将其读入同一个图像栈的,也就无法保存。
方法一:
num2str(i,'%04d')
方法二:
sprintf('%04d',i)
完整的代码如下
灰度tiff读写代码
-
clear all
-
clc;
-
filepath='test.tif'; %%图像名称与路径
-
Info=imfinfo(filepath); %%获取图片信息并判断是否为tif
-
tif='tif';
-
format=Info.Format;
-
if (strcmp(format ,tif)==0)
-
disp('载入的不是tif图像,请确认载入的数据'); %%确保载入的图像是tiff图像
-
end
-
Slice=size(Info,1); %%获取图片z向帧数
-
Width=Info.Width;
-
Height=Info.Height;
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
Image=zeros(Height,Width,Slice);
-
for i=1:Slice
-
Image(:,:,i)=imread(filepath,i); %%一层一层的读入图像
-
end
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
for i=1:Slice
-
J=uint8(Image(:,:,i)); %%一层一层写出图像
-
%%imwrite(J,[num2str(i,'%4d'),'.tif'],'WriteMode','Append');
-
imwrite(J,[num2str(i,'%04d'),'.tif']);
-
end
彩色tiff图像读写代码(注意,这是彩色图像的代码,灰度图像的代码在上方)
-
clear all
-
clc;
-
filepath='test.tif'; %%图像名称与路径
-
Info=imfinfo(filepath); %%获取图片信息并判断是否为tif
-
tif='tif';
-
format=Info.Format;
-
if (strcmp(format ,tif)==0)
-
disp('载入的不是tif图像,请确认载入的数据'); %%确保载入的图像是tiff图像
-
end
-
Slice=size(Info,1); %%获取图片z向帧数
-
Width=Info.Width;
-
Height=Info.Height;
-
Image=zeros(Height,Width,Slice*3);
-
for i=1:Slice
-
Image(:,:,(i-1)*3+1:i*3)=imread(filepath,i); %%一层一层的读入彩色图像
-
end
-
%%%%%%%%%%%%%%%%%%%%%
-
图像处理操作
-
%%%%%%%%%%%%%%%%%%%%%
-
for i=1:Slice
-
J=uint8(Image(:,:,(i-1)*3+1:i*3)); %%一层一层写出图像
-
%%imwrite(J,[num2str(i,'%4d'),'.tif'],'WriteMode','Append');
-
imwrite(J,[num2str(i,'%04d'),'.tif']);
-
end