数字图像处理实验指导书(带源程序)

更新时间:2024-04-09 13:40:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 Matlab图像处理工具箱的初步练习

一. 实验目的

1. 掌握有关数字图像处理的基本概念; 2. 熟悉Matlab图像处理工具箱;

3. 熟悉使用Matlab进行数字图像的读出和显示; 4. 熟悉运用Matlab指令进行图像旋转和缩放变换。

二. 练习

1. 文件的读入与显示 (1) 运行Matlab。

(2) MATLAB窗口构成:在缺省的情况下,由三个窗口组成。命令窗口(command window)、命令历史(command history)、工作空间(workspace)。

注意:缺省窗口的设置步骤为:MATLAB菜单/view选项/Desktop layout/default。

(3) 调入一个文件:i=imread('pout.tif'); %注意:前面的“%”是用于注释的,不会被执行,只是说明这个语句的作用。

此时的i出现在什么窗口?是什么类型的变量?大小是多少? (4) 显示这幅图:imshow(i);

(5) 将变量i转置成j,即j=i';显示j即imshow(j);%在胸前左侧花纹怎么会跑到右边的呢? 举一个例子加以验证:设a=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15]; b=a?; 此时的b与a有什么区别? (6) 写入到一个新的图像文件'abc.tif'中,即imwrite(j,'abc.tif')。 (7) 清除变量命令:clear

执行这个命令后,workspace窗口中的变量有没有?怎么验证? (8) 清除用户开设的窗口命令:close all (9) 调入图像文件'abc.tif'并显示。 问题:

(1) 操作符“ ? ”是图像的转置的意思,转置两次后,是否回到原图像? (2) 命令后的符号“ ; ”所起的作用是什么? (3) 命令是否可以大写母? 2. 灰度图像

分别选择不同的灰度级(如2、4、16、64、128个)来显示同一幅图像(如testpat1.tif)。

i=imread('testpat1.tif');

figure,imshow(i,2) %显示2个灰度级 figure,imshow(i,4) %显示4个灰度级 figure,imshow(i,16) %显示16个灰度级 figure,imshow(i,64) %显示64个灰度级 figure,imshow(i,128) %显示128个灰度级 3. RGB图像

RGB = imread('ngc6543a.jpg'); %RGB为650*600*3 imshow(RGB);

1

将这一图写入到abc.jpg文件中去,并用“画图”进行编辑。使用菜单“图像”/“属性”,将此图的尺寸改为300*300,其效果如何?

问题:

(1) 将一幅图像改变它的尺寸时,其分辨率是不改变?(使用windows的“图画”工具) (2) 如何使用“画图”中的拉伸功能,实现图像的缩小? (3) 2006年,市场上100万像素是什么意思?

4. 在Matlab中,函数imresize(X,M,method)可用来改变图像的大小,其中X表示图像,实数M>0是放大倍数,method用来选择计算数据的方法,其可取值及意义分别为:

?nearest?--最近邻插值法,?bilinear?--双线性插值法,?bicubic?--双三次插值法。 我们看下面这段程序: I=imread('circuit.tif'); J=imresize(I,1.25); imshow(I) figure,imshow(J)

程序运行后得到如下的结果:

也可以指定目标图像的大小,此时imresize()的调用格式为: Y=imresize(X,[320,480])

其中[320,480]表示将图像的大小调整为320×480。

5. 函数imrotate对图像进行旋转操作,我们看如下的程序段:

I=imread('cameraman.tif'); J=imrotate(I,-15,'bilinear'); K=imrotate(I,-15,'bilinear','crop'); imshow(I) figure,imshow(J) figure,imshow(K) 程序运行后得到如下的结果:

2

左边是原图,中间和右边是旋转后的结果,注意右边的图像和中间图像的区别,右边的图像是由参数?crop? 实现的,该参数表示将旋转后的图像取与原图像相同的中心部分输出。

三. 实验内容

1.从磁盘上读入图像“cameraman.tif”,将其分别放大到1.5倍(用“bilinear”方法)和2.6倍(用“bicubic”方法),显示在不同的图像窗口中。

