图像矩阵和颜色查找表中值之间的关系取决于图像矩阵的类型。如果图像矩阵是double型的,值1指向颜色查找表的第一行,值2指向第二行,依此类推。如果图像矩阵的uint8或uint16类型的,就会存在偏移——值0指向颜色查找表的第一行,值1指向第二行,依此类推。
偏移还用在图形文件格式中,使得可以支持的颜色个数最大化。在前的图像中,图像矩阵是double类型的。因为没有偏移,值5指向颜色查找表的第5行。
注意,对于uint16类型,工具箱只提代了有限的支持。可以将这种类型的数据读入MATLAB并且显示它们,但是在处理uint16类型的索引图像以前,必须首先将它转换为double型或uint8型。要转换为double型,调用im2double函数;要将图像转换为256色,调用imapprox函数。
2.1.2灰度图像
灰度图像是一个数据矩阵I, 其值表示一定范围内的亮度值。MATLAB将一幅灰度图像保存为一个单一的矩阵,矩阵的每个元素对应于一个图像像素。矩阵可以是double,uint8或uint16型的。
亮度矩阵中的元素表示不同的这度或灰度级,其中亮度0通常表示黑色,亮度1 255或65 535通常表示饱和亮度或白色。
图2-2描述一个double型灰度图像。
图2-2 灰度图像中的像素值
2.1.3 二值图像
在二值图像中,假设每个像素取两个离散值中的一个:这两个值对应于on和off。二值图像保存为logical数组,值为0和1。图2-3描述一幅二值图像。
图2-3 二值图像中的像素值
3
2.1.4 RGB图像
RGB图像有时称为真彩色图像,在MATLAB中保存为m×n×3的数据数组,定义每个单独像素的红、绿色和蓝色组分。RGB图像不使用调色板。每个像素的颜色由像素位置上红色、绿色和蓝色亮度的组合确定。RGB图像是24位图像,其中红色、绿色和蓝色组分均为8位。这将产生一千六百多万种颜色。采用这些颜色,在精度上可以逼近现实场景中图像像的真实颜色。所以,RGB图像又称为真彩色图像。
RGB数组可以是double,uint8或uint16型的。在double类型的RGB数组中,每一个颜色组分的值取0和1之间的数。一个颜色组分(0,0,0)的像素显示为黑色,颜色组分为(1,1,1)的像素显示为白色。每个像素的这3种颜色组分保存在数据数组的第三维上。例如,像素(10,5)的红色、绿色和蓝色组分分别保存在RGB(10,5,1),RGB(10,5,2)和RGB(10,5,3)。
图2-4描述一幅double型的RGB图像。
图2-4 RGB图像的颜色面板
要知道像素(2,3)处的颜色,可以查看保存在(2,3,1:3)中的3个一组的RGB值。假设(2,3,1)包含值0.5176,(2,3,2)包含值0.1608,(2,3,3)包含值0.0627,则像素(2,3)处的颜色为
0.5176 0.1608 0.0627
2.2 读写图像数据
2.2.1 读取图像数据
imread函数从任何受支持的图形图像文件格式和位深读取图像,大部分图像文件格式使用8位来保存像素值,读处内存时,MATLAB把它们保存为uint8型。对于支持16位数据的文件格式,如PNG和TIFF,MATLAB把图像保存为uint16类型。
注意,对于索引图像,imreae函数总是把颜色映射读入到一个double型数组,即使图像数组自身是uint8或uint16类型时也是如此。
例如,下面的代码将一幅RGB图像读入到MATLAB工作空间,并用变量RGB表示。 RGB=imread(‘foottball.jpg’);
本例中,imread函数从文件的内容推测文件所使用的格式。也可以将文件格式作为一个变量指定给 imread函数。MATLAB支持许多通用的图形文件格式,如BMP,GIF,JPEG,PNG和TIFF等。
MATLAB支持几种图形文件格式,如HDF和TIFF,它们可以包含多幅图像。默认时,imreae函数只从
4
文件中输入第一幅图像。要从文件中输入其他图像,需要使用文件格式支持的语句。
例如,使用TIFF文件时,可以将一个索引值与imread函数一起使用来确定文件中希望输入的图像。本例从一个TIFF文件中读取27幅系列图像并把图像保存到一个四维数组中。可以用imfinfo函数确定文件中保存的图像幅数。
mri=uint8(zeros(128,128,1,27)); %预分配四维数组 for frame=1:27
[mri(:,:,:,frame),map]=imread(‘mri.tif’,frame); end
当文件含有多幅相关图像,比如时间序列图像时,可以将它们保存为四维数组。要求所有图像的大小相同。
2.2.2 转换图像的存储类型
使用MATLAB函数double,可以将uint8和uint16型数据转换为double双精度型。但是,存储类型之间的转换改变了MATLAB和工具箱解释图像数据的方式。如果希望生在的数组被合理解释图像数据,则需要在进行转换时调整和平衡数据。
为了便于转换存储类型,使用下面工具箱函数中的一个:im2double,im2uint8或im2uint16。这些函数自动控制原始数据的调整和平衡。如,下面的命令将一幅数据值在[0,1]范围内的双精度RGB图像转换为一幅数据大小在[0,255]范围内的uint8型RGB图像。
RGB2=im2uint8(RGB1);
把图像转换为位数更低的类型时,通常会丢失一些图像信息。例如,一个uint16型灰度图像可以存储最多65 536种不同的灰度,但uint8型灰度图像只能存储256种不同的灰度。把uint16型灰度图像转换为uint8型灰度图像时,im2uint8函数会量子化原如图像中的灰度色。换句话说,原始图像中所有从0到127的值在uint8型图像中都会变成0,从128到385的值变成1,依此类推。通常情况下,这种信息的丢失不会造成太大的问题,因为256仍然超出了人的肉眼可以识别的灰度级别数。
将一幅索引图像从一种存储类型转换为另一种类型并不总是可行的。在索引图像中,图像矩阵只包括索引值而不是颜色数据本身,所以在转换过程中无法进行颜色数据的量子化。
例如,一幅具有300种颜色的uint16或double型索引图像无法转为uint8型,因为uint8型数组只有256种不同的值。如果想进行转换,必须道先用imapprox函数减少图像中颜色个数。本函数对颜色查找表中的颜色进行量子化,以减少图像中可以分辨的颜色种数。
2.2.3 转换图像的文件格式
如果想改变图像的文件格式,用imread函数读入图像,然后用imwrite函数指定合适的格式,保存图像。 下面进行演示,用imread函数读入一幅BMP图像到工作空间中,然后将这个BMP图像用PNG格式保存到一个文件中。
bitmap=imread(‘mybitmap.bmp’,’bmp’); imwrite(bitmap,’mybitmap.png’,’png’);
2.3 图像显示
5
本节介绍如何用imshow函数显示图像,内容包括: moon=imread(‘moon.tif’); imshow(moon);
还可以简单地指定包含图像的文件的名称,并将它作为变量传递给imshow函数,如下面代码所示。注意,文件必须位于当前路径或MATLAB路径中。
imshow(‘moon.tif’);
该语法对于扫描所有图像比较有用。但是,要注意的是,使用该语法时,图像数据不是保存在MATLAB工作空间中的。如果想把图像引入工作空间,须使用getimage函数,它从当前Image对象中提取图像。如:
moon=getimage;
如果显示moon.tif图像的图形窗口当前是激活的,则将图像数据赋给变量moon。 ·将imshow函数的display_option参数设置为notruesize。即 imshow(X,map,’notruesize’)
imshow函数不使用truesize命令时,须通过插值来确定那些不直接与图像矩阵元素对应的屏幕像素的值。
6
三、“专业课程设计”实验内容与安排
实验一:图像处理基础实验
一、实验目的:
1. 掌握Matlab图像文件的打开与显示等基本方法; 2. 掌握图像数据类型转换及图像类型转换; 3. 熟悉图像矩阵的基本操作。
4、熟悉VS+OpenCV图像处理环境安装、配置及程序编写方法; 5、了解图像处理的应用价值与常见研究内容。 二、实验设备:
1、PC机或笔记本电脑,Windows操作系统;
2、安装Matlab与VS2010软件,准备实验相关图像或M文件; 3、按照如下实验内容与步骤,编写相应Matlab程序,完成实验任务。 三、实验原理:
1、MATLAB中图像数据的读写及显示
(1)imread: imread函数用于读入各种图像文件,其一般的用法为 语法: [X,MAP]=imread(‘filename’,‘fmt’)
其中,X,MAP分别为读出的图像数据和颜色表数据,fmt为图像的格式,filename为读取的图像文件(可以加上文件的路径)。
(2)imwrite: imwrite函数用于输出图像,其语法格式为:
语法: imwrite(X,map,filename,fmt)
其中, fmt指定的格式将图像数据矩阵X和调色板map写入文件filename。 (3)imfinfo: imfinfo函数用于读取图像文件的有关信息,其语法格式为
语法:imfinfo(filename,fmt)
imfinfo函数返回一个结构info,它反映了该图像的各方面信息,其主要数据包括:文件名(路径)、文件格式、文件格式版本号、文件的修改时间、文件的大小、文件的长度、文件的宽度、每个像素的位数、图像的类型等。
(4)imshow: imshow函数是最常用的显示各种图像的函数, 语法:imshow(X,map)
其中X是图像数据矩阵,map是其对应的颜色矩阵,若进行图像处理后不知道图像数据的值域可以用[]代替map。需要显示多幅图像时,可以使用figure语句,它的功能就是重新打开一个图像显示窗口。 2、程序流程控制语句 (1)for循环结构
语法:for i=初值:增量:终值
语句1 …… 语句n end
说明:1.i=初值:终值,则增量为1。
7