资源描述
1. 读入并显示一幅图像
clear %清除所有的工作平台变量
close all %关闭已打开的图形窗口
I=imread ('pout.tif'); %读取图像pout.tif(该图像是图像处理工具箱自带的图像),
%存储在一个名为I的数组中
imshow(I) %显示图像I
2. 检查内存中的图像
whos %查看图像数据I是如何存储在内存中的。
3. 实现直方图均衡化
figure %生成一个新的图形窗口,避免后面的图像覆盖前面图像的显示
imhist(I) %创建描述图像I灰度分布的直方图
I2=histeq(I); %将图像的灰度值扩展到整个灰度范围,从而提高图像数组I的对比度。
figure,imshow(I2) %显示修改过的图像I2
figure,imhist(I2) %显示拓展后的灰度值的分布情况
4. 保存图像
imwrite(I2,'pout.png'); %将图像I2以PNG图像文件格式保存到磁盘
5. 检查新生成文件的内容
imfinfo('pout2.png') %观察保存的图像文件信息
图像处理的高级应用
主要对一幅灰度图像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. 检查标记矩阵
grain=imcrop(labeled) %选择并显示已标记的对象和部分背景内的像素
RGB_label=label2rgb(labeled,@spring,'C','shuffle');
%将标记矩阵显示为一副伪彩色的索引图像,在伪彩色的彩色图像中,
%标记矩阵中的每一个对象都将被映射为相关调色板中的不同颜色
imshow(RGB_label);
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个柱的直方图
图像格式:是存储图像采用的文件格式。不同的操作系统、不同的图像处理软件,所支持的图像格式都有可能不同。
在实际应用中经常会遇到的图像格式有:BMP、GIF、TIFF、PCX、JPEG、PSD、PCD、
WMF等。
*(1) BMP(Bitmap)文件
*(2)GIF文件
*(3)TIF文件
*(4)JPEG文件
图像类型:是指数组数值与像素颜色之间定义的关系,它与图像格式概念有所不同。
在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);
(1)图像颜色浓淡处理(图像抖动)
X=dither(RGB,map) %通过抖动算法将真彩色图像RGB按指定的颜色(调色板)map转换
成索引色图像X
X=dither(RGB,map,Qm,Qe)
%利用给定的参数Qm,Qe从真彩色图像RGB中产生索引色图像X。
%Qm表示沿每个颜色轴反转颜色图的量化(即对于补色各颜色轴)的位数,
%Qe表示颜色空间计算误差的量化误差。
%如果Qe<Qm,则不进行抖动操作。Qm的默认值是5,Qe的默认值是8。
BW=dither(I) %通过抖动算法将矩阵I中的灰度图像转换为二进制图像。
注意:
输入图像可以是双精度类型或8位无符号类型,其他参数必须是双精度类型。
如果输出的图像是二值图像或颜色种类少于256的索引图像时,为uint8类型,否则为doule型。
例:由RGB图像产生一个索引图像
使用索引图像chess.met的颜色图map,通过抖动map中的颜色,产生RGB图像autumn.tif的近似索引图像。
load chess;
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) %将真彩色图像RGB转换成灰度图像I。
Newmap=rgb2gray(map) %将颜色图map转换成灰度级颜色图。
注意:如果输入的是真彩色图像,则图像可以是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图像转换为索引图像,
%map中包括至少n个颜色。
X=rgb2ind(RGB,map) %通过将RGB中的颜色与颜色图map中最相近的颜色匹配,
%将RGB图像转换为具有map颜色图的索引图像。
[…]=rgb2ind(…,dither_option)
%通过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) %将灰度图像I转化为黑白二值图像。
BW=im2bw(X,map,level) %将带有颜色图map的索引图像X转化为黑白二值图像。
BW=im2bw(RGB,level) %将RGB图像转化为黑白二值图像。
注意:输入图像可以是双精度类型或8位无符号类型,输出图像为8位无符号类型。
例:通过阈值化方法将索引图像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的值域进行
划分,而后转换成索引图像X。
注意:输入图像I可以是双精度类型或8位无符号类型。
如果阈值数量小于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)显示非图像数据
非图像数据:是指其数据矩阵的元素值落在“合法”范围之外。
对于double数组来说,该范围是[0,1];
对于uint8数组来说,该范围是[0,255];
对于uint16数组来说,该范围是[0,65 535]。
例:假设将一个灰度图进行过滤操作,则得到的结果数据可能在“合法”范围之外。此时显
示该结果数据必须使用下面的语法:
imshow(I,[low,high])
*例:先读取testpat.tif图形文件,然后对其进行过滤操作,再将结果数据显示出来:
I=imread('testpat.tif');
J=filter([1 2;-1 -2],I);
imshow(I);
figure,imshow(J,[]);
3.3.2 特殊图像显示技术
在MATLAB的影像工具箱中,除了imshow函数外,还提供了一些实现特殊显示功能的函数。它们与MATLAB自身提供的图形函数相结合,为图像显示提供了各种特殊显示技术,包括有:
①图像显示中添加颜色条;
②显示多帧图像阵列;
③图像上的区域缩放;
④将图像纹理映射到表面对象上;
⑤显示多幅图像。
(1)添加颜色条;
在MATLAB的图像显示中,可以利用colorber函数将颜色条添加到坐标轴对象中。如果该坐标轴对象包含一个图像对象,则添加的颜色条将指示出该图像中不同颜色的数据值。
*例:先过滤一个类为uint8的图像,然后将其显示为灰度图,并添加颜色条:
I=imread('saturn.tif');
h=[1 2 1;0 0 ;-1 -2 -1];
J=filter2(h,I);
imshow(J,[]);
colorbar;
(2)显示多帧图像阵列;
MTTLAB支持的多帧图像的文件格式包括HDF和TIFF两种。文件一旦被读入MATLAB,多帧图像的显示帧数由矩阵的第四维数值来决定。
在多阵列中查看图像,有下面几种方式:
①独立显示每一帧,调用imshow函数;
②同时显示所有的帧,调用montage函数;
③将多帧阵列转换为动画电影,调用immovie函数。
1)单帧显示
利用MATLAB标准的索引方法指定帧号,调用imshow函数,就可独立显示特定的帧。
例:load mri
imshow(D(:,:,:,7));
其中:D为MRI(磁共振图像)中的多帧图像阵列,调用imshow函数显示其中的第7帧。
2)多帧显示
调用montage函数可实现多帧显示,该函数的语法如下:
montage(I)
montage(BW)
montage(X,map)
montage(…)
例:显示MRI的所有帧的代码如下:
load mri
montage(D,map);
3)动画显示
利用immovie函数,可以从多帧图像阵列中创建Matlab电影动画。
值得注意的是:该函数只能应用于索引图像,所以,如果希望将其他类型的图像阵列转换为电影动画,则首先必须将该图像类型转换为索引类型。
例:mov=immovie(D,map);
colormap(map);
movie(mov)
(3)图像上的区域缩放;
利用zoom命令可实现图像上的任意区域的缩放。
在命令行中输入下面的代码:
zoom on
回车执行后,matlab的图形窗口对象进入区域缩放状态。此时,按下鼠标左键,拖动鼠标指示,则图形窗口中将出现以虚线框表示的选择矩形。松开鼠标键后,则该选中的区域将被放大到整个图形窗口的显示空间。
在放大区域中单击鼠标右键可将刚刚放大的图形恢复到原来的状态。
如果命令行输入下面的代码:
zoom off
则可关闭图形窗口的缩放功能。
(4)纹理映射
在Matlab中,专门提供了一个对图像进行纹理映射处理函数warp,使之显示在三维空间中。Wrap函数的语法格式如下:
warp(X,map)
warp(I,n)
warp(BW)
warp(RGB)
warp(z,…)
warp(x,y,z,…)
h=warp(…)
在Matlab中,纹理映射是利用双线性渐变算法将图像映射到某个表面栅格上。
*例:[x,y,z]=cylinder;
I=imread('testpat1.tif');
warp(x,y,z,I); %将testpat1.tif映射到圆柱体表面上。
有时图像可能不是按照所期望的形式进行纹理映射的,此时可以对纹理映射的外观进行修改,其方法之一就是修改坐标轴的Xdir、Ydir和Zdir属性值。
(5)显示多幅图像。
MATLAB没有对用户想要同时显示的图像数目进行限制,然而,由于受计算机硬件配置的影响,图像显示数目通常会存在一些系统限制。
显示多幅图像最简单的方法就是在不同的图形窗口中显示它们。imshow函数总是在当前窗口中显示一幅图像,如果想同时显示两幅图像,那么第二幅图像就会替代第一幅图像。为了避免图像在当前窗口中的覆盖现象,在调imshow函数之前可使用figure命令来创建一个新的空图形窗口。
例:imshow(I)
figure,imshow(I2)
figure,imshow(I3)
当采用该方法时,创建的图形窗口初始化是空白的。
如果使用的是8位显示系统,那么必须确保调色板人口的总数不超过256。
注意:灰度图像总是使用调色板来进行显示的,所以这些图像所使用的颜色通道总数不能超
过256。
为了避免产生同时显示图像的不正确的显示结果:
1)可采用对调色板进行操作的方法,使之使用较少的颜色
2)将图像转换为RGB格式再进行显示
3)使用ind2rgb函数将索引图像转换为RGB图像:imshow(ind2rgb(X,map))
4)简单使用cat命令将一幅灰度图像显示为一幅RGB图像:imshow(cat(3,I,I,I))
可以采用两种方法将多幅图像显示在同一个单独的图形窗口中。
①联合使用imshow函数和subplot函数;
②联合使用subimage函数和subplot函数;
subplot函数将一个图形窗口划分为多个显示区域,其语法格式为:
subplot(m,n,p)
这种格式将图形窗口划分为m×n个矩形显示区域,并激活第p个显示区域。
例:如果希望并排显示两幅图像,可使用以下语句:
[X1,map1]=imread('forest.tif');
[X2,map2]=imread('trees.tif');
subplot(1,2,1),imshow(X1,map1);
subplot(1,2,2),imshow(X2,map2);
若共享调色板出现的显示结果不令人满意,可以使用subimage函数来显示,也可以在装载图像时将所有图像映射到同一个调色板中,这个调色板不是共享调色板情况下所采用的某一幅图像的调色板,而是映射后包含所有图像调色板信息的一个新调色板。
subimage函数在显示图像之前首先将图像转换为RGB图像,因此不会出现调色板问题。该函数的语法格式为:
subimage(X,map) %在一个窗口里显示多个索引图像。
subimage(I) %在一个窗口里显示多个灰度图像。
subimage(RGB) %在一个窗口里显示多个真彩色图像。
subimage(x,y,…) %将图像按指定的坐标系(x,y)显示。
H=subimage(…) %返回图像对象的句柄,其中输入的图像可以是uint8或double类型。
以下代码将显示与上面同样的两幅图像,其程序清单为:
[X1,map1]=imread('forest.tif');
[X2,map2]=imread('trees.tif');
subplot(1,2,1),subimage(X1,map1);
subplot(1,2,2),subimage(X2,map2);
3.3.3图像显示中的常见问题
(1)彩色图像显示为灰度图像
图像可能是一幅索引图像,这就意味显示这幅图像需要一个调色板。产生这个问题的原因可能是在装载索引图像时函数的调用方法不正确,正确调用格式如下:
[X,map]=imread('filename.ext');
另外,还有注意使用imshow函数的正确形式:
imshow(X,map);
(2)二值图像显示为全黑图像
使用islogical或whos命令检查该图像矩阵的逻辑标志是否置为on。如果图像是逻辑的,那么whos命令将在类型头部单词array后面显示logical。如果二值图像是自己创建的,那么产生这个问题的原因可能是图像类型为uint8,记住uint8类型有灰度图像变换范围是[0,255],而不是[0,1]。
(3)装载的是多帧图像,但是MATLAB却仅仅显示一帧图像
必须单独装载多帧图像的每一帧,可以使用一个for循环来实现。可以先调用imfinfo函数获知图像帧数和图像维数。
3.4 图像运算
3.4.1图像的点运算
点运算(对比度增强、对比度拉伸、灰度变换):是一种通过对图像中的每个像素(即像素点上
的灰度值)进行计算,从而改善图像显示效果的操作。
点运算常用于改变图像的灰度范围及分布,是图像数字化及图像显示的重要工具。
典型的点运算应用包括:
①光度学标定:通过对图像传感器的非线性特性做出补偿来反映某些物理特性,如光照强度、
光密度等;
②对比度增强:调整图像的亮度、对比度,以便观察;
③显示标定:利用点运算使得图像在显示时能够突出所有用户感兴趣的特征;
④图像分割:为图像添加轮廓线,通常被用来辅助后续运算中的边界检测;
⑤图像裁剪:将输出图像的灰度级限制在可用范围。
MATLAB图像处理工具箱没有提供对图像进行直接点运算的函数,而将图像的点运算过程直接集成在某些图像处理函数组中(如:直方图均衡化函数histeq和imhist)。如果用户仅仅是希望对图像进行点运算处理,那么可充分利用MATTAB强大的矩阵运算能力,对图像数据矩阵调用各种MATLAB计算函数进行处理。
*例:将灰度图像使用的灰度变换函数进行线性点运算的程序清单:
rice=imread('rice.tif');
I=double(rice);
J=I*0.43+60;
rice2=uint8(J);
subplot(1,2,1),imshow(rice);
subplot(1,2,2),imshow(rice2);
3.4.2 图像的代数运算
图像的代数运算:是图像的标准算术操作的实现方法,是两幅输入图像之间进行点对点的加、减、乘、除运算后得到输出图像的过程。
MATLAB图像处理工具箱包含了一个能够实现所有非稀疏数值数据的算术操作的函数集合。
使用图像处理工具箱中的图像代数运算函数无须再进行数据类型间的转换,这些函数能够接受8位无符号类型或16位无符号类型数据,并返回相同格式的图像结果。
值得注意的是:无论进行哪一种代数运算都要保证输入图像的大小相等,且类型相同。
针对代数运算的结果很容易超出数据类型允许的范围,图像的代数运算函数使用了以下截取规则使运算结果符合数据范围的要求:超出范围的整数数据将被截取为数据范围的极值,分数结果将被四舍五入。
(1)图像的加法运算
图像相加一般用于对同一场景的多幅图像求平均效果(平均是指效果而言,并非算术平均),以便有效地降低具有叠加性质的随机噪声。
MATLAB中的imadd函数用于进行两幅图像的加法或给一幅图像加上一个常数。该函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素之和作为输出图像。其调用格式为:
Z=imadd(X,Y)
其中,X和Y表示需要相加的两幅图像,返回值Z表示得到的加法操作结果。两幅图像的像素值相加时产生的结果很可能超过图像数据类型所支持的最大值(称为溢出),当数据发生溢出时,该函数将数据截取为数据类型所支持的最大值,这种截取效果称之为饱和,为了避免这种现象出现,在进行加法计算前最好将图像类型转换为一种数据范围较宽的数据类型。
例:两幅图像叠加
I=imread('rice.png');
J=imread('cameraman.tif');
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(J);
K=imadd(I,J);
subplot(1,3,3),imshow(K);
若不是两幅图像相加,而是给图像的每一个像素加上一个常数(使图像的亮度增加),同样可以采用imadd函数。
*例:RGB图像增加亮度
RGB1=imread('flower.tif');
RGB2=imadd(RGB1,50);
subplot(1,2,1),imshow(RGB1);
subplot(1,2,2),imshow(RGB2);
RGB1=imread('rice.png');
RGB2=imadd(RGB1,50);
subplot(1,2,1),imshow(RGB1);
subplot(1,2,2),imshow(RGB2);
(2)图像的减法运算
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。
在MATLAB中,imsubtract函数用来将一幅图像从另一幅输入图像中减去或从一幅图像中减去一个常数。该函数将一幅图像的像素值从另一幅输入图像相应的像素值中减去,再将相应的像素值之差作为输出图像相应的像素值
展开阅读全文