数字图像处理 实验报告(完整版) 下载本文

数字图像处理

实验一 MATLAB数字图像处理初步

一、显示图像

1.利用imread( )函数读取一幅图像,假设其名为lily.tif,存入一个数组中; 2.利用whos 命令提取该读入图像flower.tif的基本信息; 3.利用imshow()函数来显示这幅图像; 实验结果如下图:

源代码: >>I=imread('lily.tif') >> whos I >> imshow(I)

二、压缩图像

4.利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息;

5.利用imwrite()函数来压缩这幅图象,将其保存为一幅压缩了像素的jpg文件,设为lily.jpg;语法:imwrite(原图像,新图像,‘quality’,q), q取0-100。

6.同样利用imwrite()函数将最初读入的tif图象另存为一幅bmp图像,设为flily.bmp。 7.用imread()读入图像Sunset.jpg和Winter.jpg; 8.用imfinfo()获取图像Sunset.jpg和Winter.jpg的大小;

9.用figure,imshow()分别将Sunset.jpg和Winter.jpg显示出来,观察两幅图像的质量。 其中9的实验结果如下图:

源代码:

4~6(接上面两个) >>I=imread('lily.tif') >> imfinfo 'lily.tif';

>> imwrite(I,'lily.jpg','quality',20); >> imwrite(I,'lily.bmp'); 7~9 >>I=imread('Sunset.jpg'); >>J=imread('Winter.jpg') >>imfinfo 'Sunset.jpg'

>> imfinfo 'Winter.jpg'

>>figure(1),imshow('Sunset.jpg') >>figure(2),imshow('Winter.jpg')

三、二值化图像

10.用im2bw将一幅灰度图像转化为二值图像,并且用imshow显示出来观察图像的特征。 实验结果如下图:

源代码:

>> I=imread('lily.tif') >>gg=im2bw(I,0.4); F>>igure, imshow(gg)

原始图像:

四、思考题

(1) 简述MatLab软件的特点。

答:①高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来; ②具有完备的图形处理功能,实现计算结果和编程的可视化;

③友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握; ④功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,为用户提供了大量方便实用的处理工具。

(2) MatLab软件可以支持哪些图像文件格式?

JPEG、JPEG、PCX、TIFF、PNG、GIF、HDF、XWD等等。 (3) 说明函数imread 的用途格式以及各种格式所得到图像的性质。

imread函数用于读入各种图像文件,其一般的用法为

[X,MAP]=imread(‘filename’,‘fmt’)

其中,X,MAP分别为读出的图像数据和颜色表数据,fmt为图像的格式,filename为读取的图像文件(可以加上文件的路径)。

(4) 为什么用I = imread(‘lena.bmp’) 命令得到的图像I 不可以进行算术运算?

Matlab系统默认的算术运算时针对双精度类型(double)的数据,而上述命令产生的矩阵的数据类型是无符号8位,直接 进行运算会溢出。

实验二 图像的代数运算

一.图像的加法运算

在MATLAB中,如果要进行两幅图像的加法,或者给一幅图像加上一个常数,可以调用imadd函数来实现。imadd函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素值之和作为输出图像。imadd函数的调用格式如下:

Z = imadd(X,Y)

其中,X和Y表示需要相加的两幅图像,返回值Z表示得到的加法操作结果。 实验结果如下图:

源代码:

I = imread(‘Sunset.jpg’); J = imread(‘Bluehills.jpg’); K = imadd(I,J);

imshow(K);(两幅图尺寸大小一致) 原始图像:

给图像的每一个像素加上一个常数可以使图像的亮度增加。效果如下:

源代码

>>RGB = imread(‘cameraman.tif’); >>RGB2 = imadd(RGB,50); >>subplot(1,2,1);imshow(RGB); >>subplot(1,2,2);imshow(RGB2);

二、图像的减法运算

在MATLAB中,使用imsubtract函数可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数。imsubtract函数将一幅输入图像的像素值从另一幅输入图像相应的像素值中减去,再将这个结果作为输出图像相应的像素值。imsubtract函数的调用格式如下:

Z = imsubtract(X,Y); 其中,Z是X-Y操作的结果。 实验结果如下图:

源代码

>>rice = imread('cameraman.tif')

>>background = imopen(rice, strel('disk',15)) >>rice2 = imsubtract(rice, background) >>subplot(1,2,1);imshow(rice); >>subplot(1,2,2);imshow(rice2);

三、图像的乘法运算

在MATLAB中,使用immultiply函数实现两幅图像的乘法。immultiply函数将两幅图像相应的像素值进行元素对元素的乘法操作(MATLAB点乘),并将乘法的运算结果作为输出图形相应的像素值。immulitply函数的调用格式如下:

