数字图像处理第二章MATLAB中图象工具箱及图象课件.ppt
第二章 MATLAB中图象工具箱及图象格式,本章中主要介绍MATLAB中图像工具箱及图像格式。这些内容对于初学者是基础的,也是十分重要的。只有迅速掌握这部分内容,才能开始图象处理的研究工作。本章中主要介绍MATLAB图象工具箱中的一些基本函数的应用和图象格式基本知识,并结合具体实践进行不同格式图象的打开和各种图象格式之间的转换,为进一步开展图象处理的学习和研究奠定基础。,第一节 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可为下列值:,0 不是图像,A返回一个空矩阵。1 索引图。2 标准灰度图。3非标准灰度图。4 RGB图像。例如在用imshow直接从文件中显示一个图像后,用getimage直接从工作区中得到图像数据 Imshow abc.tif X=getimage;,Image函数,该函数用于显示图像。格式IMAGE(C).把矩阵C作为一幅图像显示.C的每一个元素指明了一个图像块的颜色。C可以为M*N或M*N*3的矩阵,其数据可为double,unit8,unit16型。格式IMAGE(X,Y,C)。其中X,Y为矢量,指明C(1,1)和C(M,N)象素中心的位置。,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,saltimshow(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 peppersI=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 tagBITMAPFILEHEADERWORD 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 tagBIIMAPINFOHEADERDWORD 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.应用第二节中的例程,编写出能够读写各种图象样式的程序,并能够进行相应格式转换。,