fishing-panhttps://blog.csdn.net/u013921430转载请注明出处】

前言

      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,存储了单张图像的尺寸WidthHeight,存储了图像有多少张字段,以及图像的位深 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



已完。。

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