资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第一节 MATLAB中图象工具箱,1.1图像文件读写,1.imread函数,该函数用于从图形文件中读出图像。格式A=IMRAED(FILENAME,FMT)。该函数把FILENAME 中的图像读到A中。若文件包含一个灰度图,则为二维矩阵。若文件包含一个真彩图(RGB),则A为一三维矩阵。FILENAME指明文件,FMT指明文件格式。格式X,MAP=IMREAD(FILENAME,FMT).把FILENAME中的索引图读入X,其相应的调色板读到MAP中.图像文件中的调色板会被自动在范围0,1内重新调节。FMT的可能取值为jpg或jpeg,tif或tiff,bmp,png,hdf,pcx,xwd。,2.imwrite函数,该函数用于把图像写入图形文件中。格式IMWRITE(A,FILENAME,FMT)把图像A写入文件FILENAME中。FILENAME指明文件名,FMT指明文件格式。A既可以是一个灰度图,也可以是一个真彩图像。格式IMWRITE(X,MAP,FILENAME,FMT)把索引图及其调色板写入FILENAME中。MAP必须为合法的MATLAB调色板,大多数图像格式不支持多于256色的调色板。FMT的可能取值为tif或tiff,jpg或jpeg,bmp,png,hdf,pcx,xwd。,1.2图像显示,1.getimage函数,格式A=GETIMAGE(H).返回图形句柄对象H中包含的第一个图像的数据.H既可以是一条曲线,图像,或纹理表面.A等同为图像的数据。格式X,Y,A=GETIMAGE(H).返回图像的Xdata到X,Ydata到Y,Xdata和Ydata是表明x轴和y轴的范围的两元素向量。,格式,A,FLAG=GETIMAGE(H)。返回指示图像类型的整数型标记.FLAG可为下列值:,3.IMAGESC函数,该函数按比例决定数据并把它作为图像显示。该函数的格式除数据要按比例重整来使用完全调色板外,其他与函数IMAGE相同。在格式IMAGESC(,CLIM)中,CLIM=CLOW,CHIGH表明比例尺度。,4.IMSHOW函数,格式IMSHOW(I,N).用N级离散灰度级显示灰度图象I。若省略N,默认用256级灰度显示24位图像,64级灰度显示其他系统。格式IMSHOW(I,LOW HIGH),把I作为灰度图显示。LOW值指定为黑色,HIGH指定为白色,中间为按比例分布的灰色。若LOW,HIGH为,则函数把图像中的最小值显示为黑色,最大值显示为白色。,格式IMAGE(SW).用于显示二值图.0显示为黑色,1显示为白色。,格式IMAGE(RGB).用于显示真彩色图像。,格式IMAGE(X,MAP).显示索引图X及其调色板MAP。,格式IMSHOW(FILENAME).显示存储于图形文件FILENAME中的图像。,H=IMSHOW().返回图像对象的句柄。,5.SUBIMAGE函数,格式SUBIMAGE(X,MAP).用来显示当前坐标中的索引图.,格式SUBIMAGE(I).用来显示灰度图.,格式SUBIMAGE(BW).用来显示二值图.,格式SUBIMAGE(RGB).用来显示真彩图.,格式SUBIMAGE(x,y,)用来在非默认的空间坐标中显示图像.,H=SUBIMAGE()返回图像对象的句柄.输入图像可为unit8,unit16,double型,一个例子,load lena,x2,map2=imread(peppers.tif);,subplot(1,2,1),subimage(X,map),subplot(1,2,2),subimage(X2,map2),1.3图像几何变换,1.imcrop函数,该函数用于把一幅图像经裁剪后放入一指定的矩形中。例如在以下的语法格式中IMCORP显示输入图像,并等待用鼠标指定矩形。,I2=IMCORP(I).,X2=IMCORP(X,MAP).,RGB2=IMCORP(RGB).,2.imrotate函数,该函数用于旋转图像。格式B=IMROTATE(A,ANGLE,METHOD)。用于把图像A按逆时针方向和特殊的填充方法旋转ANGLE度,METHOD可取以下值:,“nearest”:默认值,用最近邻插值。,“bilinear”:用双线性插值。,“bicubic”:用双立方插值。,例子,I=imread(lena.tif);,J=imrotate(I,-3,bilinear,corp);,Imshow(I),figure,imshow(J),1.4 象素统计,1,COOR2函数,该函数用于计算二维相关系数。格式R=COOR2(A,B).用于计算A,B间的相关系数,A,B为相同尺寸的矩阵或向量。,2IMHIST函数,该函数用于计算图像数据的直方图。格式IMHIST(I,N).用于显示灰度图像I的N级直方图。对灰度图默认N为256,对二值图默认N为2。格式IMHIST(X,MAP)。用于显示索引图的直方图。,3.MEAN2函数,该函数用于计算矩阵元素的均值。,1.5图像分析,1.,EDGE函数,该函数用于找出灰度图的边缘。该函数的输入是灰度图,返回一个同样大小的二值图。边缘处为1,其他地方为0。该函数支持Sobel,Prewitt,Roberts,Laplacian,Zero-cross,Canny六种不同的算子。,例如使用Prewitt和Canny算子找出lena.bmp的边缘。,I=imread(lena.tif);,BW1=edge(I,prewitt);,BW2=edge(I,canny”);,imshow(BW1),figure,imshow(BW2),1.6图像增强,1.,HISTEQ函数,该函数用直方图均衡的方法增强图像的对比度。,例如用直方图均衡的方法增强一幅灰度图。,I=imread(lena.tif);,J=histeq(I);,Imshow(I);,Figure,Imshow(J),2,MEDFILT2函数,该函数用来对图像进行二维中值滤波。,例如I=imread(lena.tif);,J=imnoise(I,salt,K=medfilt2(J);,imshow(J),figure,imshow(K),3.ORDFILT2函数4.WIENER2函数,ORDFILT2函数对图像进行二维排序统计滤波。,WIENER2函数进行二维自适应去噪滤波。该函数可对一幅被加性噪声污染的灰度图进行低通滤波。,例如I=imread(lena.tif);,J=imnoise(I,gaussian,0,0.005);,K=wiener2(J,5 5);,imshow(J),figure,imshow(K),1.7线性滤波,1.,CONV2函数,该函数进行二维卷积。格式C=CONV2(A,B)对矩阵A,B进行二维卷积。若ma,na=size(A),mb,nb=size(B),则size(C)=ma+mb-1,na+nb-1。,2.,FILTER2函数,该函数进行二维数字滤波。格式Y=FILTER2(B,X)。对X中的数据用矩阵B中的二维FIR滤波器进行滤波。结果Y是用二维相关性进行计算的,大小和X一样。,1.8 线性二维滤波器设计,1.,FSAMP2函数,该函数用频率抽样法设计二维FIR滤波器。该函数在笛卡儿平面上抽样点的二维频率响应的基础上设计二维FIR滤波器。,例如用该函数设计一个通带在0.1至0.5之间(归一化频率)的近似对称二维带通滤波器。,f1,f2=freqspace(21,meshgrid);,Hd=ones(size(f1);,r=sqrt(f1.2+f2.2);,Hd(r0.5)=0;,h=fsamp2(Hd);,freqz2(h),2.,FTRANS2函数,该函数用频率转换法设计二维FIR滤波器。例如用该函数设计一个通带在0.1至0.6(归一化频率)的近似循环对称二维带通滤波器。,b=remez(10,0 0.05 0.15 0.55 0.65 1,0 0 1 1 0 0);,h=ftrans(b);,freqz2(h),3.,FWIND1函数,该函数用一维加窗的方法设计二维FIR滤波器。例如用该函数设计一个通带在0.1至0.5(归一化频率)的近似循环对称二维带通滤波器。,f1,f2=freqspace(21,meshgrid);,Hd=ones(21);,r=sqrt(f1.2+f2.2);,Hd(r0.5)=0;,h=fwind1(Hd,hamming(21);,freqz2(h),4.FWIND2函数,该函数用二维加窗的方法设计二维FIR滤波器。例如用该函数设计一个通带在0.1至0.5(归一化频率)的近似循环对称二维带通滤波器。,f1,f2=freqspace(21,meshgrid);,Hd=ones(21);,r=sqrt(f1.2+f2.2);,Hd(r0.5)=0;,win=fspecial(gaussian,21,2);,win=win./max(win(:);,h=fwind2(Hd,win);,freqz2(h),1.9图像变换,1.,DCT2函数,该函数对图像进行二维离散余弦变换。格式B=DCT2(A)返回A的离散余弦变换。A和B大小相同,B包含离散余弦变换的系数。格式B=DCT2(A,M N)或B=DCT2(A,M,N)在变换前把矩阵A用0填充至大小M*N,若M或N小于A相应的尺寸,则先截取A。,2,IDCT2函数,该函数计算二维离散余弦反变换。格式B=IDCT2(A).返回A的二维离散余弦反变换。格式B=IDCT2(A)或B=IDCT(A,M,N)在变换前对A截短或添0产生一个M*N的矩阵。,3,FFT2函数,该函数计算二维快速傅立叶变换。,4.,IFFT2函数,该函数计算二维快速傅立叶反变换。,5.FFTn函数,该函数计算n维快速傅立叶变换。,6iFFTn函数,该函数计算n维快速傅立叶反变换。,1.10 颜色空间变换,1,HSV2RGB函数,该函数把HSV颜色转换为RGB颜色。,2,RGB2HSV函数,该函数把RGB颜色转换为HSV颜色。,3.,NTSC2RGB函数,该函数把NTSC颜色转换为RGB颜色。,4.,RGB2NTSC函数,该函数把RGB颜色转换为NTSC颜色。,5.,YCBCR2RGB函数,该函数把YCBCR颜色转换为RGB颜色。,6.,RGB2YCBCR函数,该函数把RGB颜色转换为YCBCR颜色。,1.11图像类型和类型转换,1,DITHER函数,该函数用抖动的方法转换图像。,2,GRAY2IND函数,该函数把灰度图转换为索引图。格式X,MAP=GRAY2IND(I,N)。用调色板GRAY(N)把灰度图I转换为索引图X.若省略N,则系统默认64。,3,GRAYSLICE函数,该函数用阀值的方法把灰度图转换为索引图。例如用多级阀值的方法增强一幅图像的可理解性。,I=imread(abc.tif);X=graysice(I,16);,imshow(I),figure,imshow(X,hot(16),4,IM2BW函数,该函数用加阀值的方法把一幅图像转换为二值图。,load lena,BW=im2bw(x,map,0.4);imshow(x,map),figure,imshow(BW),5,IM2DOUBLE函数,该函数把一幅图像转换为双精度图像。,6,IM2UNIT8函数,该函数把一幅图像转换为8位无符号整数图像。,7IM2UNIT16函数,该函数把一幅图像转换为16位无符号整数图像。,8,IND2GRAY函数,该函数把一幅索引图转换为灰度图。格式I=IND2GRAY(X,MAP).把调色板为MAP的图像X转换为灰度图I。该函数在保留亮度的同时,除掉了颜色和饱和度信息。,例如,load peppers,I=ind2gray(X,map);,imshow(X,map),figure,imshow(I),9,IND2RGB函数,该函数把索引图转换为RGB图像。格式RGB=IND2RGB(X,MAP)。把矩阵X和相应的调色板MAP转换为真彩格式。,10.ISBW函数,该函数判断输入是否为二值图。格式FLAG=ISBW(A)。返回1若A为二值图,若为其他则返回0。,11ISGRAY函数,该函数判断输入是否为灰度图。,12ISIND函数,该函数判断输入是否为索引图。,13ISRGB函数,该函数判断输入是否为真彩图。,11MAT2GRAY函数,该函数把矩阵转换为灰度图。,例如,I=imread(lena.tif);,J=filter2(fspecial(sobel),I);,K=mat2gray(J);,imshow(I),figure,imshow(K),15.RGB2GRAY函数,该函数把真彩图或索引图转换为灰度图。该函数在保留亮度的同时去除色彩和饱和度信息。,16RGB2IND函数,该函数把真彩图转换为索引图。例如,RGB=imread(lena.tif);,X,map=rgb2ind(RGB,128);,imshow(X,map),第二节 图像的格式与文件读写,BMP图像文件的文件头定义,BITMAPFILEHEADER数据结构在Windows.h中的定义为:,typedef struct tagBITMAPFILEHEADER,WORD bftype;,DWORD bfsize;,WORD bfReserved1;,WORD bfReserved2;,DWORD bfoffBits;,BITMAPFILEHEADER;,其中,bfType在图像文件存储空间中的数据地址为0,数据类型为unsigned char,内,容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。,bfsize的数据地址为2,类型为unsigned long,它以字节为单位,定义位图文件的大小。,bfReserved1与bfReserved2的数据地址分别为6和8,数据类型则都为unsigned int,二者都是BMP文件的保留字,其值必须为0。,bfoffBits的数据地址为10,数据类型为unsigned long,它以字节为单位,指示图像,数据在文件内的起始地址,即图像数据针对文件头的偏移量。,BITMAPINFOHEADER数据结构用于说明位图的大小,其定义为:,type struct tagBIIMAPINFOHEADER,DWORD biSize;DWORD biWidth;,DWORD biHeight;WORD biplanes;,WORD biBitCount;DWORD biCompression;,DWORD biSizeImage;,DWORD biXPeIsPerMeter;,DWORD biYPeIsPerMeter;,DWORD biClrUsed;,DWORD biClrImportant;,BITMAPINFOHEADER;,非压缩存储格式,非压缩存储格式是BMP图像文件通用的一种数据处理方式。在这种存储格式中,位图每一点的象素值与位图阵列中的若干位一一对应,其中,位图阵列的大小由位图的宽度、高度以及位图的颜色数共同确定。,1.首先,必须掌握位图扫描行与位图阵列的关系。假设记录一个扫描行的象素值需要n个字节,则位图阵列的0到n-1个字节记录了位图第一个扫描行的象素值:位图阵列的第n至第2n-1个字节记录了位图第二个扫描行的象素值,依次类推,位图阵列的第(m-1)*n至第m*n-1个字节记录了位图第m个扫描行的象素值,整个位图阵列的大小为n*biHeight。同时,由于Windows对于BMP图像文件特别规定:文件内每行字节的个数必须是4的倍数,否则,应该在每行的末端加上几个字节,并利用0填充这些字节中的各个位值,从而凑齐差额部分的位值。因此,n的取值可以利用如下公式计算:当(biWidth*biBitCount)mod32=0时,n=(biWidth*biBitCount)/8;否则n=(biWidth*biBitCount)/8+4。应用程序在读取这种没有经过数据压缩处理的BMP图像文件时,应该判断每行数据中是否包含多余的字节,从而避免将这些多余的字节存入存储空间,并导致位图显示混乱。,2.,应该注意BMP图像数据的存储方式,即位图象素值与位图阵列的关系。由于BMP图像中,单色图像利用一个字节记录8个象素;16色图像利用一个字节记录两个象素;其中,左边四位记录第一个象素,右边四位记录第二个象素;256色图像以一个字节记录一个象素;而真彩色图像则是以三个字节记录一个象素。因此,假设记录第m个扫描行象素值的n个字节分别为aO、a1、a2、,则:,当biBitCount=1时,aO的第7位记录位图第m个扫描行中的第1个象素值,aO的第6,位记录位图第m个扫描行中的第2个象素值,.,aO的第0位记录位图第m个扫描行中的第8个象素值,a1的第7位记录位图第m个扫描行中的第9个象素值,a1的第6位记录位图第m个扫描行中的第10个象素值,依次类推。,当biBitCount=4时,aO的第7位至第4位记录位图第m个扫描行中的第1个象素值,aO的第3位至第0位记录位图第m个扫描行中的第2个象素值,a1的第7位至第4位记录位图第m个扫描行中的第3个象素值,依次类推。,当biBitCount=8时,aO记录位图第m个扫描行中的第1个象素值,a1记录位图第m,个扫描行中的第2个象素值,依次类推。,当biBitCount=24时,a0,a1,a2记录位图第m个扫描行中的第1个象素值,a3,a4,,a5记录位图第m个扫描行中的第2个象素值,依次类推。,比特原始灰度图像数据文件的读写,这种图像文件不含信息头,8比特灰度值直接按逐行、逐列顺序排列存储,文件大小等于图像行数和列数的乘积。读入图像数据时,需指定文件的宽(width)和高(height)。若图像的宽和高相等,可由文件大小计算出图像的尺寸。,(1)8比特灰度图像存储数据结构,typedef struct,unsigned long width,height;,unsigned char*data;,GrayU8Image;,(2)读8比特原始灰度图像文件的子程序,GrayU8Image*readU8RAW(FILE*fp,unsigned long width,unsigned long height),GrayU8Image*image;,int row;,unsigned char*ptr;,image=(GrayU8Image*)malloc(sizeof(GrayU8Image);,if(!image)return NULL;,image-width=width;,image-height=height;,image-data=(unsigned char*)malloc(width*height*sizeof(char);,if(!image-data),free(image);,return NULL;,ptr=image-data;,for(row=0;rowheight;row+),if(fread(ptr,1,image-width,fp)!=image-width),free(image-data);,free(image);,return NULL;,ptr+=image-width;,return image;,(3)写8比特原始图像数据文件的子程序,int writeU8RAW(FILE*fp,GrayU8Image*image),int row;,unsigned char*ptr;,ptr=image-data;,for(row=0;rowheight;row+),fwrite(ptr,1,image-width,fp);,ptr+=image-width;,return 0;,16比特原始灰度图像数据文件的读写,图像文件不含信息头,16比特灰度值直接按逐行、逐列顺序排列存储,文件大小等于图像行数和列数的乘积的2倍。读入图像数据时,需指定文件的宽(width)和高(height)。若图像的宽和高相等,也可由文件大小计算出图像的尺寸。,(1)16比特灰度图像存储数据结构,typedef struct,unsigned long width,height;,unsigned short*data;,GrayU16Image;,(2)读16比特原始灰度图像文件的子程序,GrayU16Image*readU16RAW(FILE*fp,unsigned long width,unsigned long height),GrayU16Image*image;,int row;unsigned short*ptr;,image=(GrayU16Image*)malloc(sizeof(GrayU16Image);,if(!image)return NULL;,image-width=width;,image-height=height;,image-data=(unsigned short*)malloc(width*height*sizeof(unsigned short);,if(!image-data),free(image);return NULL;,ptr=image-data;,for(row=0;rowheight;row+),if(fread(ptr,2,image-width,fp)!=image-width),free(image-data);,free(image);return NULL;,ptr+=image-width;,return image;,(3)写16比特原始图像数据文件的子程序,Int writeU16RAW(FILE*fp,GrayU16Image*image),int row;unsigned short*ptr;,ptr=image-data;,for(row=0;rowheight;row+),fwrite(ptr,2,image-width,fp);,ptr+=image-width;,return 0;,16比特多光谱BSQ图像数据文件的读入,GrayU16Image*readU16BSQ(FILE*fp,unsigned long width,unsigned long height,int index),fseek(fp,width*height*sizeof(unsigned short)*index,SEEK_SET);,return readU16RAW(fp,width,height);,RGB图像和灰度图像之间的转换,灰度图像向RGB图像的转换,当色差信号U、V=0时,R=G=B=Y.,RGB图像向灰度图像的转换,由公式Y=0.299R+0.587G+0.114B,由于程序较长,在此省略。,本章小结,通过本章的学习,读者可以学习MATLAB中图像工具箱函数调用及图像格式。这些内容对于初学者是是十分重要的,帮助节省大量的时间。通过本章中的大量典型的例程,读者要进行大量的实践才能掌握只有迅速掌握MATLAB中图像工具箱函数调用及图像格式,以及打开各种图象格式文件。虽然本章中主要介绍MATLAB图象工具箱中的一些基本函数的应用和图象格式基本知识,但这些内容是初学者必须掌握。否则将无法进行进一步深入学习。特别是不用专业软件打开各种图象格式的文件,相信对读者是十分有用的,因为其它书中很少见到这方面内容。,综合练习题,1.,学习和练习MATLAB图象工具箱中的函数,可采用MATLAB环境中的图象,也可以自己选择图象文件。,2.,应用第二节中的例程,编写出能够读写各种图象样式的程序,并能够进行相应格式转换。,
展开阅读全文