MATLAB 数字图像处理工具箱
3.1 MATLAB 图像预处理
3.1.1 图像处理的基本操作
1. 读入并显示一幅图像
clear
close all
I=imread ('pout.tif'); %读取图像 pout.tif(该图像是图像处理工具箱自带的图像),
%清除所有的工作平台变量
%关闭已打开的图形窗口
imshow(I)
%存储在一个名为 I 的数组中
%显示图像 I
2. 检查内存中的图像
whos
%查看图像数据 I 是如何存储在内存中的。
3. 实现直方图均衡化
figure
imhist(I)
I2=histeq(I);
figure,imshow(I2) %显示修改过的图像 I2
figure,imhist(I2)
%生成一个新的图形窗口,避免后面的图像覆盖前面图像的显示
%创建描述图像 I 灰度分布的直方图
%将图像的灰度值扩展到整个灰度范围,从而提高图像数组 I 的对比度。
%显示拓展后的灰度值的分布情况
4. 保存图像
imwrite(I2,'pout.png'); %将图像 I2 以 PNG 图像文件格式保存到磁盘
5. 检查新生成文件的内容
imfinfo('pout2.png') %观察保存的图像文件信息
3.1.2 图像处理的高级应用
主要对一幅灰度图像 rice.tif 进行一些较为高级的操作为例说明整个过程。
1. 读取和显示图像
clear
close all
I=imread('rice.png'); %读取图像 rice.png (该图像是图像处理工具箱自带的图像)
imshow(I)
%清除所有的工作平台变量
%关闭已打开的图形窗口
%显示图像
2. 估计图像背景
background=imopen(I,strel('disk',15)); %对图像 I 进行形态学开操作,删除那些不完全包括
%在半径为 15 的圆盘中的对象,实现对背景亮度的估计
figure,imshow(background)
figure,surf(double(background(1:8:end,1:8:end))),zlim([0 255]); %以表面形式显示背景
3. 从原始图像中减去背景图像
I2=imsubtract(I,background); %将背景图像 background 从原始图像 I 中减去
figure,imshow(I2)
4. 调节图像对比度
I3=imadjust(I2,stretchlim(I2),[0 1]); %调节图像的对比度
figure,imshow(I3);
5. 使用阈值操作将图像转换为二进制图像
level=graythresh(I3);
bw=im2bw(I3,level);
figure,imshow(bw)
6. 检查图像中的对象个数
[labeled,numObjects]=bwlabel(bw,4); %确定图像中的米粒个数
numObjects
101
7. 检查标记矩阵
imshow(RGB_label);
grain=imcrop(labeled) %选择并显示已标记的对象和部分背景内的像素
RGB_label=label2rgb(labeled,@spring,'C','shuffle');
%将标记矩阵显示为一副伪彩色的索引图像,在伪彩色的彩色图像中,
%标记矩阵中的每一个对象都将被映射为相关调色板中的不同颜色
8.计算图像中对象的统计属性
graindata=regionprops(labeled,'basic')
%测量图像或者区域的属性,并返回一个结构数组。当用于一个标记图像时,%
它还为每一个标记分量创建一个结构元素。
graindata(51).Area %显示第 51 个元素的属性
graindata(51).BoundingBox,graindata(51).Centroid %寻找最近的边缘和中心
allgrains=[graindata.Area]; %创建一个新的向量 allgrains,其包含每个米粒的范围
allgrains(51) %查看第 51 个元素的范围
max(allgrains) %获取最大的米粒大小
biggrain=find(allgrains==404) %返回最大米粒的标记号
mean(allgrains) %获取米粒的平均大小
hist(allgrains,20) %绘制包含 20 个柱的直方图
3.2 MATLAB 图像处理工具箱简介
3.2.1 常用图像格式
图像格式:是存储图像采用的文件格式。不同的操作系统、不同的图像处理软件,所支持的
图像格式都有可能不同。
在实际应用中经常会遇到的图像格式有:BMP、GIF、TIFF、PCX、JPEG、PSD、PCD、
WMF 等。
*(1) BMP(Bitmap)文件
*(2)GIF 文件
*(3)TIF 文件
*(4)JPEG 文件
3.2.2 MATLAB 图像类型
图像类型:是指数组数值与像素颜色之间定义的关系,它与图像格式概念有所不同。
在 MATLAB 图像处理工具箱中,有五种类型的图像:
(1) 二进制图像
在一幅二进制图像中,每一个像素将取两个离散数值(0 或 1)中的一个,从本质上说,这
两个数值分别代表状态“开”(on)或“关”(off)。
二进制图像仅使用 unit8 或双精度类型的数组来存储。
在图像处理工具箱中,任何返回一幅二进制图像的数组均使用 unit8 逻辑数组存储该图
像,并且使用一个逻辑标志来指示 unit8 逻辑数组的数据范围。
若逻辑状态为“开”(on),数组范围为[0,1];若为“关”(off),则数组范围为[0,255]。
(2) 索引图像
索引图像:是一种把像素值直接作为 RGB 调色板下标的图像。
在 MATLAB 中,索引图像包含有一个数据矩阵 X 和一个颜色映射(调色板)矩阵 map。
数据矩阵:可以是 unit8、unit16、双精度类型的;
颜色映射矩阵 map:是一个 m×3 的数据矩阵,其中每个元素的值均为[0,1]之间的双精度浮
点型数据,map 矩阵的每一行分别表示红色、绿色和蓝色的颜色值。
索引图像可把像素值直接映射为调色板数值,每一个像素的颜色通过使用 X 的数值作为
map 的下标来获得,如值 1 指向矩阵 map 中的第一行,值 2 指向第二行,依此类推。
颜色映射通常与索引图像存储在一起,当装载图像时,MATLAB 自动将颜色映射表与图
像同时装载。
图像矩阵与颜色映射表之间的关系依赖于图像数据矩阵的类型。
如果图像数据矩阵是双精度类型,则数据 1 指向矩阵 map 中的第一行,数据值 2 将指向
map 中的第二行,依此类推;
如果图像矩阵是 unit8 或 unit16 类型时,将产生一个偏移,即数值 0 表示矩阵 map 中的
第一行,数据值 1 将指向 map 中的第二行,依此类推。
(3) 灰度图像
灰度图像通常由一个 unit8、unit16、双精度类型的数组来描述,其实质是一个数据矩阵 I,
该矩阵中的数据均代表了在一定范围内的灰度级,每一个元素对应于图像的一个像素点,通
常 0 代表黑色,1、255、65 535(针对不同存储类型)代表白色。
(4) 多帧图像
多帧图像是一种包含多幅图像或帧的图像文件,又称为多页图像或图像序列。
在 MATLAB 中,它是一个四维数组,其中第四维用来指定帧的序号。
在一个多帧图像数组中,每一幅图像必须有相同的大小和颜色分量,每一幅图像还要使
用相同的调色板。另外,图像处理工具箱中的许多函数(如:imshow)只能对多幅图像矩阵
的前两维或三维进行操作,也可以对四维数组使用这些函数,但是必须单独处理每一帧。如
果将一个数组传递给一个函数,并且数组的维数超过该函数设计的超作维数,那么得到的结
果是不可预知的。
(5) RGB 图像
RGB 图像又称为真彩色图像,它是利用 R、G、B 三个分量表示一个像素的颜色,R、G、
B 分别代表红、绿、篮 3 种不同的颜色,通过三基色可以合成出任意颜色。所以对一个尺寸
为 n×m 的彩色图像来说,在 MATLAB 中则存储为一个 n×m×3 的多维数据数组,其中数
组中的元素定义了图像中的每一个像素的红、绿、篮颜色值。图形文件格式把 RGB 图像存储
为 24 位的图像,红、绿、篮分量分别占用 8 位。
MATLAB 的 RGB 数组可以是双精度的浮点型、8 位或 16 位无符号的整数类型。在一个
双精度类型的 RGB 数组中,每一个颜色分量都是一个[0,1]范围内的数值。如:颜色分量为(0,0,0)
的像素将显示为黑色;颜色分量为(1,1,1)的像素将显示为白色。每一个像素的三个颜色分量
都存储在数组的第三维中。如:像素(10,5)的红、绿、篮颜色值分别保存在元素 RGB(10,5,1)、
RGB(10,5,2)、RGB(10,5,3)中。
例:创建一个简单的 RGB 图像,该图像包含某一范围内不中断的红、绿、篮颜色分量,另外,
针对每一个颜色分量各创建一幅图像来加以对比:
RGB=reshape(ones(64,1)*reshape(jet(64),1,192),[64,64,3]);
R=RGB(:,:,1);
G=RGB(:,:,2);
B=RGB(:,:,3);
subplot(2,2,1);imshow(R);
subplot(2,2,2);imshow(G);
subplot(2,2,3);imshow(B);
subplot(2,2,4);imshow(RGB);
3.2.3 MATLAB 图像类型转换
X=dither(RGB,map) %通过抖动算法将真彩色图像 RGB 按指定的颜色(调色板)map 转换
(1)图像颜色浓淡处理(图像抖动)
X=dither(RGB,map,Qm,Qe)
成索引色图像 X
%利用给定的参数 Qm,Qe 从真彩色图像 RGB 中产生索引色图像 X。
%Qm 表示沿每个颜色轴反转颜色图的量化(即对于补色各颜色轴)的位数,
%Qe 表示颜色空间计算误差的量化误差。
%如果 Qe
RGB=imread('autumn.tif');
subplot(1,2,1);imshow(RGB);
Y=dither(RGB,map)
subplot(1,2,2);imshow(Y,map);
(2)灰度图像转换为索引图像
[X,map]=gray2ind(I,n) %按指定的灰度级数 n 和颜色图 map,将灰度图像 I 转换成索引色
%图像 X,n 的默认值为 64。
例:将灰度图像 pout.tif 转化成索引图像 X,颜色图分别为 gray(128)和 gray(16)。
I=imread('pout.tif');
[I1,map1]=gray2ind(I,128);
[I2,map2]=gray2ind(I,16);
subplot(1,3,1);imshow(I1,map1);
subplot(1,3,2);imshow(I2,map2);
subplot(1,3,3);imshow(I);
(3)索引图像转换为灰度图像
I=ind2gray(X,map) %将具有颜色图 map 的索引色图像 X 转换成灰度图像 I,去掉了图像的
%色度和饱和度,仅保留了图像的亮度信息。
%输入图像可以是 double 或 unit8 类型。
例:将一幅索引图像 trees.mat 转换成灰度图像。
load trees
I=ind2gray(X,map);
subplot(1,2,1);imshow(X,map);
subplot(1,2,2);imshow(I);
(4)RGB 图像转换为灰度图像
I=rgb2gray(RGB)
Newmap=rgb2gray(map) %将颜色图 map 转换成灰度级颜色图。
%将真彩色图像 RGB 转换成灰度图像 I。
注意:如果输入的是真彩色图像,则图像可以是 8 位无符号类型或双精度类型,输出图像 I
与输入图像类型相同。
如果输入的是颜色图,则输入和输出的图像均为双精度类型。
*例:将 RGB 图像 flowers.tif 转换为灰度图像。
RGB=imread('flowers.tif');
figure(1);imshow(RGB)
figure(2);Y=rgb2gray(RGB);imshow(Y)
(5)RGB 图像转换为索引图像
[X,map]=rgb2ind(RGB) %直接将 RGB 图像转换为具有颜色图 map 的矩阵 X.
[X,map]=rgb2ind(RGB,tol) %用均匀量化的方法将 RGB 图像转换为索引图像 X.
[X,map]=rgb2ind(RGB,n) %使用最小方差量化的方法将 RGB 图像转换为索引图像,
X=rgb2ind(RGB,map)
[…]=rgb2ind(…,dither_option)
%map 中包括至少 n 个颜色。
%通过将 RGB 中的颜色与颜色图 map 中最相近的颜色匹配,
%将 RGB 图像转换为具有 map 颜色图的索引图像。
%通过 dither_option 参数来设置是否抖动。dither_option 为 dither 表示使用抖动,以达到
%较好的颜色效果;缺省时为 nodither,使用了新颜色图中最接近的颜色来画原图的颜色。
*例:将 RGB 图像 flowers.tif 转换为索引图像。
RGB=imread('flowers.tif');
figure(1);imshow(RGB)
figure(2);Y=rgb2ind(RGB,128);imshow(Y)
(6)索引图像转换为 RGB 图像
RGB=ind2rgb(X,map) %将矩阵 X 及相应颜色图 map 转化成真彩图像 RGB。
输入图像 X 可以是双精度类型或 8 位无符号类型,输出图像 RGB 为双精度类型。
例:将索引图像 wmandril.mat 转换为 RGB 图像。
load wmandril;
figure(1);imshow(X,map);
I=ind2rgb(X,map);
figure(2);imshow(I)
(7)通过阈值化方法将图像转换为二值图像
im2bw 函数:通过设置亮度阈值将真彩图像、索引图像及灰度图像转化成二值图像。在
转换过程中,如果输入图像不是灰度图像,首先将其转换为灰度级图像,然后通过阈值化将
灰度级图像转换成二值图像。输出二值图像在输入图像所有亮度小于给定值(level 取值范围
为[0,1])像素点处均为 0,其他均为 1。其语法格式为:
BW=im2bw(I,level)
BW=im2bw(X,map,level) %将带有颜色图 map 的索引图像 X 转化为黑白二值图像。
BW=im2bw(RGB,level) %将 RGB 图像转化为黑白二值图像。
注意:输入图像可以是双精度类型或 8 位无符号类型,输出图像为 8 位无符号类型。
%将灰度图像 I 转化为黑白二值图像。
例:通过阈值化方法将索引图像 trees.mat 转换为二值图像,阈值为 0.4。
load trees;
BW=im2bw(X,map,0.4);
figure(1);imshow(X,map);
figure(2);imshow(BW)
(8)通过阈值化方法从灰度图像产生索引图像
X=grayslice(I,n) %将灰度图像 I 均匀量化为 n 个等级,然后转换为伪彩色图像 X。
X=grayslice(I,v) %按指定的阈值向量 v(每一个元素都在 0 和 1 之间)对图像 I 的值域进行
注意:输入图像 I 可以是双精度类型或 8 位无符号类型。
划分,而后转换成索引图像 X。
如果阈值数量小于 256,则返回图像 X 的数据类型是 8 位无符号类型,X 的值域为[0,n]
或[0,length(v)];
否则,返回图像 X 为双精度类型,值域为[1,n+1]或[1,length(v)+1]。
*例:将一幅灰度图像转换成索引图像。
I=imread('alumgrns.tif');
figure(1);imshow(I);
X=grayslice(I,16);
figure(2);imshow(X,hot(16));
(9)将矩阵转换为灰度图像
I=mat2gray(X,[xmin,xmax])
%按指定的取值区间[xmin,xmax]将数据矩阵 X 转换为图像 I,xmin 对应灰度 0(最暗即
黑),%xmax 对应灰度 1(最亮即白)。如果不指定区间[min,max]时,MATLAB 则自动将 X
阵中%最小设为 xmin,最大设为 xmax。
注意:输入 X 和输出图像 I 都是双精度类型。实际上,mat2gray 函数与 imshow 函数功能类
似。Imshow 函数也可用来使数据矩阵可视化。
*例:将图像滤波后产生的矩阵转换为灰度图像。
I=imread('saturn.tif');
J=filter2(fspecial('sobel'),I);
K=mat2gray(J);
figure(1);imshow(I);
figure(2);imshow(K);
3.3 图像的显示
图像的显示过程:将图像从一组离散数据还原为一幅可见的图像的过程。
图像的显示是提高图像处理分析性能非常有用的一个手段,通过图像的显示,可以监视
图像处理过程,并与处理分析交互地控制处理分析过程。
图像显示最重要的特性是图像的大小、光度分辨率、灰度线性、平坦能力和噪声特性等,
这些显示特性将共同决定一个数字图像显示系统的质量及其在特定应用中的适用性等性能指
标。
3.3.1 标准图像显示技术
Matlab 显示图像的主要方法是调用 image 函数,该函数可创建一个句柄图形图像对象,
并且包含设置该对象的各种属性的调用语法;此外,还提供了与 image 函数类似的 imagesc
函数,利用该函数,可以实现对输入图像数据的自动缩放。同时,还包含了一个附加的显示
函数,即 imshow 函数,与 image 和 imagesc 函数类似,imshow 函数可用于创建句柄图形图
像对象。此外,该函数也可以自动设置各种句柄属性和图像特征,以优化显示效果。
(1)imshow 函数
当调用 imshow 函数显示图像时,将自动设置图形窗口、坐标轴和图像属性,以控制图
像数据在 MATLAB 的解释方式。
在 Matlab 中,imshow 函数的语法如下:
imshow(I,n)
imshow(I,[low,high])
imshow(BW)
imshow(…,display_option)
imshow(x,y,A, …)
imshow filename
h=imshow(…)
根据用户使用参数的不同和 MATLAB 工具箱的设置,imshow 函数在调用时除了完成前
面提到的属性设置外,还可以:①设置其他的图形窗口对象和坐标轴对象的属性以定制显示
效果。例如,可以通过设置隐藏坐标轴及其标示;②包含或隐藏图像边框;③调用函数以显
示没有彩色渐变效果的图像。
(2)显示索引图像
利用 imshow 函数显示 MATLAB 的索引图像时,可以同时指定图像的数据矩阵和颜色映
射表,形如:
imshow(X,map)
其中,对于 X 中的每个像素,imshow 都将其显示为存储在 map 映射表矩阵的相应的行所对
应的颜色。
(3)显示灰度图像
调用 imshow 函数显示灰度图像的语法如下:
imshow(I)
imshow(I,N)
其中:I 为灰度图像数据矩阵,N 为整数,用于指定对应于灰度颜色映射表中的索引数。
*例:I=imshow('windows.bmp');
imshow(I,64);
%绘制出具有 64 个灰度等级的灰度图
*例:I=imshow('windows.bmp');
imshow(I,2);
%绘制出具有 2 个灰度等级的灰度图,即黑白图。
(4)显示二进制位图
imshow 函数显示二进制位图的语法如下:
imshow(BW)
如果该位图的图像矩阵属于类 double,则 imshow 函数将其显示为灰度图来对待,图像
数据矩阵中值 0 所对应的像素显示为黑色,值 1 所对应的像素显示为白色。
(5)显示 RGB 图像
显示 RGB 图像的语法如下:
imshow(RGB)
其中:RGB 为一个 m×n×3 的图像数据矩阵。在 Matlab 中,该数据矩阵属于类 double、
类 uint8 或 uint16。
(6)显示图形文件中的图像
通常情况下,在显示图像时,该图像的对象数据保存在 MATLAB 运行内存中的一个或多
个变量中。但是,如果用户将图像保存在可以通过 imread 函数读取的图形文件中,则可通过
下面的语法直接将其显示出来:
imshow filename
如果图像是多帧的,那么 imshow 将仅仅显示第一帧,这种调用格式对于图像扫描非常
有用。
注意:在使用这种格式时,该图形文件必须在当前目录下,或在 MATLAAB 目录下。
如果图像数据没有保存在 MATLAB 工作平台中,可以通过使用 getimage 函数将从当
前的句柄图形图像对象中获取图像数据。
*例:rgb=getimage;
下面的代码可以显示一幅小孩儿的图像:
imshow kids.tif
(7)显示非图像数据
非图像数据:是指其数据矩阵的元素值落在“合法”范围之外。