2.从磁盘上读入图像“lena.tif”,将其放大2倍,并将结果用BMP格式以“lena.bmp”为文件名,写入磁盘。(用imwrite命令,该命令的用法请用help imwrite查看)

3.给定一幅图像,如lena.bmp,分别将其顺时针旋转450,逆时针旋转300。 4. 给定一幅图像,如lena.bmp,以不同灰度级显示,比较显示的不同效果。

四. 实验报告要求

1.实验目的; 2.实验基本原理; 3.实验步骤 4.源程序;

5.处理前后的图像; 6.实验结论; 7.实验收获、体会。

3

实验二 图像的增强

一. 实验目的

1. 熟悉直方图的计算和显示;

2. 熟悉通过算术运算进行图像增强的方法; 3. 熟悉运用直方图变换进行图像增强的原理。

二. 实验原理

1. 直方图

在数字图像处理中,一种最简单和最有用的工具是直方图,它概括了一幅图像的灰度级内容。 (1)函数:imhist(I,n)

功能:显示指定图像的直方图。 语法格式: Imhist(I,n) Imhist(X,map) [counsts,x]=imhist(…)

说明:I为输入图像,n为指定的灰度级数目,默认值为256。Imhist(X,map)计算和显示索引色图像为X的直方图,map为调色板。[counsts,x]=imhist(…)返回直方图数据向量counts或相应的色彩值向量x。

(2)函数:imadjust

功能:将图像的灰度值映像为一个新的数值范围。

语法格式:J=imsdjust(I,[low_in high_in],[low_out high_out],gamma) newmap=imadjust(map,[low high],[bottom top],gamma) 说明:

I是输入图像矩阵,J是经过直方图变换后的输出图像矩阵。Low_in参数和high_in参数分别用来指定输入图像需要映像的灰度范围,参数Low_out和high_out指定输出图像所在的灰度范围。

newmap=imadjust(map,[low high],[bottom top],gamma)命令是调整索引色图像的调色板map。此时若[low high]和[bottom top]都是2×3矩阵,就根据它们的值分别调整R、G、B三个分量。

不管I属于哪一类,此处指定的强度值的范围均为[1,0]。如果I是unint8,则会将用户指定的值乘以255,然后将得到的结果作为实际的强度使用。如果I是unint16,则会乘以65536。

Gamma是一个可选参数。一般来说灰度间的映像是直线,但是通过调整gamma参数可以使其变为非线性的映像。

(3)直接的灰度变换曲线可以取得增强对比度的效果,对于低值灰度的图像,有时使用对数变换效果更好。对数变换可以扩展低值灰度,压缩高值灰度,这样可以使低值灰度的图像细节更容易看清楚。

对数变换的灰度映像采用如下表达式:

g(x,y)?log(f(x,y)?1)

2. 直方图均衡化

函数:histeq

功能:实现对输入图像的直方图均衡化。 语法格式:

4

J=histeq(I,hgram) J= histeq(I,n) [J,T]= histeq(I,?)

newmap= histeq(X,map,hgram) newmap= histeq(X,map) [newmap,T]=histeq(X,?) 说明:

其中,n表示输出图像的灰度级数目,是一个可选参数,缺省值为64。

J=histeq(I,hgram)是将原图像I的直方图变成用户指定的向量hgram,hgram中的各元素值域为

[0,1]。

[J,T]=histeq(I,…)返回能从图像I的灰度直方图变换成图像J的直方图的变换T。

newmap= histeq(X,map)用来对索引图像进行处理,索引图像的返回值newmap将是输出图像的

调色板。

J= histeq(I,n)将原图像I转换成具有指定灰度级数目的输出图像J。

newmap= histeq(X,map,hgram)将索引图像X的直方图变成用户指定的向量hgram,hgram中的

各元素值域为[0,1]。

[newmap,T]=histeq(X,?)返回能从索引图像I的直方图变成索引图像J的直方图的变换T。

3. 直方图规定化

在Matlab中可以调用函数J=histeq(I,hgram)来实现直方图规定化。其中hgram是由用户指定的矢量,规定将原始图像I的直方图近似变换成hgram,hgram中的每一个元素都在[0,1]中。

