1、第五讲 MATLAB可视化(三) 图像显示 Matlab进行图像处理的步骤如下: 读取图像到Matlab工作空间 ↓ 对图像矩阵进行格式转换 ↓ 对图像矩阵数据进行处理 ↓ ↓ 显示图像 保存图像 【目录】 一、图像文件格式 2 1、调色板 2 2、图像类型 2 3、图像文件格式 3 二、读图像和图像信息 3 1、读取图像 3 2、读取图像信息 4 三、图像类别与数据格式 5 四、图像显示 7 1、imshow(I,n) 7 2、imshow(I,[low,high]) 8 3、imshow(BW) 9 4、im
2、show(X,MAP) 12 5、imshow(RGB) 13 6、imshow filename 14 7、subimage 14 五、保存图像 15 1、imwrite函数 15 六、图像数据格式转换 16 1、索引图像 16 2、灰度图像 16 3、真彩色图像 17 4、二值图像 17 【正文】 一、图像文件格式 1、调色板 调色板是包含不同颜色的颜色表,每种颜色以红、绿、蓝三种颜色的组合来表示,图像的每一个像素对应一个数字,而该数字对应调色板中的一种颜色。 调色板的单元个数是与图像的颜色数相对应的,256色图像的调色板就有256个单元。 真彩图像的每
3、个像素直接用R、G、B三个字节来表示颜色,因此不需要调色板。 2、图像类型 图像类型 简称 显示的颜色数 特 点 1位单色 单色 21=2种(黑、白) 每象素对应一个值,取值为0和1 8位灰度 黑白 28=256个(黑到白) 每象素对应一个值,取值为0-255,每值对应一灰度 8位彩色 256色 28=256种彩色 每象素对应一个值,取值为0-255,每值对应一颜色 16位灰度 216=65536个(黑到白) 每象素对应一个值,取值为0-65535,每值对应一灰度 24位彩色 真彩色 28×28×28=16M种彩色 每象素对应三个值,分
4、别代表R、G、B,取值为0-255 48位彩色 216×216×216=0.25G种色 每象素对应三个值,分别代表R、G、B,取值为0-65535 3、图像文件格式 文件 类型 说明 1位 单色 8位 灰度 8位 彩色 16位 灰度 24位 彩色 48位 彩色 BMP 微软视窗系统图像文件格式 √ √ √ × √ × GIF 用于网页上的动画、透明 √ √ √ × × × TIFF 可储存多幅图像 √ √ √ √ √ √ PCX Paintbrush软件图像格式 √ √ √ × √ ×
5、 JPG 连续色调静态图像数字压缩 × √ × × √ × PSD Photoshop软件图像格式 √ √ √ √ √ √ 二、读图像和图像信息 1、读取图像 函数imread可以从任何Matlab支持的图像文件格式中,以任意位深度读取一幅图像。格式为: [X,MAP]=imread(FILENAME,'FMT'),其中: FILENAME-为需要读入的图像文件名称,FMT-为图像格式。 【例】图像读取演示 [X1,MAP1]=imread('演示图像-1位黑白.tif'); [X2,MAP2]=imread('演示图像-8位灰度.tif');
6、 [X3,MAP3]=imread('演示图像-256色.tif'); [X4,MAP4]=imread('演示图像-16位灰度.tif'); [X5,MAP5]=imread('演示图像-24位色.tif'); [X6,MAP6]=imread('演示图像-48位色.tif'); whos Name Size Bytes Class MAP1 0x0 0 double array MAP2 0x0
7、 0 double array MAP3 256x3 6144 double array MAP4 0x0 0 double array MAP5 0x0 0 double array MAP6 0x0 0 double array X1 427x427 182329 logical a
8、rray X2 427x427 182329 uint8 array X3 427x427 182329 uint8 array X4 427x427 364658 uint16 array X5 427x427x3 546987 uint8 array X6 427x427x3 1093974 uint16 array Grand total
9、is 1824058 elements using 2558750 bytes 2、读取图像信息 可以通过调用imfinfo函数获得与图像文件有关的信息,格式如下: INFO=imfinfo(FILENAME,'FMT')其中: 返回的INFO是Matlab的一个结构体。 【例】查看图像信息 INFO=imfinfo('演示图像-48位色.tif') INFO = Filename: [1x36 char] FileModDate: '23-May-2004 22:14:23'
10、 FileSize: 1107548 Format: 'tif' FormatVersion: [] Width: 427 Height: 427 BitDepth: 48 ColorType: 'truecolor' FormatSignature: [73 73
11、42 0] ByteOrder: 'little-endian' NewSubfileType: 0 BitsPerSample: [16 16 16] Compression: 'Uncompressed' PhotometricInterpretation: 'RGB' StripOffsets: 13528 SamplesPerPixel: 3
12、 RowsPerStrip: 427 StripByteCounts: 1093974 XResolution: 2.7115 YResolution: 2.7115 ResolutionUnit: 'Inch' Colormap: [] PlanarConfiguration: 'Chunky' TileWidth: []
13、 TileLength: [] TileOffsets: [] TileByteCounts: [] Orientation: 1 FillOrder: 1 GrayResponseUnit: 0.0100 MaxSampleValue: [65535 65535 65535] MinSampleValue: 0
14、 Thresholding: 1 NewSubFileType: 0 Software: 'Adobe Photoshop 7.0 ' DateTime: '2004:05:23 22:14:23 ' 三、图像类别与数据格式 双精度类:Double (每个元素占8个字节) 整数类:Unit8 (每个元素占1个字节) 整数类(Unit16) (每个元素占2个字节) 真 彩 图 像 数组大小:m×n×3 (:,:,1)-红色分量
15、2)-绿色分量 (:,:,3)-蓝色分量 元素取值:[0,1] (无调色板) 数组大小:m×n×3 (:,:,1)-红色分量 (:,:,2)-绿色分量 (:,:,3)-蓝色分量 元素取值:[0,255] (无调色板) 数组大小:m×n×3 (:,:,1)-红色分量 (:,:,2)-绿色分量 (:,:,3)-蓝色分量 元素取值:[0,65535] (无调色板) 索 引 图 像 图像数组大小:m×n 图像元素取值:[1,p] 色度矩阵:p×3 色度元素值:[0,1] 图像数组大小:m×n 图像元素取值:[0,p-1] 色度矩阵:
16、p×3 色度元素值:[0,255] 图像数组大小:m×n 图像元素取值:[0,p-1] 色度矩阵:p×3 色度元素值:[0,65535] 灰 度 图 像 图像数组大小:m×n 图像元素值:[0,1] 色度矩阵:p×3 色度元素值:[0,1] 图像数组大小:m×n 图像元素值:[0,255] 色度矩阵:p×3 色度元素值:[0,1] 图像数组大小:m×n 图像元素值:[0,65535] 色度矩阵:p×3 色度元素值:[0,1] 二 值 图 像 图像数组大小:m×n 图像元素值:0或1 图像数组大小:m×n 图像元素值:0或
17、1 四、图像显示 Matlab的图像显示函数主要有imshow、colorbar和subimage三个。 1、imshow(I,n) 显示灰度级为n的图像,n缺省为256。 【例】按256灰度级显示 I=imread('moon.tif'); imshow(I,256) colorbar 【例】按8灰度级显示 I=imread('moon.tif'); imshow(I,8) colorbar 2、imshow(I,[low,high]) 以灰度范围[low,high]显示图像,如果不知道灰度范围,可以用imshow(I,[])显示。 【例
18、按最大灰度范围显示 I=imread('moon.tif'); imshow(I,[]) colorbar 【例】按指定灰度范围显示 I=imread('moon.tif'); imshow(I,[64,128]) colorbar 3、imshow(BW) 显示二值图像。 【例】双精度灰度图像 bw1=zeros(100,100); bw1(2:2:98,2:2:98)=1; imshow(bw1); whos bw1 Name Size Bytes Class bw1
19、100x100 80000 double array Grand total is 10000 elements using 80000 bytes 【例】8位的灰度图像 bw1=zeros(100,100); bw1(2:2:98,2:2:98)=1; bw2=uint8(bw1); imshow(bw2,[]); colorbar whos bw2 Name Size Bytes Class bw2 100x100 10000
20、 uint8 array Grand total is 10000 elements using 10000 bytes 【例】二值图像 bw1=zeros(100,100); bw1(2:2:98,2:2:98)=1; bw2=uint8(bw1); bw3=bw2~=0; imshow(bw3); whos bw3 Name Size Bytes Class bw3 100x100 10000 logical array Grand total is 10
21、000 elements using 10000 bytes 【例】显示二值图像 BW=imread('circles.tif'); imshow(BW); 【例】取反显示二值图像 BW=imread('circles.tif'); imshow(~BW); 【例】显示二值图像 clf BW=imread('circles.tif'); imshow(BW,[1 0 0;0 0 1]); 4、imshow(X,MAP) 显示索引图像,X为数据图像矩阵,MAP为调色板。 【例】显示索引图像 [X,MAP]=imread('canoe.tif'
22、); imshow(X,MAP); colorbar 【例】显示伪彩色图像 I=imread('moon.tif'); imshow(I,jet(256)) colorbar 5、imshow(RGB) 显示真彩色图像。 【例】 rgb=imread('flowers.tif'); imshow(rgb); 6、imshow filename 直接显示图像。 【例】直接显示图像 imshow('moon.tif'); I=getimage; whos I Name Size Byt
23、es Class I 537x358 192246 uint8 array Grand total is 192246 elements using 192246 bytes 7、subimage 多图显示多个调色板的图像。 【例】 load trees; [x2,map2]=imread('forest.tif'); subplot(2,1,1),subimage(X,map);colorbar subplot(2,1,2),subimage(x2,map2);colorbar 【例】不用专用函数显示多图
24、load trees; [x2,map2]=imread('forest.tif'); subplot(2,1,1),imshow(x2,map2);colorbar subplot(2,1,2),imshow(X,map);colorbar 五、保存图像 1、imwrite函数 imwrite(I,'文件名','文件格式')-保存无调色板的图像 imwrite(X,MAP,'文件名','文件格式')-保存有调色板的图像 imwrite(...,'文件名')-文件名中含格式 imwrite(...,'参数','值')-指定保存参数 文件格式:bmp、jpg、pcx、ti
25、f。 【例】将tif图像保存为jpg图像 [x,map]=imread('canoe.tif'); imwrite(x,map,'canoe.jpg','JPG','Quality',75) 六、图像数据格式转换 double uint8 uint16 1、索引图像 假设:X8-表示8位的索引图像,X16-表示16位的索引图像,X64-表示双精度的索引图像,则有: X64=double(X8)+1 -uint8格式转double格式 X64=double(X16)+1 -uint16格式转double格式 X8=uint8(X64-1) -double格
26、式转uint8格式 X16=uint16(X64-1) -double格式转uint16格式 X8=uint8(X16) -uint16格式转uint8格式 X16=uint16(X8) -uint8格式转uint16格式 2、灰度图像 假设:I8-表示8位的灰度图像,I16-表示16位的灰度图像,I64-表示双精度的灰度图像,则有: I64=double(I8/255) -uint8格式转double格式 I64=double(I16/65535) -uint16格式转double格式 I8=uint8(round(I
27、64*255)) -double格式转uint8格式 I16=uint16(round(I64*65535)) -double格式转uint16格式 I8=uint8(round(I16/257)) -uint16格式转uint8格式 I16=uint16(round(I8*257)) -uint8格式转uint16格式 3、真彩色图像 假设:RGB8-表示8位的真彩图像,RGB16-表示16位的真彩图像,RGB64-表示双精度的真彩图像,则有: RGB64=double(RGB8/255) -uint8格式转double格式
28、RGB64=double(RGB16/65535) -uint16格式转double格式 RGB8=uint8(round(RGB64*255)) -double格式转uint8格式 RGB16=uint16(round(RGB64*65535)) -double格式转uint16格式 RGB8=uint8(round(RGB16/257)) -uint16格式转uint8格式 RGB16=uint16(round(RGB8*257)) -uint8格式转uint16格式 4、二值图像 假设BW8表示8位二值图像,BW64表示双精度二值图像,则有: BW64=double(BW8) uint8格式转double格式 BW8=uint8(BW64)~=0 double格式转uint8格式 plot3(X,Y,Z,'bo')






