数字图像处理实验报告(共37页).doc
精选优质文档-倾情为你奉上数字图像处理实验报告实验一 数字图像处理编程基础一、实验目的1. 了解MATLAB图像处理工具箱;2. 掌握MATLAB的基本应用方法;3. 掌握MATLAB图像存储/图像数据类型/图像类型;4. 掌握图像文件的读/写/信息查询;5. 掌握图像显示-显示多幅图像、4种图像类型的显示方法;6. 编程实现图像类型间的转换。二、实验内容1. 实现对图像文件的读/写/信息查询,图像显示-显示多幅图像、4种图像类型的显示方法、图像类型间的转换。2. 运行图像处理程序,并保存处理结果图像。三、源代码I=imread('cameraman.tif')imshow(I);subplot(221),title('图像1');imwrite('cameraman.tif')M=imread('pout.tif')imview(M)subplot(222),imshow(M);title('图像2');imread('pout.bmp')N=imread('eight.tif')imview(N)subplot(223),imshow(N);title('图像3');V=imread('circuit.tif')imview(V)subplot(224),imshow(V);title('图像4');N=imread('C:UsersAdministratorDesktop1.jpg')imshow(N);I=rgb2gary(GRB)X.map=gary2ind(N,2)RGB=ind2 rgb(X,map)X.map=gary2ind(I,2)I=ind2 gary(X,map)I=imread('C:UsersdellDesktop111.jpg'); subplot(231),imshow(I);title('原图');M=rgb2gray(I); subplot(232),imshow(M); X,map=gray2ind(M,100);subplot(233),imshow(X); RGB=ind2rgb(X,map); subplot(234),imshow(X); X,map=rbg2ind(I);subplot(235),imshow(X); 四、实验效果 实验二 图像几何变换实验一、实验目的1学习几种常见的图像几何变换,并通过实验体会几何变换的效果;2掌握图像平移、剪切、缩放、旋转、镜像等几何变换的算法原理及编程实现; 3掌握matlab编程环境中基本的图像处理函数。二、实验原理1. 初始坐标为的点经过平移,坐标变为,两点之间的关系为:,以矩阵形式表示为: 2. 图像的镜像变换是以图象垂直中轴线或水平中轴线交换图像的变换,分为垂直镜像变换和水平镜像变换,两者的矩阵形式分别为: 3. 图像缩小和放大变换矩阵相同:当,时,图像缩小;当,时,图像放大。4. 图像旋转定义为以图像中某一点为原点以逆时针或顺时针方向旋转一定 角度。其变换矩阵为:该变换矩阵是绕坐标轴原点进行的,如果是绕一个指定点旋转,则先要将坐标系平移到该点,进行旋转,然后再平移回到新的坐标原点。三、实验内容1. 启动MATLAB程序,对图像文件分别进行平移、垂直镜像变换、水平镜像变换、缩放和旋转操作。2运行图像处理程序,并保存处理结果图像。四、源代码及实验效果1.平移I=imread('circuit.tif');subplot(121),imshow(I);title('before');I=double(I);M=zeros(size(I); N=size(I);x=10;y=10;M(x+1:N(1),y+1:N(2)=I(1:N(1)-x,1:N(2)-y);subplot(122),imshow(uint8(M);title('after');2.水平垂直镜像I=imread('pout.tif');subplot(131),imshow(I);title('before');I=double(I);A=zeros(size(I);B=zeros(size(I);M=size(I);A(1:M(1),1:M(2)=I(M(1):-1:1,1:M(2);B(1:M(1),1:M(2)=I(1:M(1),M(2):-1:1);subplot(132),imshow(uint8(A);title('竖直');subplot(133),imshow(uint8(B);title('水平');3. 缩放I=imread('pout.tif');subplot(131),imshow(I);title('before');I=double(I);A=zeros(size(I);B=zeros(size(I);m,n=size(I);x=1.8;y=1.8;x2=0.85;y2=0.85;for i=1:m for j=1:n i1=round(i*x); j1=round(j*y); i2=round(i*x2); j2=round(j*y2); if(j1>=0)&&(i1>=0)&&(i1<=m)&&(j1<=n) A(i,j)=I(i1,j1); end if(j2>=0)&&(i2>=0)&&(i2<=m)&&(j2<=n) B(i,j)=I(i2,j2); end endendsubplot(132),imshow(uint8(A);title('small');subplot(133),imshow(uint8(B);title('big');4. 旋转jiao=50; M=imread('cameraman.tif'); imshow(M); h w=size(M); theta=jiao/180*pi;rot=cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1; %建立变换矩阵pix1=1 1 1*rot; %变后左上pix2=1 w 1*rot; %变后右上pix3=h 1 1*rot; %变后左下pix4=h w 1*rot; %变后右下 height=round(max(abs(pix1(1)-pix4(1)+0.5 abs(pix2(1)-pix3(1)+0.5); %新宽width=round(max(abs(pix1(2)-pix4(2)+0.5 abs(pix2(2)-pix3(2)+0.5); %新高N=zeros(height,width); chao_y=abs(min(pix1(1) pix2(1) pix3(1) pix4(1); %y负轴超量chao_x=abs(min(pix1(2) pix2(2) pix3(2) pix4(2); %x负轴超量 for i=1-chao_y:height-chao_y for j=1-chao_x:width-chao_x pix=i j 1/rot; %用变换后图像的点的坐标去寻找原图像点的坐标, float_Y=pix(1)-floor(pix(1); %向下舍入 float_X=pix(2)-floor(pix(2); if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w pix_up_left=floor(pix(1) floor(pix(2); %四个相邻的点 pix_up_right=floor(pix(1) ceil(pix(2); pix_down_left=ceil(pix(1) floor(pix(2); pix_down_right=ceil(pix(1) ceil(pix(2); value_up_left=(1-float_X)*(1-float_Y); %周围四个点权重 value_up_right=float_X*(1-float_Y); value_down_left=(1-float_X)*float_Y; value_down_right=float_X*float_Y; N(i+chao_y,j+chao_x)=value_up_left*M(pix_up_left(1),pix_up_left(2)+ . value_up_right*M(pix_up_right(1),pix_up_right(2)+ . value_down_left*M(pix_down_left(1),pix_down_left(2)+ . value_down_right*M(pix_down_right(1),pix_down_right(2); end endend figure,imshow(uint8(N)实验三 图像增强实验一、实验目的1. 掌握基本的图像增强方法,观察图像增强的效果,加深对灰度直方图的理解。2. 掌握对数和和指数增强,直方图均衡化方法,重点掌握图像直方图增强的原理和程序设计。二、实验原理对数变化能对原图像的动态范围进行压缩,其数学表达如下:其中C为尺寸比例常数。指数变化一般的表示形式:(a,b,c用于调整曲线的位置和形状的参数。)利用直方图统计的结果,使图像的直方图均衡的方法称为直方图均衡化,直方图均衡化可以达到增强图像显示效果的作用。通过直方图统计,可以观察出,图像中各种亮度所占的比例大部分布不均匀,设法增加在直方图统计中所占比例高的象素和其他比例少的象素之间亮度差,可以提高图像的显示效果。简单来说,直方图增强的方法就是压缩直方图中比例少的象素所占用的灰度范围,多出来的灰度空间按照统计比例分配给直方图中比例高的象素使用。这种方法主要是针对人眼对灰度差别越大的图像越容易分辨的特点而进行的增强。三、实验内容1.实现对数增强或指数增强。2.实现图像直方图均衡化增强。四、分析思考思考为什么进行图像直方图均衡化后,能够增强图像效果。答:因为直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对集中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。5、 源代码及实验效果1. 对数增强 I=imread('cameraman.tif');subplot(221);imshow(I); I=double(I); I2=41*log(1+I); I2=uint8(I2); subplot(222); imshow(I2);2. 指数增强I=imread('circuit.tif');>> M,N=size(I);>> g=zeros(M,N);>> I=double(I);>> g=double(g);>> k1=min(min(I);>> k2=max(max(I);>> a=(k2-k1)/2;b=k2-80;c=k1-20; for i=1:M for j=1:N g(i,j)=b(c*(I(i,j)-a)-1;endend>> figure;>> subplot(121); imshow(I,);>> subplot(122);>> imshow(g,);>> 3. 直方图均衡化增强I=imread('pout.tif'); graydis=zeros(1,256); %设置矩阵大小graydispro=zeros(1,256);new_graydis=zeros(1,256);new_graydispro=zeros(1,256);h w=size(I);N=zeros(h,w);%计算原始直方图各灰度级像素个数graydisfor x=1:h for y=1:w graydis(1,I(x,y)=graydis(1,I(x,y)+1; endend%计算原始直方图graydisprograydispro=graydis./sum(graydis);subplot(2,2,1);plot(graydispro);title('灰度直方图');xlabel('灰度值');ylabel('像素的概率密度');%计算原始累计直方图for i=2:256 graydispro(1,i)=graydispro(1,i)+graydispro(1,i-1);end%计算和原始灰度对应的新的灰度t,建立映射关系for i=1:256t(1,i)=floor(254*graydispro(1,i)+0.5);end%统计新直方图各灰度级像素个数for i=1:256 new_graydis(1,t(1,i)+1)=new_graydis(1,t(1,i)+1)+graydis(1,i);end%计算新的灰度直方图new_graydispronew_graydispro=new_graydis./sum(new_graydis);subplot(2,2,2);plot(new_graydispro);title('均衡化后的灰度直方图');xlabel('灰度值');ylabel('像素的概率密度');%计算直方图均衡后的新图new_tufor x=1:h for y=1:w N(x,y)=t(1,I(x,y); endendsubplot(2,2,3),imshow(I,);title('原图');subplot(2,2,4),imshow(N,);title('直方图均衡化后的图');实验四 图像滤波实验一、实验目的掌握中值滤波方法,掌握图像锐化方法,比较各个梯度算子锐化的效果。掌握频域滤波方法,观察低通滤波和高通滤波的效果。二、实验原理中值滤波是一种非线性平滑滤波,它是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替。图像的锐化是使边缘和轮廓线模糊的图像变得清晰,使其细节更加清晰。从数学上看,图像模糊的实质是图像受到平均或者积分运算的影响,因此对其进行逆运算(如微分运算)就可以使图像清晰。在频域上卷积被表示为乘积,因此在频域上对图像进行滤波就变得更加直观了。在频域上进行滤波的步骤:计算需增强的图像的傅里叶变化。将其与1个传递函数相乘。再将结果进行傅里叶逆变化可以得到增强的图像。三、实验内容1. 选择测试图像分别添加高斯、椒盐、泊松噪声,实现中值滤波; 2. 选择测试图像实现两种常用梯度算子(Sobel算子、Prewitt算子); 3. 选择测试图像实现理想低通滤波; 4. 选择测试图像实现巴特沃斯高通滤波。四、分析思考依次给出“均值滤波器、中值滤波器、laplace滤波器”是线性还是非线性的。 答:均值滤波器和中值滤波器是线性的,laplace滤波器是非线性的。5、 源代码及实验效果1.椒盐噪声I=imread('cameraman.tif'); I=imnoise(I,'salt & pepper',0.02); I=double(I);dep,wide=size(I); M=ones(size(I); for i=3:dep-2 for j=3:wide-2 M(i,j)=median(I(i-2,j-2) I(i-2,j-1) I(i-2,j) I(i-2,j+1) I(i-2,j+2) I(i-1,j-2) I(i-1,j-1) I(i-1,j) I(i-1,j+1) I(i-1,j+2) I(i,j-2) I(i,j-1) I(i,j) I(i,j+1) I(i,j+2) I(i+1,j-2) I(i+1,j-1) I(i+1,j) I(i+1,j+1) I(i+1,j+2) I(i+2,j-2) I(i+2,j-1) I(i+2,j) I(i+2,j+1) I(i+2,j+2); endend for i=3:dep-2M(i,1)=M(i,3); M(i,2)=M(i,3); M(i,wide-1)=M(i,wide-2); end M(1,:)=M(3,:); M(2,:)=M(3,:); M(dep,:)=M(dep-2,:); M(dep-1,:)=M(dep-2,:); figure subplot(121),imshow(uint8(I); subplot(122),imshow(uint8(M);2. 高斯噪声3. 泊松噪声4. SobelI=imread('cameraman.tif'); H,W=size(I); M=double(I); J=M; for i=2:H-1 for j=2:W-1 J(i,j)=abs(M(i-1,j+1)-M(i-1,j-1)+2*M(i,j+1)-2*M(i,j-1)+M(i+1,j+1)-M(i+1,j-1)+abs(M(i-1,j-1)-M(i+1,j-1)+2*M(i-1,j)-2*M(i+1,j)+M(i-1,j+1)-M(i+1,j+1); end; end; subplot(1,2,1);imshow(I);title('原图'); subplot(1,2,2);imshow(uint8(J);title('Sobel 处理后'); 5. PrewwitI=imread('cameraman.tif'); H,W=size(I); M=double(I); J=M; for i=2:H-1 for j=2:W-1 J(i,j)=abs(M(i-1,j+1)-M(i-1,j-1)+M(i,j+1)-M(i,j-1)+M(i+1,j+1)-M(i+1,j-1)+abs(M(i-1,j-1)-M(i+1,j-1)+M(i-1,j)-M(i+1,j)+M(i-1,j+1)-M(i+1,j+1); end; end; subplot(1,2,1);imshow(I);title('原图'); subplot(1,2,2);imshow(uint8(J);title('Prewitt处理后'); 6. 理想低通滤波 G=imread('pout.tif');J=imnoise(G,'salt & pepper',0.02);subplot(121),imshow(J);title('添加椒盐噪声图像');J=double(J);%采用傅立叶变换f=fft2(J);%采用矩阵平衡g=fftshift(f);M,N=size(f);n=3;d0=45;n1=floor(M/2);%向下取整n2=floor(N/2);for i=1:M for j=1:N d=sqrt(i-n1)2+(j-n2)2); if d<=d0 h=1; else h=0; end g(i,j)=h*g(i,j); endendg=ifftshift(g);g=uint8(real(ifft2(g);subplot(122);imshow(g);title('理想低通滤波后图像'); 7. 巴特沃斯高通滤波J=imread('cameraman.tif');subplot(221),imshow(uint8(J);title('模糊图像');J=double(J);f=fft2(J);g=fftshift(f);M,N=size(f);n1=floor(M/2);n2=floor(N/2);n=2;d0=20;for i=1:Mfor j=1:Nd=sqrt(i-n1)2+(j-n2)2);if d=0h1=0;h2=0.5;elseh1=1/(1+(d0/d)(2*n);h2=1/(1+(d0/d)(2*n)+0.5;endgg1(i,j)=h1*g(i,j);gg2(i,j)=h2*g(i,j);endendgg1=ifftshift(gg1);gg1=uint8(real(ifft2(gg1);subplot(223);imshow(gg1);title('巴特沃斯高通滤波结果');gg2=ifftshift(gg2);gg2=uint8(real(ifft2(gg2);subplot(224);imshow(gg2);title('巴特沃斯高通加强滤波结果');实验五 图像分割实验一、实验目的掌握梯度边缘检测算子,了解拉普拉斯边缘检测算子和Canny边缘检测算子;掌握边界跟踪方法及其原理;掌握自动阈值法和分水岭法。二、实验原理图像分割是按照一定的规则把图像划分成若干个互不相交、具有一定性质的区域,把人们关注的部分从图像中提取出来,进一步加以研究分析和处理。图像分割的结果是图像特征提取和识别等图像理解的基础,对图像分割的研究一直是数字图像处理技术研究中的热点和焦点。图像分割使得其后的图像分析,识别等高级处理阶段所要处理的数据量大大减少,同时又保留有关图像结构特征的信息。图像分割在不同的领域也有其它名称,如目标轮廓技术、目标检测技术、阈值化技术、目标跟踪技术等,这些技术本身或其核心实际上也就是图像分割技术。边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。为了克服一阶导数的缺点,我们定义图像的梯度为梯度算子,它是图像处理中最常用的一阶微分算法。图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以反映出图像边缘上的灰度变化。三、实验内容1. 实现三种梯度算子(Roberts、Sobel、Prewitt)的边缘检测。2. 实现对一张二值图像的边界跟踪。 3.实现分水岭算法。四、分析思考如何实现彩色图像的边缘检测?梯度算子和拉普拉斯算子、Canny算子本质区别。答:可以先将彩色图像灰度化然后进行检测。分析比较:Roberts算子:边缘定位精度高,但容易丢失部分边缘,因为没有经过平滑处理,故不具有抑制噪声的能力,适合于具有陡峭边缘且含噪声少的图像。Sobel算子:因为有对图像作加权平滑处理,所以对噪声具有一定抑制能力,但不能完全排除检测结果中出现的虚假边缘,所以边缘容易出现多像素宽度。拉氏算子:因为不依赖于边缘方向,所以对图像中的阶跃型边缘点定位准确。由于它对噪声非常敏感,能使噪声成分得到加强,导致了算子容易丢失一部分边缘的方向信息,造成了一些不连续的检测边缘,可以说抗噪能力较差。Canny算子:该算子采用高斯函数对图像做平滑处理,故具有较强的抑噪能力,同时利用双阈值检测和连接边缘,在多尺度检测和方向性搜索方面较好。五、源代码及效果1.robertI=imread('cameraman.tif'); %读取原图像subplot(121),imshow(I);title('原图');I=mat2gray(I); %实现图像矩阵的归一化操作m,n=size(I);M=I;%为保留图像的边缘一个像素robertsNum=0; %经roberts算子计算得到的每个像素的值robertThreshold=0.2; %设定阈值for j=1:m-1 %进行边界提取 for k=1:n-1 robertsNum = abs(I(j,k)-I(j+1,k+1) + abs(I(j+1,k)-I(j,k+1); if(robertsNum > robertThreshold) M(j,k)=255; else M(j,k)=0; end endendsubplot(122),imshow(M);title('roberts'); 2. SobelI=imread('cameraman.tif');%读取原图像subplot(121),imshow(I);title('before');I=mat2gray(I);%实现图像矩阵的归一化操作m,n=size(I);M=I;%为保留图像的边缘一个像素sobelNum=0;%经sobel算子计算得到的每个像素的值sobelThreshold=0.8;%设定阈值for j=2:m-1 %进行边界提取 for k=2:n-1 sobelNum=abs(I(j-1,k+1)+2*I(j,k+1)+I(j+1,k+1)-I(j-1,k-1)-2*I(j,k-1)-I(j+1,k-1)+abs(I(j-1,k-1)+2*I(j-1,k)+I(j-1,k+1)-I(j+1,k-1)-2*I(j+1,k)-I(j+1,k+1); if(sobelNum > sobelThreshold) M(j,k)=255; else M(j,k)=0; end endendsubplot(122),imshow(M);title('Sobel');3. PrewwitI=imread('cameraman.tif');%读取原图像subplot(121),imshow(I);title('before');I=mat2gray(I);%实现图像矩阵的归一化操作m,n=size(I);M=I;%为保留图像的边缘一个像素PrewittNum=0;%经Prewitt算子计算得到的每个像素的值PrewittThreshold=0.5;%设定阈值for j=2:m-1 %进行边界提取 for k=2:n-1 PrewittNum=abs(I(j-1,k+1)-I(j+1,k+1)+I(j-1,k)-I(j+1,k)+I(j-1,k-1)-I(j+1,k-1)+abs(I(j-1,k+1)+I(j,k+1)+I(j+1,k+1)-I(j-1,k-1)-I(j,k-1)-I(j+1,k-1); if(PrewittNum > PrewittThreshold) M(j,k)=255; else M(j,k)=0; end endendsubplot(122),imshow(M);title('Prewitt');4. 二值clear all;close all;clc; img=imread('rice.png'); tt=graythresh(img);img=im2bw(img,tt);subplot(121); %图像二值化imshow(img);m,n=size(img); imgn=zeros(m,n); %边界标记图像ed=-1 -1;0 -1;1 -1;1 0;1 1;0 1;-1 1;-1 0; %从左上角像素判断for i=2:m-1 for j=2:n-1 if img(i,j)=1 %如果当前像素为1 for k=1:8 ii=i+ed(k,1); jj=j+ed(k,2); if img(ii,jj)=0 %当前像素周围如果是背景,边界标记图像相应像素标记 imgn(ii,jj)=1; end end end endend subplot(122)imshow(imgn,);5. 分水岭clc;f=rgb2gray(imread('pout.tif'); subplot(1,2,1); imshow(f); title('原始图像');f=double(f); hv=fspecial('prewitt'); %建立一个预定义的滤波算子hh=hv' %计算梯度图 gv=abs(imfilter(f,hv,'replicate'); gh=abs(imfilter(f,hh,'replicate'); g=sqrt(gv.2+gh.2); %计算距离L=watershed(g); wr=L=0;subplot(1,2,2);imshow(wr); title('分水岭'); 实验六 运动目标检测实验一、实验目的掌握背景差值法对运动目标的检测原理及其程序设计,并实现背景更新;了解图像图像差分法和基于光流的分割方法。二、实验原理背景差值法假设图像背景是静止不变的,用表示,定义图像序列为,其中为图像位置的坐标;为图像帧数。将每一帧图像的灰度值减去背景的灰度值可得到一个差值图像:通过设置阈值T可得到二值化差值图像:其中取值为1和0的像素点分别对应于前景(运动目标区)和背景(非运动目标区)。三、实验内容1.实现背景差值法对运动目标的检测;2.实现背景的更新。 四、分析思考如何去除背景噪声,当场景受光照等环境因素影响时,该如何处理背景。答:如果有光影影响时,可以尝试对图像进行形态学处理,或者对所用的阈值进行调整,再加入滤波器,可以使效果得到改善。五、源代码及效果图1. 将视频转化为图片clc;clear;video_file='666.avi'avi=VideoReader(video_file);video = read(avi); numFrames = get(avi, 'NumberOfFrames');for i=1:numFrames image_name=strcat(num2str(i); image_name=strcat(image_name,'.jpg'); I = read(avi,i);