4. 代数运算

Matlab工具箱中提供了一个函数imnoise来给图像增添噪声。 函数:imnoise

功能:给图像增添不同种类的噪声。 语法格式: J=imnoise(I,type)

J=imnoise(I,type,parameters)

说明:其中,参数type指定噪声的种类,parameters是与噪声种类有关的集体参数。I是输入图像,J是对I增添噪声后的输出图像。如表2-1所示。

表2-1 噪声种类及参数说明 种类 gaussian localvar passion salt pepper speckle

参数 m,v v 无 无 v 说明 均值为m,方差为v的高斯噪声 均值为0,方差为v的高斯白噪声 泊松噪声 椒盐噪声 均值为0,方差为v的均匀分布随机噪声 三. 实验内容

5

1. 直方图

(1)同时显示一幅图像(如pout.tif)及其直方图。 参考程序: I=imread('pout.tif'); subplot(1,2,1); imshow(I); title('原图像'); axis square; subplot(1,2,2); imhist(I);

title('图像的直方图'); axis square;

(2)通过对比度扩展增强图像rice.tif的对比度。

要求:将该图像从灰度范围[0.15,0.9] 映像到[0,1],同时显示原图像及其直方图,变换后的图象及其直方图,并说明实验效果有何变化。

参考程序: I=imread('rice.tif'); subplot(2,2,1); imshow(I); title('原图像'); subplot(2,2,2); imhist(I);

title('原图像直方图');

J=imadjust(I,[0.15 0.9],[0 1]); subplot(2,2,3); imshow(J); title('变换后图像'); subplot(2,2,4); imhist(J);

title('变换后图像直方图');

6

结论:通过将图像从灰度范围[0.15,0.9]映像到[0,1],图像的对比度明显增加。 (3)采用对数变换法来改善图像质量。

给定一幅图像pout.tif,将图像转换为double类型,然后进行灰度的对数变换,同时显示原图像以及对数变换后的增强图像。

参考程序: I=imread('pout.tif'); subplot(1,2,1);

imshow(I); %对数运算不支持unit8类型,将图像转换为double类型 title('原始图像'); I=double(I);

J=log(I+1); %进行灰度的对数变换 subplot(1,2,2); imshow(mat2gray(J)); title('对数变换后的增强图像');

结论:经过对数变换后图像窗格等细节更加清楚。 2. 直方图均衡化

(1)对一个给定图像(如tire.tif)进行直方图均衡化,同时显示原图像及直方图,以及均衡化后的图像及直方图,并绘制出直方图均衡化的转移函数变换曲线,通过实验,得出什么结论。 参考程序:

I=imread('tire.tif');

J=histeq(I); %进行直方图均衡化 subplot(2,2,1); imshow(I);

title('原始图像'); %显示原始图像 subplot(2,2,2); imshow(J);

title('直方图均衡图像'); %显示直方图均衡化后的图像

7

subplot(2,2,3); imhist(I);

title('原始图像直方图'); %显示原始图像的直方图 subplot(2,2,4); imhist(J);

title('均衡化图像直方图'); %显示均衡化后的直方图 I=imread('tire.tif');

[J,T]=histeq(I); %进行直方图均衡化 figure,plot(T); %绘制转移函数的变换曲线

结论:从直方图看,处理后的图像直方图分布更均匀了,图像在每个灰度级上都有象素点。 从处理前后的图象看出:许多在原始图像中看不清楚的细节在直方图均衡化处理后所得到的图像中都变得十分清晰。

3. 直方图规定化

对图像tire.tif进行规定直方图的变换,通过实验,得出什么结论。 参考程序: I=imread('tire.tif');

hgram=0:255; %直方图变换的规定化函数 J=histeq(I,hgram); %将图像向指定的直方图变换 subplot(2,2,1);

imshow(I); title('原始图像'); subplot(2,2,2);

imshow(J);title('直方图规定化后图像'); subplot(2,2,3);

imhist(I);title('原始图像直方图'); subplot(2,2,4);

imhist(J);title('规定化后图像直方图');

8

