1、多媒体通信方向综合性设计一图像数据输入与输出,图像数据类型的转换1.图像的输入从图形图像上读取数据 MATLAB 提供了一个重要的用于图像文件的读写的指令-从图像文件中读取数据的 imread, imread 的常见调用格式为: A=imread(filename,fmt) 其作用是将文件名用字符串 filename 表示的,扩展名用 fmt 表示的图像文件中的数据读到矩阵 A 中。如果 filename 所指的为灰度级图像,则 A 为一个二维矩阵;如果 filename 所指的为 RGB 图像,则 A 为一个 mn3 的三维矩阵。Filename 表示的文件名必须在 MATLAB 的搜索路径
2、范围内,否则需指出其完整路径。 imread 的其他几种重要的调用格式为:X,map=imread(filename,fmt) =imread(filename) = imread(URL,) = imread(,idx) (CUR,ICO and TIFF only) = imread(,frames,idx) (GIF only) = imread(,ref) (HDF only) = imread(,BackgroundColor,BG) (PNG only) A,map,alpha = imread() (ICO,CUR and PNG only) 上面一些参数的含义如下:idx 是指
3、读取图标(cur、ico、tiff)文件中第 idx 个图像,默认值为 1。 frame,idx 是指读取 gif 文件中的图像帧,idx 值可以是数量、向量或all 。ref 是指整数值。alpha 是指透明度2.输出图像imwrite(A,FILENAME,FMT) 把图像 A 写入图像文件 FILENAME.imwrite(X,MAP,FILENAME,FMT) 把 X 和它的相关色彩信息 MAP 写入 FILENAME. imwrite(.,FILENAME) 把图像 写入图像文件 FILENAME,并推测可能的格式用来做 filename 的扩展名。扩展名必须是 FMT 中一合法名.
4、imwrite(.,PARAM1,VAL1,PARAM2,VAL2,.) 不同的参数控制输出文件的各种不同特征。参数要是当前所支持的 HDF,JPEG, TIFF, PNG, PBM, PGM, 和 PPM 文件三:image 显示图像.image(C) 把矩阵 C 转成一图像. C 可以是一 MxN 或 MxNx3 维的矩阵,且可以是包含 double, uint8,或 uint16 数据.image 是用来显示附标图像,即显示的图像上有 x,y 坐标轴的显示,可以看到图像的像素大小。但可以加上 axis off 命令即可把坐标去掉。imshow 只是显示图像。用 colormap 来定义图
5、像显示用的颜色查找表,比如用colormap(pink),可以把黑白图像显示成带粉红色的图像。图像像素矩阵的数据类型:(1)显示真彩色图像像素三维矩阵 X,如果是 uint8 类型,要求矩阵的数据范围为 0-255, (2)如果是 double 型,则其数据范围为 0-1,要不就会出错或者出现空白页。类型转换:(1)如果你原来的数值是 uint8,在运算中转换为 double 后,实际要显示的数值没有改变的话,只要 用 uint8(X)就可转换为 uint8 型,如果不想转换频繁,也可在显示时用 X/255 来转换为符合 0-1double 类型范围要求的数值显示。 (2 ) 如果显示索引图像
6、(二维矩阵),如果索引图像像素数值是 double 型,则它的取值范围为 1-length(colormap),数值起点为 1,则矩阵中 数值为 1 的对应 colormap 中第一行数据,如果索引图像像素数值是 uint8,则取值范围为 0-255,数值起点为 0,则矩阵中数值为 0 的对应 colormap 中第一行数据,所以索引图像这两个数据类型之间的转换,要考虑到+1 或-1。直接用 uint8 或 double 转换则会查找移位,产生失真 情况。uint16 数据类型与 uint8 类似,取值范围为。图像文件的显示1) 索引图像及其显示方法一:image(X)colormap(map
7、)方法二: imshow(X,map)2) 灰度图像及其显示Matlab 7.0 中,要显示一副灰度图像,可以调用函数 imshow 或 imagesc (即 imagescale,图像缩放函数)(1) imshow 函数显示灰度图像使用 imshow(I) 或 使用明确指定的灰度级书目: imshow(I,32)由于 Matlab 自动对灰度图像进行标度以适合调色板的范围,因而可以使用自定义大小的调色板。其调用格式如下:imshow(I,low,high)其中,low 和 high 分别为数据数组的最小值和最大值。(2) imagesc 函数显示灰度图像下面的代码是具有两个输入参数的 ima
8、gesc 函数显示一副灰度图像imagesc(1,0,1);colormap(gray);imagesc 函数中的第二个参数确定灰度范围。灰度范围中的第一个值(通常是 0) ,对应于颜色映象表中的第一个值(颜色) ,第二个值(通常是 1)则对应与颜色映象表中的最后一个值(颜色) 。灰度范围中间的值则线型对应与颜色映象表中剩余的值(颜色) 。在调用 imagesc 函数时,若只使用一个参数,可以用任意灰度范围显示图像。在该调用方式下,数据矩阵中的最小值对应于颜色映象表中的第一个颜色值,数据矩阵中的最大值对应于颜色映象表中的最后一个颜色值。3) RGB 图像及其显示(1) image(RGB) 不
9、管 RGB 图像的类型是 double 浮点型,还是 uint8 或 uint16 无符号整数型,Matlab 都能通过 image 函数将其正确显示出来。RGB8 = uint8(round(RGB64255); 将 double 浮点型转换为 uint8 无符号整型RGB64 = double(RGB8)/255; 将 uint8 无符号整型转换为 double 浮点型RGB16 = uint16(round(RGB6465535); 将 double 浮点型转换为 uint16 无符号整型 RGB64 = double(RGB16)/65535; 将 uint16 无符号整型转换为 do
10、uble 浮点型(2) imshow(RGB) 参数是一个 mn3 的数组4) 二进制图像及其显示(1) imshow(BW)在 Matlab 7.0 中,二进制图像是一个逻辑类,仅包括 0 和 1 两个数值。像素 0 显示为黑色,像素 1 显示为白色。显示时,也可通过 NOT()命令,对二进制图象进行取反,使数值 0 显示为白色;1 显示为黑色。 例如: imshow(BW)(2) 此外,还可以使用一个调色板显示一副二进制图像。如果图形是 uint8 数据类型,则数值 0 显示为调色板的第一个颜色,数值 1 显示为第二个颜色。例如: imshow(BW,1 0 0;0 0 1) 5) 直接从
11、磁盘显示图像可使用一下命令直接进行图像文件的显示: imshow filename其中,filename 为要显示的图像文件的文件名。3.格式转换1、数据类型包括数值类型(整型/浮点型) 、字符类型、逻辑类型、函数句柄、结构类型、细胞数组类型,这里我们主要讨论数值类型。Matlab 中的图像数据类型转换 MATLAB 中读入图像的数据类型是 uint8,而在矩阵中使用的数据类型是 double 因此I2=im2double(I1) :把图像数组 I1 转换成 double 精度类型;如果不转换,在对 uint8 进行加减时会产生溢出,可能提示的错误为:Function * is not def
12、ined for values of class uint8。图像数据类型转换函数默认情况下,matlab 将图像中的数据存储为 double 型,即 64 位浮点数;matlab 还支持无符号整型(uint8 和 uint16) ;uint 型的优势在于节省空间,涉及运算时要转换成 double 型。im2double():将图像数组转换成 double 精度类型im2uint8():将图像数组转换成 unit8 类型 im2uint16():将图像数组转换成 unit16 类型但是:对 double 型图像用 im2uint8(),会出现问题。double 默认为 0-1 之间的数,uin
13、t8 为0-255 之间的数,如果数组 uint8 型 x1=0,1 ,2 ,转化后为 x2=0,0.5 ,1 ; 如果数组double 型 y1=0,1,2 ,转化后为 y2=0,255,255 ;在用 matlab 工具箱做直方图处理时,图像必须为整型,即如果是 double 型,必须转化为整型解决办法:图像处理工具箱1. 图像和图像数据缺省情况下,MATLAB 将图像中的数据存储为双精度类型 (double),64 位浮点数,所需存储量很大;MATLAB 还支持另一种类型无符号整型(uint8),即图像矩阵中每个数据占用 1 个字节。在使用 MATLAB 工具箱时,一定要注意函数所要求的
14、参数类型。另外, uint8与 double 两种类型数据的值域不同,编程需注意值域转换。从 uint8 到 double 的转换-图像类型 MATLAB 语句-索引色 B=double(A)+1索引色或真彩色 B=double(A)/255二值图像 B=double(A)-从 double 到 uint8 的转换-图像类型 MATLAB 语句-索引色 B=uint8(round(A-1)索引色或真彩色 B=uint8(round(A*255)二值图像 B=logical(uint8(round(A)图像格式类型1 真彩色图像R、 G、B 三个分量表示一个像素的颜色。如果要读取图像中(100,
15、50) 处的像素值,可查看三元数据(100,50,1:3)。真彩色图像可用双精度存储,亮度值范围是0,1;比较符合习惯的存储方法是用无符号整型存储,亮度值范围0,2552 索引色图像包含两个结构,一个是调色板,另一个是图像数据矩阵。调色板是一个有 3 列和若干行的色彩映象矩阵,矩阵每行代表一种颜色,3 列分别代表红、绿、蓝色强度的双精度数。注意:MATLAB 中调色板色彩强度0,1,0 代表最暗,1 代表最亮。常用颜色的 RGB 值-颜色 R G B 颜色 R G B -黑 0 0 1 洋红 1 0 1白 1 1 1 青蓝 0 1 1红 1 0 0 天蓝 0.67 0 1绿 0 1 0 橘黄
16、1 0.5 0蓝 0 0 1 深红 0.5 0 0黄 1 1 0 灰 0.5 0.5 0.5 -产生标准调色板的函数-函数名 调色板-Hsv 色彩饱和度,以红色开始,并以红色结束Hot 黑色红色黄色白色Cool 青蓝和洋红的色度Pink 粉红的色度Gray 线型灰度Bone 带蓝色的灰度Jet Hsv 的一种变形,以蓝色开始,以蓝色结束Copper 线型铜色度Prim 三棱镜,交替为红、橘黄、黄、绿和天蓝Flag 交替为红、白、蓝和黑-缺省情况下,调用上述函数灰产生一个 643 的调色板,用户也可指定调色板大小。索引色图像数据也有 double 和 uint8 两种类型。当图像数据为 doub
17、le 类型时,值 1 代表调色板中的第 1 行,值 2 代表第 2 行如果图像数据为 uint8 类型,0 代表调色板的第一行, ,值 1 代表第 2 行3 灰度图像存储灰度图像只需要一个数据矩阵。数据类型可以是 double,0,1 ;也可以是 uint8,0,2554 二值图像二值图像只需一个数据矩阵,每个像素只有两个灰度值,可以采用 uint8 或 double 类型存储。MATLAB 工具箱中以二值图像作为返回结果的函数都使用 uint8 类型。5 图像序列MATLAB 工具箱支持将多帧图像连接成图像序列。图像序列是一个 4 维数组,图像帧的序号在图像的长、宽、颜色深度之后构成第 4
18、维。分散的图像也可以合并成图像序列,前提是各图像尺寸必须相同,若是索引色图像,调色板也必须相同。可参考 cat()函数 Acat(4,A1,A2,A3,A4,A5)MATLAB 图像类型转换函数图像类型转换函数-函数名 函数功能-dither 图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像gray2ind 将灰度图像转换成索引图像grayslice 通过设定阈值将灰度图像转换成索引色图像im2bw 通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图ind2gray 将索引色图像转换成灰度图像ind2rgb 将索引色图像转换成真彩色图像mat2gray 将一个数据矩阵转换成一副灰
19、度图rgb2gray 将一副真彩色图像转换成灰度图像rgb2ind 将真彩色图像转换成索引色图像二分析图像的像素信息,平移放大,调整对比以及测量距离1.使用 impixel 获取图像像素值为了确定在一个变量的一个或多个像素的图像中 andreturn 的值的值,使用impixel function.You 可通过使它们的坐标作为输入 argumentsor 可以交互使用鼠标选择的像素指定的像素。 impixel 在 MATLAB 工作空间中的变量指定的像素 returnsthe 值。能:获取图像像素值。函数返回指定图像的红、绿、蓝颜色值语法介绍: P=impixel(I) 返回灰度图像中用户指
20、定的像素或像素集合的数据值,如果用户没有指定输入对象,impixel 对于当前轴中的图像进行操作。用户指定完后,impixel 返回一个 mX3 的矩阵 P。 P=impixel(X,map) 返回索引图像 X 和颜色表矩阵 map 中用户指定的像素或像素集合的数据值。map 列数为 3. P=impixel(RGB) 返回真彩色图像 RGB 中用户指定的像素或像素集合的数据值。 P=impixel(I,c,r) 返回灰度图像 I 中指定点的像素或像素集合的数据值。 c 和 r 指定图像中的像素点或像素点集合。 P=impixel(X,map,c,r) 返回索引图像 X 混入颜色表矩阵 map
21、 中指定的像素或像素集合的数据值。P=impixel(RGB,c,r) 返回真彩色图像 RGB 中指定点的像素或像素集合的数据值。c,r,P=impixel(.) 返回图像中像素或者像素集合的数据值 P,以及像素点坐标 c 和 r2.图像的平移F=imread(p2.bmp);se = translate(strel(1), 0 20);%参数0 20可以修改,修改后平移距离对应改变J = imdilate(F,se);figure;imshow(J,);title(右移后图形);又如下:function outImage=immove(inImage,Tx,Ty)m, n = size(in
22、Image);Tx=fix(Tx);Ty=fix(Ty);%move xif (Tx0)inImage=imcrop(inImage,abs(Tx),1,m-abs(Tx),n);m, n = size(inImage);Tx=0; end%move yif (Ty0)inImage=imcrop(inImage,1,abs(Ty),m,n-abs(Ty);m, n = size(inImage);Ty=0; endoutImage = zeros(m+Ty, n+Tx);outImage(1+Ty:m+Ty,1+Tx:n+Tx) = inImage;3、调整图像的大小 改变图像的大小可用 i
23、mresize 函数来调整。imresize 函数主要特点有: 可以指定输出图像的大小。 可以指定插值方法。 可以指定滤波器来阻止混淆。 1、 指定输出图像的大小 指定输出图像大小的方法有两种:一是指定放大因子,二是指定输出图像的维数。2、 指定插值方法 在默认的情况下,imresize 函数可用最近邻插值法来指定输出图像的像素值。当然,也可以指定其他的插值方法,以下命令行用 imresize 函数指定了双线性插值方法。 Y=imresize(X,100 150,bilinear) 例如已知 A(X1,Y1),B(X2,Y2),求 AB 的距离可以写函数:4.测距离x=X1-X2,Y1-Y2norm(x)点到直线距离 d=|A*X1+B*Y1+C|/sqrt(A2+B2)