Z = immulitply(X,Y) 其中,Z=X*Y。 实验结果如下图:

源代码

I>> = imread('zhaowei.bmp') >>J = immultiply(I,1.2) >>subplot(1,2,1);imshow(I) >>subplot(1,2,2);imshow(J)

四、图像的除法运算

在MATLAB中使用imdivide函数进行两幅图像的除法。imdivide函数对两幅输入图像的所有相应像素执行元素对元素的除法操作(点除),并将得到的结果作为输出图像的相应像素值。imdivide函数的调用格式如下:

Z = imdivide(X,Y) 其中,Z=X/Y。 实验结果如下图:

源代码

>>Rice = imread('cameraman.tif'); >>I = double(Rice); >>J= I * 0.43 + 90 >>Rice2 = uint8(J)

>>Ip = imdivide(Rice, Rice2) >>Imshow(Ip, [])

原图像

五、思考题

由图像算术运算的运算结果,思考图像减法运算在什么场合上发挥优势?

答:使用背景减法进行运动目标检测可以提取出完整的目标图像.可将所得标用于进一步的图像处理工作中。

除去人身体在环境中运动产生的动态区域外.背景减法对其它的动态场景的变化、干扰等特别敏感背景图像获取的理想情况是在场景没有运动因素,最简单背景获取方法是当场景中任何目标时采集一幅图像作为背景图像,但这种固定背景图像的方法.只适合应于外界条件较好的场。

实验三 图像增强—空域滤波

一、实验内容与步骤

a) 调入并显示原始图像Sample2-1.jpg 。

b) 利用imnoise 命令在图像Sample2-1.jpg 上加入高斯(gaussian) 噪声 c)利用预定义函数fspecial 命令产生平均(average)滤波器

??1??1????1?19?1?1???1??1??

d)分别采用3x3和5x5的模板,分别用平均滤波器以及中值滤波器,对加入噪声的图像进行处理并观察不同噪声水平下,上述滤波器处理的结果;

e)选择不同大小的模板,对加入某一固定噪声水平噪声的图像进行处理,观察上述滤波器处理的结果。

f)利用imnoise 命令在图像Sample2-1.jpg 上加入椒盐噪声(salt & pepper) g)重复c)~ e)的步骤

h)输出全部结果并进行讨论。

二、实验结果与源代码

源代码

>>I=imread('cameraman.tif'); J = imnoise(I,'gauss',0.02); J = imnoise(I,'salt & pepper',0.02); ave1=fspecial('average',3); ave2=fspecial('average',5); K = filter2(ave1,J)/255; L = filter2(ave2,J)/255; M = medfilt2(J,[3 3]); N = medfilt2(J,[4 4]); imshow(I);

figure,imshow(J); figure,imshow(K); figure,imshow(L); figure,imshow(M); figure,imshow(N);

三、思考题/问答题

(1) 简述高斯噪声和椒盐噪声的特点。

高斯噪声是指噪声的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。 高斯白噪声包括热噪声和散粒噪声。而椒盐噪声是指椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。

(2) 结合实验内容,定性评价平均滤波器/中值滤波器对高斯噪声和椒盐噪声的去噪效果?

通过实验可以看出,中值滤波对椒盐噪声的消噪处理效果比较好,但是对高斯噪声的消噪处理效果不是很理想

(3) 结合实验内容,定性评价滤波窗口对去噪效果的影响?

对比实验结果可以发现:发现对于椒盐噪声,中值滤波效果更好。对于高斯噪声,选用5*5窗口滤波效果好于3*3窗口滤波,但图像模糊程度加重了。

实验四 图像分割

一、实验内容与步骤

(1)使用Roberts 算子的图像分割实验

", 调入并显示图像room.tif中图像;使用Roberts 算子对图像进行边缘检测处理; Roberts 算子为一对模板:

", 相应的矩阵为:rh = [0 1;-1 0]; rv = [1 0;0 -1];这里的rh 为水平Roberts 算子,rv为垂直Roberts 算子。分别显示处理后的水平边界和垂直边界检测结果;用“欧几里德距离”和“街区距离”方式计算梯度的模,并显示检测结果;对于检测结果进行二值化处理,并显示处理结果;

(2)使用Prewitt 算子的图像分割实验

", 使用Prewitt 算子进行内容(1)中的全部步骤。 (3)使用Sobel 算子的图像分割实验

使用Sobel 算子进行内容(1)中的全部步骤。 (4)使用LoG (拉普拉斯-高斯)算子的图像分割实验