结论:和直方图均衡化的图像进行比较可以知道,直方图在高灰度值一侧更为密集,指定变化后的图像比直方图均衡化后的图像更亮,在较暗的区域细节更加清楚。

4. 代数运算 通过求平均值降噪。

要求:选择一幅图像(如rice.tif),通过Matlab的imnoise函数对图像人为加入噪声,然后将对多幅加入噪声的图像求平均值,得到去噪的目的。

参考程序:

clear; %清除工作台的变量 I=imread('rice.tif'); subplot(2,2,1);

imshow(I); title('原始图像'); [m,n]=size(I); J(m,n)=0; J=double(J);

X=imnoise(I,'gaussian');Y=double(X); %加入噪声 subplot(2,2,2);

imshow(X);title(' 加噪图像一'); J=J+Y/10;

X=imnoise(I,'gaussian');Y=double(X); subplot(2,2,3);

imshow(X);title('加噪图像二'); J=J+Y/10;

for i=1:8 %循环运算,对噪声的图像取平均值 X=imnoise(I,'gaussian'); Y=double(X); J=J+Y/10; end

subplot(2,2,4);

imshow(mat2gray(J));title(' 10幅噪声图像平均结果');

9

四. 实验报告要求

1.实验目的; 2.实验基本原理; 3.实验步骤 4.源程序; 5.处理前后的图像; 6.实验结论; 7.实验收获、体会。

10

实验三 图像的滤波

一. 实验目的

1. 熟悉空域滤波的原理; 2. 熟悉频域滤波的原理;

3. 学会用Matlab函数对输入图像进行均值滤波,感受不同的图像处理方法对最终图像效果的影响;

4. 比较Butterworth滤波器为噪声图像处理的实验结果。

二. 实验原理

1. Matlab提供了fspecial函数生成滤波时所用的模板,并提供filter2函数用指定的滤波器模板对图像进行运算。

函数:fspecial

功能:创建一个指定的滤波器模板。 语法格式: h=fspecial(type)

h=fspecial(type,parameters)

说明:其中,参数type指定滤波器的种类,parameters是与滤波器种类有关的具体参数。 type average parameters hsize 说明 均值滤波,如果邻域为方阵,则hsize为标量,否则由两元素向量hsize指定邻域的行数和列数 disk gaussian laplacian log motion prewitt sobel unsharp radius hsize,sigma alpha hsize,sigma len,theta 无 无 alpha 有(radius*2+1)个边的圆形均值滤波器 标准偏差为sigma,大小为hsize的高斯低通滤波器 系数由alpha(0.0-1.0)决定的二维拉普拉斯操作 标准偏差为sigma,大小为hsize的高斯滤波旋转对称拉氏算子 按角度theta移动len个像素的运动滤波器 近似计算垂直梯度的水平边缘强调算子 近似计算垂直梯度光滑效应的水平边缘强调算子 根据alpha决定的拉氏算子创建的掩模滤波器 如:K1=filter2(fspecial('average',3),J)/255; %对图像J进行3×3模板的均值滤波 2. Matlab工具箱中提供了medfilt2函数来实现中值滤波。 函数:medfilt2

功能:实现对指定图像的中值滤波。 语法格式: B=medfilt2(A,[m,n]) B=medfilt2(A)

说明:其中,A是输入图像,B是中值滤波后输出的图像。[m,n]指定滤波模板的大小,默认模板是3?3。

如:L=medfilt2(J,[3 5]); %对图像J进行3×5中值滤波 h1=fspecial('sobel');

I1=filter2(h1,I); 用sobel算子对图像I进行非线性锐化滤波

11

三. 实验内容

1. 对一个图像进行不同大小的模板的均值滤波,并比较结果。

选一幅图像(如eight.tif),对图像加入椒盐噪声,然后分别选择3×3、5×5、7×7等模板进行均值滤波,同时观察噪声图像、不同尺寸模板的均值滤波图像,并就不同尺寸的滤波器模板进行滤波操作的图像进行比较。

参考程序: I=imread('eight.tif');

J=imnoise(I,'salt & pepper',0.02); %对指定的图像加入椒盐噪声 subplot(2,2,1);

imshow(J); title('噪声图像');

