1、实验一 MATLAB 数字图像处理基本操作一、实验目的与要求1熟悉 MATLAB 软件的开发环境、基本操作以及图像处理工具箱,为编写图像处理程序奠定基础。2掌握二值、灰度和彩色图像的读、写和显示方法,以及图像的高、宽、颜色等参数的获取方法。3根据实验内容进行问题的简单分析和初步编码。二、实验相关知识1、Matlab 软 件 Image Processing Toolbox 简介MatLab 的原文是 Matrix Laboratory,它包括若干个工具箱,如 Communications Toolbox、Control System Toolbox、Neural Network Toolbox
2、、Wavelet Toolbox 等等,其中 Image Processing Toolbox 图像处理工具箱可以完成 Geometric Operations、Enhancement、Color Segmentation、Image Transformation、Image Analysis、Morphological Operations 等操作。在 MatLab 中,图像就是一个矩阵,在进行处理时当作一个变量即可,因此运算的书写十分简洁,故 MatLab 有草稿纸式的算法语言之称。例如:J=I+50; %为原始图像 I 加上一常数 50,并将结果赋予变量 J,其效果相当于得到一幅加亮的图
3、像 J以此类推可以书写出减法 J=I-0.5;乘法 J=I*2;除法 J=I/3;等等。利用 MatLab 提供的 imread 和 imwrite 函数可以完成对图像文件的读写操作,它们所支持的一些常用的图像文件格式见表 1-1。表 1-1 MATLAB 支持的一些常用的图像文件格式格式名称 描述 可识别的扩展符TIFF 加标签的图像文件格式 .tiff、.tifJPEG 联合图像专家组 .jpg、.jpegGIF 图像交换格式 .gifBMP Windows 位图 .bmpPNG 可移植网络图形 .pngXWD X Window 转储 .xwdMatLab 提供了两种运行方式,即命令行方式
4、和 M 文件方式。打开 MatLab 界面后,在 Command 窗口的提示符号“”下直接键入命令即可运行,如键入:clear %执行本命令将会清除内存中的全部变量 figure(1); %生成一个图像窗口 1 I=imread(e:lena.bmp); %将硬盘 e:根目录上的图像文件 lena.bmp 的数据读入矩阵变量 I 中 imshow(I); %在当前的图像窗口中显示图像矩阵 I title(原始图像 ); %在当前的图像窗口中加上标题但为了能够对程序进行调试和重复应用,我们要求用 M 文件的方式完成实验中各个程序的编写。2、数字图像的表示和类别根据图像数据矩阵解释方法的不同,MA
5、TLAB 把其处理为四类:(1) 亮度图像(Intensity images)一幅亮度图像是一个数据矩阵,其归一化的取值表示亮度。若亮度图像的像素都是 uint8 类或 uint16类,则它们的整数值范围分别是0,255 和0,65536 。若图像是 double 类,则像素取值就是浮点数。规定双精度型归一化亮度图像的取值范围是0,1 。(2) 二值图像(Binary images)一幅二值图像是一个取值只有 0 和 1 的逻辑数组。而一幅取值只包含 0 和 1 的 uint8 类数组,在MATLAB 中并不认为是二值图像。使用 logical 函数可以把数值数组转化为逻辑数组,其语法为B=l
6、ogical(A);其中 A 是由 0 和 1 构成的数值数组。要测试一个数组是否为逻辑数组,可以使用函数islogical(C);若 C 是逻辑数组,则该函数返回 1;否则,返回 0。(3) 索引图像(Indexed images)索引颜色通常也称为映射颜色,在这种模式下,颜色都是预先定义的,并且可供选用的一组颜色也很有限,索引颜色的图像最多只能显示 256 种颜色。一幅索引颜色图像在图像文件里定义,当打开该文件时,构成该图像具体颜色的索引值就被读入程序里,然后根据索引值找到最终的颜色。(4) RGB 图像(RGB images)一幅 RGB 图像就是彩色像素的一个 MN3 数组,其中每一个
7、彩色像素点都是在特定空间位置上相对应的红、绿、蓝三个分量。按照惯例,形成一幅 RGB 彩色图像的三个矩阵常称为红、绿或蓝分量图像。令 fR,fG 和 fB 分别代表三种 RGB 分量图像。一幅 RGB 图像就利用 cat(级联)操作将这些分量图像组合成彩色图像:rgb_image=cat(3,fR,fG,fB) 在操作中,图像按顺序放置。3、数据类和图像类型间的转化表 1-2 中列出了 MATLAB 和 Image Processing Toolbox 为表示图像所支持的各种数据类。表中的前 8项称为数值数据类,第 9 项称为字符类,最后一项称为逻辑数据类。表 1-3 列出了工具箱中提供的一些
8、必要函数,以便在图像类和数据类之间进行转化。表 1-2 MATLAB 和 IPT 支持数据类型名称 描述double 双精度浮点数,范围为uint8 无符号 8 比特整数,范围为0 255uint16 无符号 16 比特整数,范围为0 65536uint32 无符号 32 比特整数,范围为0 4294967295int8 有符号 8 比特整数,范围为-128 127int16 有符号 16 比特整数,范围为-32768 32767int32 有符号 32 比特整数,范围为-2147483648 2147483647single 单精度浮点数,范围为char 字符logical 值为 0 或 1
9、表 1-3 格式转换函数名称 将输入转化为 有效的输入图像数据类im2uint8 uint8 logical,uint8,uint16 和 doulbeim2uint16 uint16 logical,uint8,uint16 和 doulbemat2gray double,范围为0 1 doubleim2double double logical,uint8,uint16 和 doulbeim2bw logical uint8,uint16 和 double4、常用函数和命令(1) 读写图像文件a) imread:用于读入各种图像文件,返回一个矩阵,如:a=imread(d:p1.jpg)b
10、) whos:用于读取图像的基本信息,如:whos ac) imwrite:用于写入图像文件,如:imwrite(a,d:p2.tif,tif)d) imfinfo:用于读取图像文件的有关信息,如:imfinfo(d:p2.tif)(2) 图像的显示a) image:image 函数是 MATLAB 提供的最原始的图像显示函数,如:a=1,2,3,4;4,5,6,7;8,9,10,11; image(a);b) imshow:用于图像文件的显示,如:i=imread(d:p1.jpg);imshow(i);c) colorbar:用于显示图像的颜色条,如:i=imread(d:p1.jpg);
11、imshow(i);colorbar;d) figure:用于设定图像显示窗口,如:figure(1);figure(2);% n 为图形窗口号数e) subplot:把图形窗口分成多个矩形部分,每个部分可以分别用来进行显示,如:subplot(m,n,p)分成 mn 个小窗口,在第 p 个窗口中创建坐标轴为当前坐标轴,用于显示图形f) plot:绘制二维图形,如:plot(y);plot(x,y);%x、y 可以是向量、矩阵(3) 图像类型转换a) rgb2gray:把真彩图像转换为灰度图像,如:i=rgb2gray(j)b) im2bw:通过阈值化方法把图像转换为二值图像,如:I=im2b
12、w(j,level)Level 表示灰度阈值,取值范围 01,即 0.n 表示阈值取自原图像灰度范围的 n%(4) 其它运算函数a) zeros:生 成 全 0 数 组 或 矩 阵 , 如 : B=zeros(m,n)或 B=zeros(m n), 返 回 一 个 mn 的 全 0 矩 阵b) 取整函数:round 四舍五入取整函数;floor 最小取整函数;ceil 最大取整函数,如:a=-1.9 -0.2 3.4 5.6 2.4+3.6i; I=round(a)输出 I=-2 0 3 6 2+4i三、实验内容1、读入一幅 RGB 图像(sunset.jpg),分别转换为灰度图像和二值图像,
13、并在同一个窗口内分成三个子窗口来分别显示这三幅图像,注上文字标题,即“原图像”、 “灰度图像”、 “二值图像”30813081。subplot(1,3,1);I=imread(d:sunset.jpg);imshow(I);title(原图像);subplot(1,3,2);J=rgb2gray(I);imshow(J);title(灰度图像);subplot(1,3,3);Q=im2bw(J,0.5);imshow(Q);title(二值图像);2、说明以下程序的显示结果为何是一幅几乎全黑的图像。clear; close all;myi=zeros(20,20);myi(2:2:18,2:2
14、:18)=1;myi=uint8(myi);figure, imshow(myi,notruesize);3、阅读分析下列程序,对每条语句给出注释,运行并解释最终执行结果;若将 for 循环改为方框中的程序,有何不同?clear all;close all;I=imread(d:lena512.jpg);height,width=size(I);figure;subplot(2,3,1);imshow(I);title(原图像 );L=1;for m=1:5L=2*L;quartimage=zeros(ceil(height/L),ceil(width/L);k=1;n=1;for i=1:L
15、:heightfor j=1:L:widthquartimage(k,n)=I(i,j);n=n+1;end k=k+1;n=1;endsubplot(2,3,m+1);imshow(uint8(quartimage);endfor m=1:5L=2*L;quartimage=I(1:L:height,1:L:width);subplot(2,3,m+1);imshow(uint8(quartimage);end4、编写程序将一幅灰度图像(orangutan.tif )每两行之间增加一行,即将图像的高度拉伸一倍、宽 度不变,然后将其存储为图像文件。要求拉伸后图像的奇数行对应原图像的各行,偶数行
16、是原图像相邻两行的灰度平均值(即偶数行由插值得到),并将结果与 MATLAB 图像处理工具箱中提供的改变图像大小的函数 imresize(imresize(I,m n)将图像 I 大小调整为 m 行n 列)的处理结 果进行比较 。T1=maketform(affine,1 0 0;0 2 0;0 0 1);I=imread(c:orangutan.tif);I1=imtransform(I,T1);imshow(I),figure,imshow(I1)5、熟悉数字图像处理常用函数的使用,调出帮助文档查看其各种不同用法。MatLab 具有完善的帮助系统,包括命令行帮助、联机帮助和演示帮助等,应学
17、会充分利用帮助系统来解决问题。获得帮助的途径有多种,如:(1) 在 MatLab 界面中单击工具条上的问号,或单击 Help 菜单中的 MATLAB Help 选项;或按 F1 键打开 Help 窗口。(2) 选择函数(函数所在区变暗) ,点右键弹出菜单,选择 Help on Selection;或在 command 窗口键入 help 函数名(或工具箱名) 。实验二 图像直方图及灰度变换一、实验目的与要求1掌握图像灰度直方图的概念及其计算方法,编写灰度直方图统计程序。2通过对图像直方图的分析,学习应用直方图法解决诸如图像二值化等具体问题。3熟悉直方图均衡化的计算过程及其应用。4掌握图像灰度变
18、换技术,通过调整图像的对比度和亮度等参数,改善视觉效果。二、实验相关知识直方图是图像最基本的统计特征,是图像亮度分布的概率密度函数,反映了图像灰度值的分布情况。直方图是多种空间域处理技术的基础。直方图操作能有效地用于图像增强,如通过直方图均衡化处理,可使图像在整个灰度级范围内的分布均匀化,即在每个灰度级上都具有相同的像素点数,从而获得较好的视觉效果。另外,直方图固有的信息也可用在图像分割等其它图像处理的应用中。灰度级变换技术可用 g(x,y)=Tf(x,y)的形式表示,其中 f(x,y)为输入图像,g(x,y)为输出图像,T 是对图像 f 进行某种处理的操作。由于(x,y)处的 g 值仅由 f
19、 在该点处的亮度决定,T 也称为一个亮度或灰度级变换函数,它与位置坐标(x,y)无关,所以通常写成如下的简化形式 s=T(r),其中 r 和 s 分别表示图像 f 和 g 在相应点(x,y)的亮度。利用灰度变换可调整一幅图像的明暗、对比度等。三、实验内容1、编写一个图像灰度直方图统计函数 my_imhist,选择一幅图像利用 my_imhist 显示其直方图,将 结果与 MATLAB 图像处理工具箱中提供的灰度直方图函数 imhist 的处理结果进行比较,并在同一窗口中显 示出来。a=imread(C:iris.tif );J=a;L=256; my=zeros(L,1);row,col=si
20、ze(a);n=row*col;for i = 1:rowfor j = 1:colnum = double(a(i,j)+1;my(num) = my(num)+1;endend%计算直方图概率估计for i=1:Lendfigure;subplot(1,2,2);imhist(a);title(imhist 处理)subplot(1,2,1);bar(my);title(自编函数处理)2、利用以上编写的函数 my_imhist 或 imhist,估算 图像 iris.tif 中瞳孔的半径(以像素为单位)。100200 之间的单位个数为 8,则瞳孔面积大概为 80000 像素,利用求半径公式
21、 S=3.14R2 得到半径 R=(S/3.14)=(80000/3.14)160 像素img=imread(C:iris.tif); imshow(img);M,N=size(img); img=double(img); h=zeros(256,256); for i=1:M, for j=1:N, f=img(i,j); h(f+1)=h(f+1)+1; end end figure;bar(h);grid;I = imread(D:iris.tif); imhist(I) 3、利用 MATLAB 提供的图像直方图修正函数 histeq,选择一幅直方图不均匀的图像如pout.tif,对其进
22、行直方图 均衡化处理,显示处理前后的图像以及它们的灰度直方图,体会直方图均衡化算法的特点。I=imread(pout.tif);H=histeq(I);subplot(2,2,1),imshow(I);title(源图像 );subplot(2,2,2),imshow(H);title(均衡化后的图像);subplot(2,2,3),imhist(I);title(源图像的直方图);subplot(2,2,4),imhist(H);title(均衡化后的图像直方图);4、按照教材68页上的公式(4.1.6)(4.1.6) ffg MyxfbdyxbMdacacfyxyx ),(),(/()0,
23、(),以及公式 ,分别编程实现图像的分段线性灰度变换和非线性灰度变换。利),(),(fcyxg用自己编写的代码对图像 bottle.tif 进行灰度调整,使拍摄主体瓶子的花纹更加清晰地表现出来,以改善视觉效果。将同一个图形窗口分成四个子窗口来分别显示灰度变换前、后的 图像以及它们的灰度直方图,注上文字标题。并考 虑利用 MATLAB 提供的 imadjust 函数是否能完成同样的工作。F=imread(d:bottle.tif);row,col=size(F); max=double(F(1,1)+1; for i=1:row for j=1:colk=double(F(i,j)+1;if m
24、axmax disp(输入源图像的范围不能大于最大值!);endre=input(请输入变换后的灰度范围:);c=re(1);d=re(2);if d256 %判断 d 是否超过 256disp(输入变换后的范围不能超过 255!);endG=zeros(row,col); for i=1:row for j=1:colk=double(F(i,j)+1;if kaG(i,j)=(c/a)*F(i,j);elseif kbG(i,j)=(d-c)/(b-a)*(F(i,j)-a)+c;elseG(i,j)=(255-d)/(max-b)*(F(i,j)-b)+d;endendendout=ui
25、nt8(round(G-1); figure,imshow(F); title(源图像 );figure,imshow(out); title(线性变换后);figure,imhist(F); title(源图像的直方图);figure,imhist(out); title(线性变换后的直方图);disp(-下面进行非线性变换,其变换公式为 g=c*fy-);y=input(请输入指数 y:);c=input(请输入乘数 c:);g=zeros(row,col); for i=1:row for j=1:colk=double(F(i,j)+1;g(i,j)=c*(ky); endendmax
26、=g(1,1);for i=1:row for j=1:colif maxg(i,j)max=g(i,j);endendendscale=max/256;for i=1:rowfor j=1:colg(i,j)=round(g(i,j)/scale);endendout2=uint8(round(g-1);figure,imshow(out2); title(非线性变换后);figure,imhist(out2); title(非线性变换后的直方图);实验三 图像增强与边缘检测一、实验目的与要求1加深对图像增强及边缘检测技术的感性认识,应用 MATLAB 工具箱自带的处理函数或自己编程完成相关
27、的工作,分析处理结果,巩固所学理论知识。2熟练掌握空域滤波中常用的平滑和锐化滤波器,针对不同类型和强度的噪声,进行滤波处理,体会并正确评价滤波效果,了解不同滤波方式的使用场合,能够从理论上作出合理的解释。3掌握基于边缘检测的图像分割方法,通过实验体会主要的边缘检测算子在处理结果上的异同,探讨不同因素对轮廓提取效果的影响,培养处理实际图像的能力。二、实验相关知识图像增强是指按特定的需要突出一幅图像中的某些有用信息,同时消弱或去除某些不需要的信息的处理方法,其主要目的是使处理后的图像对某些特定的应用比原来的图像更加有效。图像平滑与锐化处理是图像增强的主要研究内容。图像分割是由图像处理过渡到图像分析
28、的关键步骤,一般是按照一定的规则,把图像分成互不重叠的若干区域或子集,并提取出感兴趣目标的技术和过程。本实验主要研究利用边缘提取算子的分割方法。和本实验有关的几个常用 Matlab 函数:(1) imnoise:用于对图像生成模拟噪声,如:j=imnoise(i,gaussian,0,0.02) %在 图 像 i 上 叠 加 均 值 为 0、 方 差 为 0.02 的 高 斯 噪 声 , 得 到 含 噪 图 像 jj=imnoise(i,salt %产生 33 模板的均值滤波器h=fspecial(sobel); %产生 sobel 水平边缘增强的滤波器可选项还有:gaussian高斯低通滤波
29、器、laplacian拉普拉斯滤波器、log高斯拉普拉斯滤波器等(3) imfilter、filter2、conv2:均是基于卷积的图像滤波函数,都可用于图像滤波,用法类似,如:i=imread(p1.tif);h=fspecial(prewitt); %产生 prewitt 算子的水平方向模板j1=imfilter(i,h); %或者 j2=filter2(h,i); 或者 j3=conv2(i,h);(4) medfilt2:用于图像的中值滤波,如:j=medfilt2(i, M N); %对矩阵 i 进行二维中值滤波,邻域为 MN,缺省值为 33(5) edge:检 测 灰 度 或 二
30、值 图 像 的 边 缘 , 返 回 一 个 二 值 图 像 , 1 像 素 是 检 测 到 的 边 缘 , 0 像 素 是 非 边 缘用法:BW=edge(I,sobel,thresh,direction); %I 为检测对象;边缘检测算子可用 sobel、roberts、prewitt、zerocross、log、canny ;thresh 指定阈值,检测时忽略所有小于阈值的边缘,默认自动选择阈值;direction 指定方向,可选项有 horizontal、vertical 或 both,在指定的方向上用算子进行边缘检测三、实验内容1、图像平滑(去噪):选择一幅图像,例如 rice.png
31、,分 别叠加零均值高斯噪声、椒 盐噪声,然后分别采用 33、55 不同大小的窗口,再分别利用 邻域平均法、中值滤波法对噪声图像进行滤波,最后采用便于观察比 较的形式, 显示出滤波前后的各个图像,分析不同 滤波器对不同噪声的处理效果及其优缺点。思考如何寻找合适的滤波器,使之能较好地滤除噪声,同 时又能保持细节和边缘清晰。I=imread(C:rice.png);J0=imnoise(I,gaussian);J1=imnoise(I,salt J0J3=imfilter(J0,fspecial(average);J0J5=imfilter(J0,fspecial(average,5 5);J0Z3
32、=medfilt2(J0);J0Z5=medfilt2(J0,5 5);J1J3=imfilter(J1,fspecial(average);J1J5=imfilter(J1,fspecial(average,5 5);J1Z3=medfilt2(J1);J1Z5=medfilt2(J1,5 5);subplot(2,2,1),imshow(I);title(原始图像 );subplot(2,2,2),imshow(J0);title(加入零均值高斯噪声);subplot(2,2,3),imshow(J1);title(加入椒盐噪声);figure,subplot(2,2,1),imshow(
33、J0J3);title(对高斯噪声,采用 3x3 均值滤波);subplot(2,2,2),imshow(J0J5);title(对高斯噪声,采用 5x5 均值滤波);subplot(2,2,3),imshow(J0Z3);title(对高斯噪声,采用 3x3 中值滤波);subplot(2,2,4),imshow(J0Z5);title(对高斯噪声,采用 5x5 中值滤波);figure,subplot(2,2,1),imshow(J1J3);title(对椒盐噪声,采用 3x3 均值滤波);subplot(2,2,2),imshow(J1J5);title(对椒盐噪声,采用 5x5 均值滤
34、波);subplot(2,2,3),imshow(J1Z3);title(对椒盐噪声,采用 5x5 中值滤波);2、利用 Laplacian 增强算子对图像 rice.png 进行锐化处理,显示处理前后的图像;若图像叠加了一定程度的噪声,则对锐化结果有何影响?请设计一种处理方法,在增强图像边缘的同时尽量减少噪声的影响。i=imread(C:rice.png);i3=imnoise(i,salt w4=fspecial(laplacian,0);i3=im2double(i3);j4=i3-imfilter(i3,w4,replicate);figure,imshow(j4);title(椒盐- 锐化)3、分别用 Roberts、Prewitt、Sobel 三种边缘检测算子,对图像 wire.bmp 进行水平、垂直及各个方向的边界检测,并将 检测结果转化为白底黑线条的方式显示出来;对图像叠加噪声后再进行边缘检测,比较各 边缘检测算子对噪声的敏感性,并提出抗噪性能较好的边缘检测方法。