本节主要介绍常用格式和特殊格式(如DICOM、HDR、NITF)的图像文件的输入/输出函数。掌握这些函数,读者在MATLAB使用中可方便地读取和保存指定格式的图像文件。
【功能】 把图像写入图形文件中。
【语法介绍】
·imwrite(A,filename,fmt) 把图像数据A写入指定的图像文件中。字符串参量filename表示指定的图像文件名。参量fmt表示文件格式,即扩展名,具体参见表1.6。参量A可为矩阵(表示灰度图像)或第三维维数为3的三维数组(表示真彩色图像),但不能是一个空矩阵。如果参量fmt为tiff,则A也可为第三维维数为4的三维数组。
·imwrite(X,map,filename,fmt) 把索引图像数据X写入指定的图像文件中。参量X为矩阵。如果X的类型为uint8或uint16,则imwrite将X的真实值写入指定文件中;如果X的类型为双精度型,则imwrite将X的值转换为uint8(X-1)类型后再写入指定文件中。参量map为一列数为3的矩阵,表示颜色表。map中的每行表示一种颜色,每行中第一、第二、第三个元素分别指定红色、绿色、蓝色的亮度。
·imwrite(...,filename) 把图像数据写入指定的图像文件中。字符串参量filename为指定的图像文件名(包含扩展名)。
·imwrite(...,param1,val1,param2,val2,...) 指定输出文件的属性param的值val。
表1.6 常用fmt图像类型表
【实例】 读取MATLAB自带的图像,并保存到指定的文件中。
图1.36 保存图像到指定文件中
【功能】 从图像文件中读取图像
【语法介绍】
·A=imread(filename,fmt) 从指定的图像文件中读取灰度图像或真彩色图像。字符串参量filename表示文件名;字符串参量fmt表示文件类型,具体取值可参见表1.6。
·[X,map]=imread(...) 从指定的图像文件中读取索引图像和颜色表。X为索引图像,map为颜色表,其值自动被调整到[0 1]的范围。
·[...]=imread(filename) 从指定的图像文件中读取灰度图像或真彩色图像。字符串参量filename表示图像文件全名的字符串(包括扩展名)。
·[...]=imread(URL,...) 从网上指定地址读取图像。字符串参量URL表示网址(必须包括协议类型,如http://)。
·[...]=imread(...,idx) 读取CUR图像文件或ICO图像文件中的一幅图像。参量idx为正整数,指定图像文件中被读取图像的序号;一般默认值idx=1。例如,如果idx=3,则读取图像文件中的第3幅图像。
·[A,map,alpha]=imread(...) 返回读取的CUR图像或 ICO图像A、颜色表map及透明度alpha。
·[...]=imread(...,idx) 读取GIF或TIFF图像文件中的一帧或几帧图像。参量idx为整型变量矩阵,其元素指定图像文件中被读取图像的序号。例如,如果 idx=3,则读取文件中的第3帧图像;如果idx=1:5,则读取前5帧图像。
·[...]=imread(...,'frames',idx) 读取GIF图像文件中的一帧或几帧图像。参量idx为整型变量矩阵或字符串all。当idx为all时,读取图像文件中所有帧图像。当idx为整型变量矩阵时,其元素指定图像文件中被读取图像的序号。例如,如果 idx=3,则读取文件中的第3帧图像;如果idx=1:5,则读取前5帧图像。
·[...]=imread(...,ref) 读取HDF4图像文件中的一幅图像。参量ref为整数,指定图像的参考数。例如,如果ref=12,则读取图像文件中的参考数为12的图像,默认情况下,imread读取HDF4图像文件中的第一幅图像。
【实例1】 读取MATLAB自带的灰度图像。
图1.37 读取MATLAB自带的灰度图像
【实例2】 读取MATLAB自带的索引图像。
图1.38 读取MATLAB自带的索引图像
【实例3】 读取TIFF文件中的第6帧图像。
图1.39 读取TIFF文件中的第6帧图像
【实例4】 读取GIF文件中的前3帧图像,GIF文件由用户自己创建。
图1.40 读取GIF文件中的前3帧图像
【实例5】 读取GIF文件中的所有图像(6帧),GIF文件由用户自己创建。
图1.41 读取GIF文件中的所有6帧图像
【功能】 从analyze 7.5数据集头文件中读取数据信息。
【语法介绍】
·info=analyze75info(filename) 从指定的analyze7.5数据集头文件中读取数据信息。字符串参量filename为文件名。输出参量info为结构变量,表示数据信息。
·info=analyze75info(filename,'ByteOrder',endian) 从指定的analyze7.5数据集头文件中按指定字节顺序读取数据信息。字符串参量endian指定字节顺序,取值参见表1.7。
表1.7 analyze75info函数参量endian取值
【实例】 读取analyze 7.5数据集头文件,analyze 7.5格式文件由用户自己创建,可以从http://www.radiology.uiowa.edu/downloads/下载。
>> info=analyze75info('CT_HAND.hdr');
【功能】 从analyze 7.5数据集图像文件中读取图像数据。
【语法介绍】
·X=analyze75read(filename) 从指定的analyze 7.5数据集图像文件中读取图像数据X。字符串参量filename为文件名。
·X=analyze75read(info) 从指定的analyze 7.5数据集头文件数据信息info中读取图像数据X。参量info通常由analyze75info函数输出得到。
【实例1】 从analyze 7.5数据集图像文件中读取图像数据,analyze 7.5格式文件由用户自己创建,可以从http://www.radiology.uiowa.edu/downloads/下载。
>> X=analyze75read('CT_HAND');
【实例2】 从analyze7.5数据集头文件中读取信息,然后从信息中读取图像数据,analyze 7.5格式文件由用户自己创建。
【功能】 修改DICOM文件信息。
DICOM是Digital Imaging and Communications in Medicine的缩写,表示医学的数字成像和通信。DICOM标准是由美国放射学院(American College of Radiology,ACR)和国家电气制造商协会(National Electrical Manufacturers Association,NEMA)共同制定的。DICOM文件是指按照DICOM标准而存储的医学文件。DICOM文件的主要组成部分就是数据集合,这不仅包括医学图像,还包括许多和医学图像有关的信息,如病人姓名、图像大小等。DICOM数据集合是由DICOM数据元素按照指定的顺序依次排列组成的。
【语法介绍】
·dicomanon(file_in,file_out) 从DICOM文件file_in中删除相关数据元素,创建一个新的DICOM文件file_out。file_out中包含修改的信息。
·dicomanon(...,'keep',FIELDS) 除了 FIELDS 指定的数据元素不修改外,修改其他所有的数据元素。参量FIELDS是一个细胞矩阵。
·dicomanon(...,'update',ATTRS) 修改数据元素,并且更新 ATTRS指定的数据元素。参量ATTRS是一个细胞矩阵。
【实例】 从文件中修改相关数据元素。
【功能】 获得或设置DICOM数据目录。
【语法介绍】
·dicomdict('set',dictionary) 设置DICOM数据的目录文件。字符串参量dictionary表示DICOM数据的目录文件名。
·dictionary=dicomdict('get') 返回DICOM数据的目录文件名。
·dicomdict('factory') 重置DICOM数据的目录文件为默认值。
【实例】 获取DICOM数据目录信息。
【功能】 从DICOM文件中读取元数据信息。
【语法介绍】
·info=dicominfo(filename) 从指定的DICOM文件中读取元数据信息。字符串参量filename为DICOM文件名。
·info=dicominfo(filename,'dictionary',D) 使用 DICOM 数据目录文件 D从指定的DICOM文件filename中读取元数据信息。
【实例】 从CT-MONO2-16-ankle.dcm文件中读取元数据信息。
【功能】 在DICOM数据目录中寻找某个元素的属性。
【语法介绍】
·name=dicomlookup(group,element) 在当前 DICOM 数据目录中寻找指定元素element和属性group的信息,参量group和element为包含十进制的数值或十六进制的字符串。
·[group,element]=dicomlookup(name) 在当前 DICOM 数据目录中寻找指定属性name的信息。
【实例】 通过属性名称'TransferSyntaxUID'寻找DICOM数据目录中对应的标识。
【功能】 读取DICOM图像。
【语法介绍】
·X=dicomread(filename) 从DICOM文件filename中读取图像数据。如果filename为单幅灰度图像,则X为矩阵;如果filename为单幅真彩色图像,则X为第三维维数为3的三维数组;如果filename为多帧图像,则X通常为四维数组。
·X=dicomread(info) 从DICOM数据信息结构info中读取图像数据。参量info由函数dicominfo输出得到。
·[X,map]=dicomread(...) 从DICOM文件中读取图像数据X和颜色表map。如果X为灰度图像或真彩色图像数据,则map为空矩阵。
·[X,map,alpha]=dicomread(...) 返回图像数据X、颜色表map和透明度矩阵alpha。
·[X,map,alpha,overlays]=dicomread(...) 返回图像数据X、颜色表map、透明度矩阵alpha和所有DICOM文件中的覆盖图overlays。
·[...]=dicomread(filename,'frames',v) 从DICOM文件filename中读取指定的几帧图像。参量v为一个整型向量或字符串all。当v为all时,dicomread读取所有的图像信息。当 v为整型向量时,其元素指定图像文件中被读取图像的序号。例如,如果idx=3,则读取文件中的第3帧图像;如果idx=1:5,则读取前5帧图像。
【实例1】 读取图像数据X和颜色表map,创建多帧图像。
【实例2】 从DICOM元数据结构中读取图像数据。
图1.42 读取DICOM图像并创建10帧图像
图1.43 从DICOM元数据结构中读取图像数据
【功能】 生成DICOM文件标识符。
【语法介绍】
·UID=dicomuid 创建一个新的DICOM文件标识符字符串UID。
【实例】 生成DICOM文件标识符。
>> UID=dicomuid
【功能】 将图像写入DICOM文件中。
【语法介绍】
·dicomwrite(X,filename) 将二值、灰度、真彩色图像X写入DICOM文件filename中。参量字符串filename为生成的DICOM文件名。参量X为矩阵(二值或灰度图像)或第三维维数为3的三维数组(真彩色图像)。
·dicomwrite(X,map,filename) 将索引图像X和颜色表map写入DICOM文件filename中。参量map为一列数为3的矩阵,表示颜色表。参量X为矩阵。
·dicomwrite(..., param1, value1, param2, value2, ...) 按照指定的格式和属性将图像写入DICOM 文件中。参量 param和 value是表示中间数据中的属性名字字符串或者dicomwrite特有的写入选项,具体如表1.8所示。
·dicomwrite(..., 'ObjectType', IOD,...) 按照指定的DICOM信息对象特殊格式将图像写入DICOM文件中。参量IODs表示指定的特殊格式,取值可为:'Secondary Capture Image Storage' (默认值,二次捕捉图像存储)、'CT Image Storage'(CT图像存储)、'MR Image Storage'(MR图像存储)。
·dicomwrite(...,info,...) 按照指定数据信息结构info将图像写入DICOM文件中。参量info由函数dicominfo输出得到。
·status=dicomwrite(...) 返回数据信息和写入的DICOM文件的描述信息。
表1.8 图像信息表
续表
【实例1】 从DICOM文件中读取CT图像,然后将图像写入sc_file.dcm文件中。
【实例2】 从DICOM文件中获取元数据信息,然后将元数据中的图像写入ct_file.dcm文件中。
【实例3】 复制文件中的所有元数据。
【功能】 获取动画帧。
【语法介绍】
·getframe 返回一帧动画,即当前图形窗口或轴的一个快照(截屏)。
·F=getframe 从当前轴获取一帧动画。
·F=getframe(h) 从句柄为h的图形窗口或轴获取一帧动画。
·F=getframe(h,rect) 从句柄为h的图形窗口或轴的指定区域获取一帧动画,参量rect为四元素向量([xmin,ymin,xmax,ymax]),(xmin,ymin)表示矩阵区域左下角端点的坐标,(xmax,ymax)表示矩阵区域右上角端点的坐标。
【实例1】 使用getframe函数获取一帧动画图像。
图1.44 获取一帧动画图像
【实例2】 由peaks函数创建动画。
图1.45 由peaks函数创建动画
【实例3】 从显示图像中截取一部分生成一幅图像。
图1.46 原始图像
图1.47 从原始图像中截取一部分生成一幅图像
【功能】 返回图形文件的信息。
【语法介绍】
·info=imfinfo(filename,fmt) 返回指定的图像文件的信息。字符串参量filename表示图像文件名。字符串参量fmt为图像文件类型,具体取值可参见表1.6。info为图像信息结构,具体可参见表1.9。
·info=imfinfo(filename) 返回指定的图像文件filename的信息。
·info=imfino(URL,...) 返回网上指定的图像的信息,字符串参量URL为网址(包括协议类型,如http://)。
表1.9 图像信息表
【实例】 读取图形文件canoe.tif的信息。
【功能】 读取HDR图像。
HDR是High Dynamic Range的缩写,即高动态范围,如高动态范围图像(HDRI)或者高动态范围渲染(HDRR)。动态范围是指信号最高和最低值的相对比值。HDR是一个简单的术语,HDR照片是使用多张不同曝光的图片,然后再用软件将其叠加合成一张图片。HDR照片的优势是最终你可以得到一张无论在阴影部分还是高光部分都有细节的图片,而在正常的摄影中,或许只能选择两者之一。简单来说,HDR照片可以用3句话来概括:亮的地方可以非常亮;暗的地方可以非常暗;亮暗部的细节都很明显。
【语法介绍】
·hdr=hdrread(filename) 从指定的 HDR图像文件中读取图像数据。字符串参量filename表示HDR图像文件名。输出参量hdr为第三维维数为3的三维数组,表示读取的HDR图像数据,数据类型为单精度数值型,数值范围为[0 inf]。
【实例】 读取并显示HDR图像。
【功能】 将HDR图像写入图像文件。
【语法介绍】
·hdrwrite(hdr,filename) 将HDR图像数据写入指定的文件中。字符串参量filename表示文件名。参量hdr为第三维维数为3的三维数组,表示HDR图像数据,其数据类型为单精度或双精度型,数值范围为[0 inf]。
图1.48 读取并显示HDR图像
【实例】 读取HDR图像并将其保存至MyFile.hdr文件中。
图1.49 读取HDR图像并将其保存至MyFile.hdr文件中
【功能】 从Interfile文件中读取图像信息。
【语法介绍】
·info=interfileinfo(filename) 从指定的interfile文件中读取文件中的图像信息。字符串参量filename表示文件名。输出参量info为结构体变量,表示interfile文件中的图像信息。
【实例】 从 Interfile文件中读取元数据信息。Interfile文件由用户自己创建,可以从http://www.medphys.ucl.ac.uk/interfile/下载。
>> info=interfileinfo('MyFile.hdr');
【功能】 从Interfile文件中读取图像。
【语法介绍】
·A=interfileread(filename) 从指定的Interfile文件中的第一个能量窗口中读取图像到A。字符串参量filename为Interfile文件名。若读取的图像为单帧图像,则A为矩阵。若读取的图像为多帧图像,则A为三维数组。
·A=interfileread(filename,window) 从指定的Interfile文件中指定的能量窗口读取图像到A。参量window为整数,表示指定的能量窗口。
【实例】 从 Interfile文件中读取图像。Interfile文件由用户自己创建,可以从http://www.medphys.ucl.ac.uk/interfile/下载。
>> img=interfileread('MyFile.hdr');
【功能】 创建HDR图像。
【语法介绍】
·HDR=makehdr(files) 由一组位于细胞矩阵文件files中的低动态图像序列生成单精度HDR图像,这些细胞矩阵文件必须包含EXIF图像曝光元数据,以用于HDR图像计算的基本曝光量。
·HDR=makehdr(files,param1,val1,...) 使用指定参数param和参数值val从低动态图像中创建HDR图像。参量param1,val1,...的具体意义参见表1.10。
表1.10 makehdr参数表
【实例】 从6幅低动态图像序列中生成高动态范围图像,6幅图像具有相同的f/stop数和不同的曝光时间。
图1.50 显示不同曝光时间的HDR图像
图1.50 显示不同曝光时间的HDR图像(续)
图1.51 显示HDR图像
【功能】 从NITF文件中读取元数据信息。
【语法介绍】
·metadata=nitfinfo(filename) 从指定的 NITF文件中读取元数据信息。字符串参量filename为NITF文件名。输出参量metadata为结构数组,表示返回的元数据信息。
【功能】 从NITF文件中读取图像。
【语法介绍】
·X=nitfread(filename) 从指定的NITF文件中读取第一帧图像。字符串参量filename 为NITF文件名。
·X=nitfread(filename,idx) 从指定的NITF文件中读取指定的图像。参量idx为整数,表示指定图像的序号。
·X=nitfread(...,'PixelRegion',{rows,cols}) 从指定的 NITF文件中读取指定区域的图像。参量rows和cols为二维或三维向量,表示指定的图像区域。当rows和cols为二维向量时,第1个数表示起始位置,第2个数表示结束位置。当rows和cols为三维向量时,第1个数表示起始位置,第2个数表示增量,第3个数表示结束位置。