K1=filter2(fspecial('average',3),J)/255; %进行3×3模板的均值滤波 K2=filter2(fspecial('average',5),J)/255; %进行5×5模板的均值滤波 K3=filter2(fspecial('average',7),J)/255; %进行7×7模板的均值滤波 subplot(2,2,2);

imshow(K1);title('3×3模板均值滤波'); subplot(2,2,3);

imshow(K2);title('5×5模板均值滤波'); subplot(2,2,4);

imshow(K3);title('7×7模板均值滤波');

结论:随着所用的滤波器尺寸的增大,消除噪声的效果得到了增强;但是,图像的细节锐化程度相应降低,图像变得模糊起来。

2. 利用一个低通模板对一幅有噪图象(GAUSS白噪声)进行滤波(原图像可选lena.bmp、saturn.tif、pout.tif等),检验两种滤波模板(分别使用一个5×5的线性邻域平均模板和一个非线性模板:3×5中值滤波器)对噪声的滤波效果。 参考程序: I=imread('lena.bmp'); J=imnoise(I,'gaussian',0,0.01); subplot(2,2,1); imshow(I); title('原图'); subplot(2,2,2); imshow(J); title('noise');

K=fspecial('average',5);

12

K1=filter2(K,J)/255; subplot(2,2,3); imshow(K1); title('average'); L=medfilt2(J,[3 5]); subplot(2,2,4); imshow(L); title('medium');

3. 用sobel算子、prewitt算子、log算子对图像进行非线性锐化滤波,观察滤波效果。 参考程序: I=imread('rice.tif'); subplot(2,2,1);

imshow(I);title('原始图像'); h1=fspecial('sobel'); I1=filter2(h1,I); subplot(2,2,2);

imshow(I1);title('sobel算子滤波'); h1=fspecial('prewitt'); I1=filter2(h1,I); subplot(2,2,3);

imshow(I1);title(' prewitt算子滤波'); h1=fspecial('log'); I1=filter2(h1,I); subplot(2,2,4);

imshow(I1);title('log算子滤波');

13

4. 对图像eight.tif加入椒盐噪声后,实现Butterworth低通滤波。

选择一幅图像,将其加入椒盐噪声,对其进行傅立叶变换,转换数据矩阵,然后分别对其Butterworth低通滤波和理想低通滤波,同时显示原始图像、噪声图像、Butterworth滤波图像和理想低通滤波图像。

参考程序: clear;

I1=imread('eight.tif'); subplot(2,2,1);

imshow(I1); title('噪声图像');

I2=imnoise(I1,'salt & pepper'); %加入椒盐噪声 subplot(2,2,2);

imshow(I2); title('噪声图像'); f=double(I2);

g=fft2(f); %傅立叶变换 g=fftshift(g); %转换数据矩阵 [N1,N2]=size(g); n=2; d0=50; n1=fix(N1/2); n2=fix(N2/2);

for i=1:N1; %对频域中循环滤波 for j=2:N2;

d=sqrt((i-n1)^2+(j-n2)^2); %计算Butterworth低通滤波转换函数 h=1/(1+0.414*(d/d0)^(2*n)); result1(i,j)=h*g(i,j);

if(g(i,j)>50) %进行理想低通滤波 result2(i,j)=0; else

result2(i,j)=g(i,j); end end end

14

result1=ifftshift(result1); %进行反变换 result2=ifftshift(result2); %进行反变换 X2=ifft2(result1); X3=uint8(real(X2)); subplot(2,2,3);

imshow(X3);title('Butterworth滤波图像'); X4=ifft2(result2); X5=uint8(real(X4)); subplot(2,2,4);

imshow(X5);title('理想低通滤波图像');

5. 对图eight.tif实现Butterworth高通滤波。 参考程序: clear;

I1=imread('eight.tif'); subplot(2,2,1);

imshow(I1); title('噪声图像');

I2=imnoise(I1,'salt & pepper'); %加入椒盐噪声 subplot(2,2,2);

imshow(I2); title('噪声图像'); f=double(I2);

g=fft2(f); %傅立叶变换 g=fftshift(g); %转换数据矩阵 [N1,N2]=size(g); n=2; d0=50;

