matlab图像处理实验
实验⼀ Matlab语⾔、数字图象基本操作
⼀、实验⽬的
1、复习MATLAB语⾔的基本⽤法;
2、掌握MATLAB语⾔中图象数据与信息的读取⽅法;
3、掌握在MATLAB中绘制灰度直⽅图的⽅法,了解灰度直⽅图的均衡化的⽅法。
⼆、实验原理
MATLAB是集数值计算,符号运算及图形处理等强⼤功能于⼀体的科学计算语⾔。作为强⼤的科学计算平台,它⼏乎能够满⾜所有的计算需求。
MATLAB软件具有很强的开放性和适⽤性。在保持内核不变的情况下,MATLAB可以针对不同的应⽤学科推出相应的⼯具箱(toolbox)。⽬前,MATLAB已经把⼯具箱延伸到了科学研究和⼯程应⽤的诸多领域,诸如数据采集、概率统计、信号处理、图像处理和物理仿真等,都在⼯具箱(Toolbox)家族中有⾃⼰的⼀席之地。在实验中我们主要⽤到MATLAB提供图象处理⼯具箱(Image Processing
Toolbox)。
1、MATLAB与数字图像处理
MATLAB全称是Matrix Laboratory(矩阵实验室),⼀开始它是⼀种专门⽤于矩阵数值计算的软件,从这⼀点上也可以看出,它在矩阵运算上有⾃⼰独特的特点。实际上MATLAB中的绝⼤多数的运算都是通过矩阵这⼀形式进⾏的。这⼀特点也就决定了MATLAB在处理数字图像上的独特优势。理论上讲,图像是⼀种⼆维的连续函数,然⽽在计算机上对图像进⾏数字处理的时候,⾸先必须对其在空间和亮度上进⾏数字化,这就是图像的采样和量化的过程。⼆维图像进⾏均匀采样,就可以得到⼀幅离散化成M×N样本的数字图像,该数字图像是⼀个整数阵列,因⽽⽤矩阵来描述该数字图像是最直观最简便的了。⽽MATLAB的长处就是处理矩阵运算,因此⽤MATLAB处理数字图像⾮常的⽅便。
MATLAB⽀持五种图像类型,即索引图像、灰度图像、⼆值图像、RGB图像和多帧图像阵列;⽀持BMP、GIF、HDF、JPEG、PCX、PNG、TIFF、XWD、CUR、ICO等图像⽂件格式的读,写和显⽰。MATLAB对图像的处理功能主要集中在它的图像处理⼯具箱(Image Processing Toolbox)中。图像处理⼯具箱是由⼀系列⽀持图像处理操作的函数组成,可以进⾏诸如⼏何操作、线性滤波和滤波器设计、图像变换、图像分析与图像增强、⼆值图像操作以及形态学处理等图像处理操作。
2、MATLAB语⾔的基本操作
MATLAB语⾔是⼀种运算纸型的运算语⾔,其特点就是与平时在运算纸上书写运算的形式相同,这使得它成为⼀种⽐较容易掌握的语⾔;其变量均以矩阵向量形式表⽰(单独⼀个数据可以认为是⼀维向量);其程序语法类似于C语⾔,只要有⼀点C语⾔基础的⼈可以很快掌握。针对数字图象处理的需要,可以重点掌握以下⼏个内容:矩阵、向量的输⼊和操作(包括如何输⼊⼀个矩阵,如何产⽣⼀个全零全⼀的矩阵,如何对⼀个矩阵的⾏列元素进⾏读取、写⼊);矩阵与向量的基本运算(包括加、减、点乘等)
以下主要介绍⼀下如何读取矩阵的指定⾏或指定列,举例说明:
x=4:6 %产⽣⼀个⼀维数组,范围从4到6,步长为1
x =
4 5 6
插⼊:通过对x进⾏插⼊运算创建矩阵A
>> A=[x-3;x;x+3] %当然也可以⽤别的⽅法产⽣A矩阵此处只作为⽰例
A =
1 2 3
4 5 6
7 8 9
提取:提取A的前两⾏和后两列形成矩阵C。
>> C=A(1:2,2:3)
C =
2 3
5 6
置零:将矩阵A 的第⼆⾏第⼆列的元素置零
>> A(2,2)=0
A =
1 2 3
4 0 6
7 8 9
将矩阵A的第⼀列全置1
A(:,1)=1
1 0 6
1 8 9
强调⼀下矩阵的乘法与矩阵的点乘的不同,举例说明:
A=eye(2) %产⽣⼆维单位矩阵
A =
1 0
0 1
>> B=[1,2;3,4] %直接法输⼊矩阵
用subplot函数B =
1 2
3 4
>> A+B %求A与B的和(符合矩阵求和原则)
ans =
2 2
3 5
>> A.*B %求A与B的点积(即两矩阵中对应元素分别相乘
ans =
1 0
0 4
>> A*B %求A与B的乘积(符合矩阵乘积原则A的列数与B的⾏数相等)
ans =
1 2
3 4
注意:请⼤家在E盘建⼀个⽬录(imp),在每次启动时都要将这个⽬录加⼊到MATLAB的搜索路径中,添加的⽅法为File----Set Path----Tool---Add Path
3、MATLAB中图象数据的读取
A、 imread
imread函数⽤于读⼊各种图象⽂件,其⼀般的⽤法为
[X,MAP]=imread(‘filename’,‘fmt’)
其中,X,MAP分别为读出的图象数据和颜⾊表数据,fmt为图象的格式,filename为读取的图象⽂件(可以加上⽂件的路径)。
例:[X,MAP]=imread(’flowers.tif’,’tif’);
B、 imwrite
imwrite函数⽤于输出图象,其语法格式为:
imwrite(X,map,filename,fmt)按照fmt指定的格式将图象数据矩阵X和调⾊板map写⼊⽂件filename。
C、 imfinfo
imfinfo函数⽤于读取图象⽂件的有关信息,其语法格式为
imfinfo(filename,fmt)
imfinfo函数返回⼀个结构info,它反映了该图象的各⽅⾯信息,其主要数据包括:⽂件名(路径)、⽂件格式、⽂件格式版本号、⽂件的修改时间、⽂件的⼤⼩、⽂件的长度、⽂件的宽度、每个像素的位数、图象的类型等。
例:
imfinfo('rice.tif')
ans =
Filename: 'C:\MATLAB6p5\toolbox\images\imdemos\rice.tif'
FileModDate: '26-Oct-1996 06:11:58'
FileSize: 65966
Format: 'tif'
FormatVersion: []
Width: 256
Height: 256
BitDepth: 8
ColorType: 'grayscale'
FormatSignature: [73 73 42 0]
ByteOrder: 'little-endian'
NewSubfileType: 0
BitsPerSample: 8
Compression: 'Uncompressed'
StripOffsets: [8x1 double]
SamplesPerPixel: 1
RowsPerStrip: 32
StripByteCounts: [8x1 double]
XResolution: 72
YResolution: 72
ResolutionUnit: 'Inch'
Colormap: []
PlanarConfiguration: 'Chunky'
TileWidth: []
TileLength: []
TileOffsets: []
TileByteCounts: []
Orientation: 1
FillOrder: 1
GrayResponseUnit: 0.0100
MaxSamplev alue: 255
MinSamplev alue: 0
Thresholding: 1
ImageDescription: [1x166 char]
4、 MATLAB中图象⽂件的显⽰
imshow
imshow函数是最常⽤的显⽰各种图象的函数,其语法如下:
imshow(X,map)
其中X是图象数据矩阵,map是其对应的颜⾊矩阵,若进⾏图象处理后不知道图象数据的值域可以⽤[]代替map。
需要显⽰多幅图象时,可以使⽤figure语句,它的功能就是重新打开⼀个图象显⽰窗⼝。
例:
I=imread(‘rice.tif’);
Imshow(I);
J=imread(‘flowers.tif’);
figure,imshow(J);
5、 MATLAB中灰度直⽅图的显⽰
MATLAB图象处理⼯具箱提供了imhist函数来计算和显⽰图象的直⽅图,imhist函数的语法格式为:
imhist(I,n)
imhist(X,map)
其中imhist(I,n)计算和显⽰灰度图象I的直⽅图,n为指定的灰度级数⽬,默认值为256。imhist(X,map)计算和显⽰索引⾊图象X的直⽅图,map为调⾊板。
例:
I = imread('rice.tif');
imshow(I)
figure, imhist(I)
6、 对⽐度增强
如果原图象f(x,y)的灰度范围是[m,M],我们希望调整后的图象g(x,y)的灰度范围是[n,N],那么下述变换,,就可以实现这⼀要求。 MATLAB图象处理⼯具箱中提供的imadjust函数,可以实现上述的线性变换对⽐度增强。Imadjust函数的语法格式为:
J = imadjust(I,[low_in high_in],[low_out high_out])
J = imadjust(I,[low_in high_in],[low_out high_out])返回图象I经过直⽅图调整后的图象J,[low_in high_in]为原图象中要变换的灰度范围,[low_out high_out]指定了变换后的灰度范围。
例:
I = imread('pout.tif');
J = imadjust(I,[0.3 0.7],[]);
imshow(I), figure, imshow(J)
三、实验要求
copy两个图形⽂件girl1.bmp和girl2.bmp到MATLAB⽬录下work⽂件夹中。
1、 将MATLAB⽬录下work⽂件夹中的girl.bmp图象⽂件读出.⽤到imread,imfinfo等⽂件,观察⼀下图象数据,了解⼀下数字图象在MATLAB中的处理就是处理⼀个矩阵。将这个图象显⽰出来(⽤imshow),尝试修改map颜⾊矩阵的值,再将图象显⽰出来,观察图象颜⾊的变化。
imadjust函数将它的灰度值调整到[0,1]之间,并观察调整后的图象与原图象的差别,调整后的灰度直⽅图与原灰度直⽅图的区别。
实验⼆ 图像运算
本实验是综合性实验,涵盖Matlab程序设计、图像点运算、代数运算、⼏何运算等多章基本知识及其应⽤。需四个学时。
⼀、实验⽬的与要求
理解图像点运算、代数运算、⼏何运算的基本定义和常见⽅法;
掌握在MTLAB中对图像进⾏点运算、代数运算、⼏何运算的⽅法;
掌握在MATLAB中进⾏插值的⽅法
运⽤MATLAB语⾔进⾏图像的插值缩放和插值旋转
进⼀步熟悉了解MATLAB语⾔的应⽤。
⼆、实验原理与功能
点运算是通过对图像中每个像素值进⾏计算,改善图像显⽰效果的操作,也称对⽐度增强,对⽐度拉伸,灰度变换.可以表⽰为B(x,y)=f(A(x,y)).进⾏逐点运算,输⼊映射为输出,不改变图像像素的空间关系.
代数运算是指对两幅输⼊图像进⾏点对点的加、减、乘或除运算⽽得到输出图像的运算。对于相加和相乘的情形,可能不⽌有两幅图像参加运算。在⼀般情况下,输⼊情况之⼀可能为常数。
四种图像处理代数运算的数学表达式如下:
C(x,y)=A(x,y)+B(x,y)
C(x,y)=A(x,y)-B(x,y)
C(x,y)=A(x,y)*B(x,y)
C(x,y)=A(x,y)/B(x,y)
其中A(x,y)和B(x,y)为输⼊图像,⽽C(x,y)为输出图像。还可以通过适当的组合形成涉及⼏幅图像的复合代数运算⽅程。
在MATLAB中,我们可以⽤函数简单的得到数字图像的图像数据矩阵(即A(x,y)和B(x,y)),有了这些矩阵后我们只要适当的设计代数运算的形式并写出⽅程,就可以得到⼀个输出图像的矩阵(即C(x,y))图像相加的⼀个重要应⽤是对同⼀场景的多幅图像求平均值。这点被经常⽤来有效的降低加性随机噪声的影响。在求平均值的过程中,图像的静⽌部分不会改变,⽽对每⼀幅图像,各不相同的噪声图案则过累积很慢。对M幅图像进⾏平均,使图像中每⼀点的平⽅信噪⽐提⾼了M倍幅度信噪⽐是功率信噪⽐的平⽅根,因此达到了提⾼信噪⽐降低噪声的作⽤。
⼏何运算可改变图像中各物体之间的空间关系。这种运算可以被看成是将(各)物体在图像内移动。⼀个⼏何运算需要两个独⽴的算法。⾸先,需要⼀个算法来定义空间变换本⾝,⽤它来描述每个像素如何从其初始位置“移动”到终⽌位置,即每个像素的“运动”。同时,还需要⼀个⽤于灰度插值的算法,
这是因为,在⼀般情况下,输⼊图像的位置坐标(x,y)为整数,⽽输出图像的位置坐标为⾮整数,反过来也如此。因此插值就是对变换之后的整数坐标位置的像素值进⾏估计。MATLAB提供了⼀些函数实现这些功能。
插值是常⽤的数学运算,通常是利⽤曲线拟合的⽅法,通过离散的采样点建⽴⼀个连续函数来逼近真实的曲线,⽤这个重建的函数便可以求出任意位置的函数值。
最近邻插值是最简便的插值,在这种算法中,每⼀个插值输出像素的值就是在输⼊图像中与其最临近的采样点的值。最近邻插值是⼯具箱函数默认使⽤的插值⽅法,⽽且这种插值⽅法的运算量⾮常⼩。当图像中包含像素之间灰度级变化的细微结构时,最近邻插值法会在图像中产⽣⼈⼯的痕迹。
双线性插值法的输出像素值是它在输⼊图像中2×2领域采样点的平均值,它根据某像素周围4个像素的灰度值在⽔平和垂直两个⽅向上对其插值。
双三次插值的插值核为三次函数,其插值邻域的⼤⼩为4×4。它的插值效果⽐较好,但相应的计算量也⽐较⼤。
MATLAB图像处理⼯具箱中的函数imresize可以⽤上述的3种⽅法对图像进⾏插值缩放,如果不指定插值⽅法,则默认为最邻近插值法。Imresize函数的语法格式为:
B = imresize(A,m,method)
参数method⽤于指定插值的⽅法,可选⽤的值为'nearest'(最邻近法),'bilinear'(双线性插值),'bicubic'(双三次插值),默认
为'nearest'。
B = imresize(A,m,method)返回原图A的m倍放⼤的图像(m⼩于1时效果是缩⼩)。
三 实验设计例⼦与调试
1. 完成⼈为的往⼀幅图像中加⼊噪声,并通过多次相加求平均的⽅法消除所加⼊的噪声。
在MATLAB中提供了给图像加⼊噪声的函数imnoise
imnoise的语法格式为
J = imnoise(I,type)
J = imnoise(I,type,parameters)
其中J = imnoise(I,type)返回对原始图像I添加典型噪声的有噪图像J。
参数type和parameters⽤于确定噪声的类型和相应的参数。
下⾯的命令是对图像eight.tif分别加⼊⾼斯噪声、椒盐噪声和乘性噪声,其结果如图所⽰:
I=imread('eight.tif');
J1=imnoise(I,'gaussian',0,0.02);
J2=imnoise(I,'salt & pepper',0.02);
J3=imnoise(I,'speckle',0.02);
subplot(2,2,1),imshow(I),title('原图像');
subplot(2,2,2),imshow(J1),title('加⾼斯噪声');
subplot(2,2,3),imshow(J2),title('加椒盐噪声');
subplot(2,2,4),imshow(J3),title('加乘性噪声');
在上⾯的例⼦中使⽤了⼀个函数subplot。其作⽤就是将多幅图像显⽰再同⼀幅图像显⽰对话框中。其语法格式为:
subplot(m,n,p)
其作⽤就是将⼀个图像显⽰对话框分成m⾏n列,并显⽰第p幅图像。
在MATLAB程序语⾔中,分号的⽤处为不显⽰程序运算中的中间结果,这在⼀定程度上使系统运算的效率增⾼,因此在不需知道中间结果的情况下,可以⽤分号作为⼀个句⼦的结尾,⽽不显⽰该句运算的中间结果。
代数运算中需要有若⼲幅带有随机噪声的图像数据,在这⾥我们运⽤MATLAB中的FOR循环语句来完成产⽣多幅带有噪声的图像数据及将这些图像数据进⾏相加运算。MATLAB中FOR END循环的⽤法如下:
for end循环
这种循环允许⼀组命令以固定的和预定的次数重复,循环的⼀般形式为:
for variable = expression
statements
end
举例如下:
例:
%⼀个简单的for循环的例⼦。
for i=1:10;
y(i)=i;
end;
y %显⽰y的结果
y =
1 2 3 4 5 6 7 8 9 10
为了得到最⼤的速度,在for循环被执⾏之前,应预先分配数组。例如前⾯所考虑的第⼀种情况,在for循环内每执⾏⼀次命令,向量y的维数增加1。这样就使得MATLAB每通过⼀次循环对y分配更多的内存,这当然要花费⼀定的时间。为了可以不执⾏这个步骤,for循环的例⼦应重写为:
y=zeros(1,10);
for i=1:10;
y(i)=i;
end;
y
在实际的对图像处理过程中,由于我们读出的图像是unit8型,⽽在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此读出的图像数据不能直接进⾏相加求平均,因此必须使⽤⼀个函数将图像数据转换成双精度型数据。MATLAB中提供了这样的函数:
im2double函数,其语法格式为:
I2 = im2double(I1)
其中I1是输⼊的图像数据,它可能是unit8或unit16型数据,通过函数的变化输出I2为⼀个double型数据,这样两图像数据就可以⽅便的进⾏相加等代数运算.
作为⼀个⽰例,现将刚刚显⽰的加有噪声的图像进⾏相加求平均以消除图像的噪声。在图像中我们给图像加的是均值为0,⽅差为0.02的⾼斯噪声,将图像相加了⼀百遍,再求其平均值。程序如下:
%例图像加噪声再通过多次相加求平均的⽅法祛除噪声
[I,M]=imread('eight.tif');
J=imnoise(I,'gaussian',0,0.02);
subplot(1,2,1),imshow(I,M),title('原图像');
subplot(1,2,2),imshow(J,M),title('加噪声后图像');
K=zeros(242,308);
for i=1:100
J=imnoise(I,'gaussian',0,0.02);
J1=im2double(J);
K=K+J1;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论