1《数字图像处理》实验指导书张启东2实验一MATLAB图像及其操作一、实验目的1、熟练使用各种常用MATLAB命令2、了解MATLAB图像文件格式;3、了解MATLAB图像类型;4、了解MATLAB图像文件的读写;5、了解MATLAB标准的图像显示技术;二、实验原理及内容首先,数字图像以一定的格式存放在计算机的存储器中(如磁盘),常见的格式有BMP,TIF,PCX等等,因此我们要进行数字图像处理,需要完成的第一项工作就是把图像读到计算机的内存中,以便进行进一步的处理。在Matlab中,函数imread()完成此项工作。我们用下面一小段Matlab语句即可实现将图像“rice.tif”显示在一个图像窗口的左边,将其轮廓图显示在该窗口的右边。I=imread('rice.tif');subplot(1,2,1);imshow(I)subplot(1,2,2);imcontour(I);这里,imread(‘rice.tif’)将磁盘上的图像文件rice.tif读入内存变量I中,subplot(1,2,1)生成一个可以横向放置2幅图像的窗口,并设置下一显示位置在左边,imshow(I)显示图像I,subplot(1,2,2)准备下一图像的显示位置,imcontour(I)生成图像I的轮廓并显示在窗口的右边。数字图像一般可分为二值图、灰度图和真彩图等几类。我们再看下面一段程序:bw=imread('text.tif');bw2=imcomplement(bw);subplot(1,2,1),imshow(bw)subplot(1,2,2),imshow(bw2)3这里函数imcomplement(bw)完成对二值图像text.tif(bw)的求补运算,(即原来黑的变白的,原来白的变黑的。)各种常用MATLAB命令:clc:清理窗口内容clear:清空变量cd:进入当前目录cd('..'):退出当前目录help,helpwin,helpdesk:帮助who,whos:显示变量情况imfinfo:显示文件基本情况,用法:imfinfo('文件名')save,load:存贮,读取文件(变量)pwd:显示当前工作目录mkdir('文件名'):新建文件夹zeros(m,n):生成m行n列零矩阵ones(m,n):生成m行n列1矩阵eye(m,m):生成m阶单位矩阵rand(m,n):生成m行n列随机均匀分布矩阵randn(m,n):生成m行n列随机正态分布矩阵length(a):向量长度[m,n]=size(A):求取矩阵行列norm(A,2):矩阵二范数,最大奇异值norm(A,'fro'):矩阵F范数trace(A):矩阵迹sum:求和prod(a):向量所有元素求积cumsum(a):向量累和cumprod:向量累积mean(a):求平均值min(a),max(a):求向量最大最小min(a(:)),max(a(:)):求矩阵中最大最小值abs(a):绝对值、模、频谱var(a):方差std(a):标准差sort(a):向量升序排序diag(A):对角元素det(A):行列式4rank(A):秩gcd():最大公因子lcm():最小公倍数mod(m,n),rem(m,n):求余数fix(x):往0方向取整floor(x):往负方向取整ceil(x):往正方向取整round(x):四舍五入取整conj(z):复共轭real(z),imag(a):实(虚)部imread:读取数字图像为矩阵double(A):转换成双精度uint8(A):转换成8位表示imwrite:存取或者压缩文件rgb2gray:彩色转换成灰度im2bw:灰度转换成二值imshow:显示图像subplot:按阵列显示figure:显示图像,且保留前面图像stem:用竖画线显示向量imcrop:剪切图像imresize:重新设定图像大小imrotate:旋转图像imnoise:加噪svd:奇异值分解gsvd:广义奇异值分解fft:一维傅立叶变换fft2:二维傅立叶变换fftshift:交换傅立叶变换的1,3象限和2,4象限dwt(idwt):小波变换(小波逆变换)dct:余弦变换dualtree:二元树复小波变换5实验二灰度图像直方图统计实验一、实验目的1、了解空域变换增强变换及实现;2、掌握直方图处理方法二、实验原理及内容1、直方图均衡化处理。这里有一幅图像,其动态范围较小,而且较暗,反映在直方图上,直方图所占据的灰度值范围比较窄,而且集中在低灰度值一边。为了使图像更清晰,我们采用直方图均衡化的方法来增加图像灰度动态范围,增强对比度。在MATLAB中,可以直接调用J=histeq(I,n)函数来完成这项工作,其中I是原始图像矩阵,J是变换后所得的图像矩阵;用户可以指定均衡化%后的灰度级数n,默认值为64。I=imread('tire.tif');J=histeq(I);imshow(I)figure,imshow(J)figure,imhist(I,64)figure,imhist(J,64)2、直方图规定化处理。I=imread('tire.tif');hgram=0:255J=histeq(I,hgram);imshow(I)figure,imshow(J)figure,imhist(I,64)figure,imhist(J,64)实验三空域图像增强实验一、实验目的1、了解空域滤波增强变换及实现;二、实验原理及内容1、线性平滑滤波器处理。常用均值滤波器、维纳滤波器、高斯滤波器。%以saturn.tif为例,加入椒盐噪声,并在MATLAB中调用B=filter2(h,A)实现均值过滤器I=imread('saturn.tif');J=imnoise(I,'salt&pepper',0.02);6imshow(I)figure,imshow(J)K1=filter2(fspecial('average',3),J)/255;K2=filter2(fspecial('average',5),J)/255;K3=filter2(fspecial('average',7),J)/255;figure,imshow(K1)figure,imshow(K2)figure,imshow(K3)实现维纳滤波器I=imread('saturn.tif');J=imnoise(I,'gaussian',0,0.005);K1=wiener2(J,[5,5]);figure,imshow(K1)实现高斯滤波器I=imread('saturn.tif');J=imnoise(I,'gaussian',0,0.005);figure,imshow(J)h=fspecial('gaussian');K=filter2(h,J)/255;figure,imshow(K)2、非线性平滑滤波器处理。常用中值滤波器%下面仍以saturn.tif为例,加入椒盐噪声,并采用中值过滤器I=imread('saturn.tif');J=imnoise(I,'salt&pepper',0.02);K1=medfilt2(J,[3,3]);figure,imshow(K1)3、线性锐化滤波器处理。常用拉普拉斯算子。I=imread('saturn.tif');h=fspecial('laplacian');I2=filter2(h,J);imshow(I)figure,imshow(I2)4、非线性锐化滤波器处理。常用sobel算子、prewitt算子等。I1=imread('blood1.tif');figure,imshow(I1)h1=fspecial('sobel');I2=filter2(h1,I1);figure,imshow(I2)I3=conv2(I1,h1);figure,imshow(I3)7h2=fspecial('prewitt');I4=filter2(h2,I1);figure,imshow(I4)h3=fspecial('log');I5=filter2(h3,I1);figure,imshow(I5)实验四频域图像增强实验一、实验目的1、了解低通滤波;2、了解高通通滤波;二、实验原理及内容1、一般来说,图像的边缘和噪声都对应于傅立叶变换中的高频部分,所以能够让低频信息畅通无阻而同时滤掉高频分量的低通滤波器能够平滑图像,去除噪声。常用的几种频域低通滤波器有理想低通滤波器、巴特沃斯低通滤波器、指数低通滤波器。巴特沃斯低通滤波器(Butterworth)实现I1=imread('Saturn.tif');figure,imshow(I1)I2=imnoise(I1,'salt&pepper');figure,imshow(I2)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);fori=1:N1forj=1:N2d=sqrt((i-n1)^2+(j-n2)^2);%计算Butterworth低通转换函数h=1/(1+0.414*(d/d0)^(2*n));result(i,j)=h*g(i,j);end8endresult=ifftshift(result);X2=ifft2(result);X3=uint8(real(X2));figure,imshow(X3)`2、由于图像中灰度发生骤变的部分与其频谱的高频分量相对应,所以采用高通滤波器衰减或抑制低频分量,使高频分量畅通并能够对图像进行锐化处理。常用的高通滤波器有理想高通滤波器、巴持沃斯高通滤波器、指数高通滤波器.巴特沃斯高通滤波器(Butterworth)实现I1=imread('blood1.tif');figure,imshow(I1)f=double(I1);g=fft2(f);%傅里叶变换g=fftshift(g);%转换数据矩阵[N1,N2]=size(g);n=2;d0=5;n1=fix(N1/2);n2=fix(N2/2);fori=1:N1forj=1:N2d=sqrt((i-n1)^2+(j-n2)^2);ifd==0h=0;elseh=1/(1+(d0/d)^(2*n));endresult(i,j)=h*g(i,j);endendresult=ifftshift(result);X2=ifft2(result);X3=uint8(real(X2));figure,imshow(X3)实验五边缘检测一、实验目的1、对图像进行边缘检测;92、了解常用的边缘检测算子二、实验原理及内容1、边缘检测的基本原理及处理函数常用的边缘检测算于有Robert算子、Sobel算了、Prewitt以算子、LOG算子和Canny算子,以下分别进行介绍。(1)Robert算子Robert算于是一种利用局部差分算子寻找边缘的算子,其模板如图1所示。Robert算子对具有陡峭的低噪声的图像效果较好。图1Robert算子在MATLAB中可以由edge函数实现,语法路式如下:;Bw=edge(I.'robert')Bw=edge(I,'robert',thresh)[BW,thresh]=edge(I,'roberts',…)BW=edge(I,'robert')自动选择阈值使用Robert算子进行边缘检测。BW=edge(I,'robert',thresh)根据所指定的敏感度阀值thresh用Robert算子进行边缘检测,它忽略了所有小于阀值的边缘。当thresh为空([])时,自动选择阈值。[BW,thresh]=edge(I,'robert',…)返回阀值。edge函数对灰度图像I进行边缘检测,返回与I同样大的二值图像BW,其中1表示I中的边缘,0表非边缘,I是uint8型、uint16型.或double型,BW是uint8型的。(2)Sobel算子Sobel算子的两个卷积