15

实验五 图像的边缘检测

一. 实验目的

1. 熟悉边缘提取的算法原理

2. 比较不同算子对同一幅图像的边缘检测效果

二. 实验原理

1. 常用边缘检测算子模板 算子名称 Roberts H1 H2 特点 边缘定位准 对噪声敏感 平均、微分 对噪声有抑制作用 ?01???10? ????101???101? ?????101????101???202? ?????101????1??2????10001?2?? 1???10??0?1? ????1?1?1??0? 00???11??1???1?2?1??0? 00???21??1?Prewitt Sobel 加权平均 边宽≧2像素 Isotropic Sobel ??1?2?0?0??12??1??0? 1??权值反比于邻点与中心点的距离 检测沿不同方向边缘时梯度幅度一致 2.调用格式: BW=edge(I, 'method') BW=edge(I, 'method',thresh) BW=edge(I, 'method',thresh,direction) [BW,thresh]=edge(I, 'method',…)

其中,I是输入图像,method是选用的方法(算子),可以选择的method有Sobel、Prewitt、Roberts、log、candy、zerocross等。

可选的参数有:thresh(门限)、sigma(方差)和direction(方向)。 三. 实验内容

1. 调用Sobel、Roberts和Prewitt算子检测图像rice.tif的边缘。

说明:用edge函数调用不同的算子模板提取边缘。如B1 = edge(I,'roberts'); %调用Roberts算子检测边缘

参考程序:

I = imread('rice.tif');

BW1= edge(I,'sobel'); %调用Sobel算子检测边缘 BW2 = edge(I,'roberts'); %调用Roberts算子检测边缘 BW3 = edge(I,'prewitt'); %调用prewitt算子检测边缘 subplot(2,2,1);

imshow(I); title('原图像'); subplot(2,2,2);

imshow(BW1); title('Sobel算子提取结果');

21

subplot(2,2,3);

imshow(BW2); title('Roberts算子提取结果'); subplot(2,2,4);

imshow(BW3); title('prewitt算子提取结果');

从提取图像可以看出,边缘的检测并不是十分准确。

2. 用拉普拉斯高斯算子检测图像rice.tif的边缘。 参考程序: I = imread('rice.tif');

BW1= edge(I,'log'); %产生拉普拉斯高斯算子 subplot(1,2,1);

imshow(I); title('原图像'); subplot(1,2,2);

imshow(BW1); title('log边缘检测结果');

3. 使用canny方法检测图像rice.tif的边缘。 参考程序: I = imread('rice.tif');

BW1= edge(I,'canny'); %用canny方法进行检测 subplot(1,2,1);

imshow(I); title('原图像'); subplot(1,2,2);

imshow(BW1); title('canny算子检测图像');

4. 分别采用Roberts算子、Sobel算子、Prewitt算子、canny算子方法来检测图像blood1.tif的边缘,并比较各种边缘检测算子的效果。 参考程序:

I = imread('blood1.tif');

B1 = edge(I,'roberts'); %调用Roberts算子检测边缘 B2= edge(I,'sobel'); %调用Sobel算子检测边缘 B3 = edge(I,'prewitt'); %调用prewitt算子检测边缘 B4= edge(I,'canny'); %用canny方法进行检测 subplot(2,3,1);

22

imshow(I); title('原图像'); subplot(2,3,2);

imshow(B1); title('Roberts算子检测'); subplot(2,3,3);

imshow(B2); title('Sobel算子检测'); subplot(2,3,4);

imshow(B3); title('prewitt算子检测'); subplot(2,3,5);

imshow(B4); title('Canny算子检测'); subplot(2,3,6);

imshow(B4); title('log算子检测');

在对blood1.tif的分析中可以看出,使用Roberts算子检测的效果比较好。但是,并不是每种图像都用roberts算子的效果好。

四. 实验报告要求

1.实验目的; 2.实验基本原理; 3.实验步骤 4.源程序; 5.处理前后的图像; 6.实验结论; 7.实验收获、体会。

23

本文来源:https://www.bwwdw.com/article/487r.html

Top