使用LoG (拉普拉斯-高斯)算子进行内容(1)中的全部步骤。提示1:处理后可以直接显示处理结果,无须另外计算梯度的模。提示2:注意调节噪声的强度以及LoG (拉普拉斯-高斯)算子的参数,观察处理结果。

二、实验结果与源程序

实验结果如下图:

源程序>>f=imread('cameraman.tif'); [gv,t1]=edge(f,'sobel','vertical'); imshow(gv)

[gb,t2]=edge(f,'sobel','horizontal'); figure,imshow(gb)

w45=[-2 -1 0;-1 0 1;0 1 2];

g45=imfilter(double(f),w45,'replicate'); T=0.3*max(abs(g45(:))); g45=g45>=T;

figure,imshow(g45);

三、思考题/问答题

1、评价一下Roberts 算子、Prewitt 算子、Sobel 算子对于噪声条件下边界检测的性能。

Roberts 算子边缘定位精度较高,但易丢失一部分边缘,同时由于没经过图像平滑计算,因此不能抑制噪声。该算子对具有陡峭的低噪声图像响应最好。

Sobel算子很容易在空间上实现,对噪声具有平滑作用,受噪声影响较小,可提供较为精确的边缘方向信息,但同时也会检测出许多伪边缘,检测到的边缘宽度较粗,边缘位置定位精度不高。

Prewitt 算子与Sobel 算子使用方法一样,都是对图像进行差分和滤波运算,差别只在于使用的模板不一

样,Prewitt 算子比Sobel 算子运算略微简单。

2、为什么LoG梯度检测算子的处理结果不需要象Prewitt 等算子那样进行幅度组合? LOG 算子是根据图像的信噪比来求出检测边缘的最优滤波器。该方法首先采用高斯函数对图像进行低通平滑滤波,然后采用Laplacia 算子进行高通滤波,根据二阶导数的过零点来检测图像的边缘。因而不需要象Prewitt 等算子那样进行幅度组合。 3、实验中所使用的四种算子所得到的边界有什么异同?

Roberts 算子检测出的图像轮廓边缘很细,连续性较差,边缘信息有一定丢失,出现的噪点比较多。

Sobel 和Prewitt 两个算子检测出的边缘效果几乎一致,比Roberts 算子的检测结果要好,边缘较为连续,对噪声不敏感,但是线条稍粗,出现了一些伪边缘。

二阶LOG 算子检测出来的图像边缘更加连续,边缘也比较细小。但是由于二阶算子的特性,对噪声比较敏感。当σ的值越小,平滑的程度就越小,于是会出现零星的假边缘;而σ的值越大,平滑的程度也越大,但是部分真实的边缘会丢失,出现边缘间断现象

实验五 形态学运算

一、实验内容与步骤

1. 调入并显示图像Plane2.jpg;

2. 选取合适的阈值,得到二值化图像Plane2-2.jpg; 3. 设置结构元素;

4. 对得到的二值图像Plane2-2.jpg进行腐蚀运算; 5. 对得到的二值图像Plane2-2.jpg进行膨胀运算; 6. 对得到的二值图像Plane2-2.jpg进行开运算; 7. 对得到的二值图像Plane2-2.jpg进行闭运算; 8. 将两种处理方法的结果作比较;

二、实验结果与源程序

实验结果如下图:

源程序

I=imread('Sunset.jpg');

level = graythresh(I); %得到合适的阈值 bw = im2bw(I,level); %二值化

SE = strel('square',3); %设置膨胀结构元素 BW1 = imdilate(bw,SE); %膨胀 SE1 = strel('arbitrary',eye(5)); %设置腐蚀结构元素 BW2 = imerode(bw,SE1); %腐蚀 BW3 = bwmorph(bw, 'open'); %开运算 BW4 = bwmorph(bw, 'close'); %闭运算 imshow(I);

figure,imshow(bw); figure,imshow(BW1); figure,imshow(BW2); figure,imshow(BW3); figure,imshow(BW4);

三、思考题/问答题

1. 结合实验内容,评价腐蚀运算与膨胀运算的效果。

腐蚀是一种消除边界点,它使边界向内部收缩,消除小且无意义的物体。膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。

2. 结合实验内容,评价开运算与闭运算的效果。

先腐蚀后膨胀的过程称为开运算。实验中,开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),而总的位置和形状不变。

先膨胀后腐蚀称为闭运算。实验中,闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。

3. 腐蚀、膨胀、开、闭运算的适用条件是什么?

由于噪声的影响,图象在阈值化后所得到边界往往是很不平滑的,物体区域具有一些噪声孔,背景区域上散布着一些小的噪声物体。连续的开和闭运算可以有效地改善这种情况。有时需要经过多次腐蚀之后再加上相同次数的膨胀,才可以产生比较好的效果。