数字图像处理实验报告-基于

  • 格式:doc
  • 大小:97.00 KB
  • 文档页数:19

华东师范大学 电子工程系 实验1:图像灰度级修正 【实验目的】 掌握常用的图像灰度级修正方法(灰度变换法和直方图均衡化),加深对直方图的理解。观察图像的增强效果,对灰度级修正前后的图像加以比较。 【实验内容】 1)编程实现图像的灰度变换,改变图像的输入、输出映射参数范围(线性拉伸和反比); 2)修改参数gamma值(大于、小于、等于1),观察处理结果; 3)对图像直方图作均衡化处理,显示均衡前后的图像及其直方图。 【实验代码】 original=imread(''); linstr=imadjust(original,[ ],[0 1]); %线性拉伸 opposite=imadjust(original,[0 1],[1 0]); %反比 above=imadjust(original,[0 1],[0 1],2); %gamma>1 equal=imadjust(original,[0 1],[0 1],1); %gamma=1 below=imadjust(original,[0 1],[0 1],; %gamma<1

subplot(3,3,1);imshow(original);title('原图像'); subplot(3,3,2);imshow(linstr);title('线性拉伸'); subplot(3,3,3);imshow(opposite);title('反比'); subplot(3,3,4);imshow(above);title('gamma>1'); subplot(3,3,5);imshow(equal);title('gamma=1'); subplot(3,3,6);imshow(below);title('gamma<1'); subplot(3,3,7);imhist(original);title('原图像直方图'); histequal=histeq(original);%对图像均衡化 subplot(3,3,8);imshow(histequal);title('均衡后的图像'); subplot(3,3,9);imhist(histequal);title('均衡图像的直方图'); axis([0 256 0 2000]); 【输出图像】

【实验思考】 根据以下图片以及实验结果可知gamma>1时图像整体变暗,灰度级整体变小;gamma<1时图像整体变亮,灰度级整体变小;而gamma=1时,图像维持不变。

实验2:图像的平滑滤波 【实验目的】 平滑的目的是减少噪声对图像的影响。掌握线性滤波和中值滤波两种最典型、最常用的图像平滑方法,对输出结果加以比较、加深理解。 【实验内容】 1)编写并调试窗口为3×3、5×5的平滑滤波函数;如[1 1 1;1 1 1 ;1 1 1]/9、[1 2 1;2 4 2;1 2 1]/16等) 2)编写并调试窗口为3×3、5×5的中值滤波函数。 3)比较均值滤波和中值滤波的优缺点,分析窗口尺寸对滤波结果的影响。 附:可供参考的Matlab函数有imnoise、imfilter、medfilt2 【实验代码】 function fliter I = imread(''); %原始图像读取 J = imnoise(I,'salt & pepper',; %含噪图像 加椒盐噪声 subplot(2,3,1);imshow(J);title('含噪图像');

Newbuf1=AverageFilter(J,256,256,3); %3×3标准平均,调用均值滤波函数 subplot(2,3,2);imshow(Newbuf1);title('3×3标准平均');

Newbuf2=AverageFilter(J,256,256,5); %5×5标准平均,调用均值滤波函数 subplot(2,3,3);imshow(Newbuf2);title('5×5标准平均');

W=[1 2 1;2 4 2;1 2 1]/16; %设置加权平均掩膜 Newbuf3=WeighFilter(J,W,256,256,3); %3×3加权平均,调用加权平均函数 subplot(2,3,4);imshow(Newbuf3);title('3×3加权平均');

Newbuf4=MedianFilter(J,256,256,3); %3×3中值滤波,调用中值滤波函数 subplot(2,3,5);imshow(Newbuf4);title('3×3中值滤波');

Newbuf5=MedianFilter(J,256,256,5); %5×5中值滤波,调用中值滤波函数 subplot(2,3,6);imshow(Newbuf5);title('5×5中值滤波');

%标准平均滤波函数 function Newbuf=AverageFilter(Oldbuf,M,N,m) %Newbuf 滤波后图像矩阵 %Oldbuf 含噪图像矩阵 %M、N 含噪图像像素矩阵行、列 %m 均值滤波窗口大小 f=zeros(M+m-1,N+m-1); %将原图像像素复制到f矩阵上,空出(m-1)/2大小的边界 f((m-1)/2+1:M+(m-1)/2,(m-1)/2+1:N+(m-1)/2)=Oldbuf(1:M,1:N); %将与边界相邻的(m-1)/2行(或列)的像素值复制到边界,以填充边界 f((m-1)/2+1:M+(m-1)/2,1:(m-1)/2)=Oldbuf( : ,1:(m-1)/2); f((m-1)/2+1:M+(m-1)/2,N+(m-1)/2:N+m-1)=Oldbuf( : ,N-(m-1)/2:N); f(1:(m-1)/2,(m-1)/2+1:N+(m-1)/2)=Oldbuf(1:(m-1)/2, : ); f(M+(m-1)/2:M+m-1,(m-1)/2+1:N+(m-1)/2)=Oldbuf(M-(m-1)/2:M, : ); g=zeros(M+m-1,N+m-1); Im=zeros(M,N); %根据公式计算出处理后g(x,y)的像素值 for x=(m-1)/2+1:M+(m-1)/2 for y=(m-1)/2+1:N+(m-1)/2 for s=-(m-1)/2:(m-1)/2 for t=-(m-1)/2:(m-1)/2 g(x,y)=g(x,y)+f(x+s,y+t)*1/(m*m); end end end end Im(1:M,1:N)=g((m-1)/2+1:M+(m-1)/2,(m-1)/2+1:N+(m-1)/2); %将double型转换为uint8型才可以用imshow正常显示 Newbuf=uint8(Im);

%加权平均滤波函数 function Newbuf=WeighFilter(Oldbuf,W,M,N,m) %Newbuf 滤波后图像矩阵 %Oldbuf 含噪图像矩阵 %W 掩模 %M、N 含噪图像像素矩阵行、列 %m 掩模模板窗口大小 f=zeros(M+m-1,N+m-1); %将原图像像素复制到f矩阵上,空出(m-1)/2大小的边界 f((m-1)/2+1:M+(m-1)/2,(m-1)/2+1:N+(m-1)/2)=Oldbuf(1:M,1:N); %将与边界相邻的(m-1)/2行(或列)的像素值复制到边界,以填充边界f((m-1)/2+1:M+(m-1)/2,1:(m-1)/2)=Oldbuf( : ,1:(m-1)/2); f((m-1)/2+1:M+(m-1)/2,N+(m-1)/2:N+m-1)=Oldbuf( : ,N-(m-1)/2:N); f(1:(m-1)/2,(m-1)/2+1:N+(m-1)/2)=Oldbuf(1:(m-1)/2, : ); f(M+(m-1)/2:M+m-1,(m-1)/2+1:N+(m-1)/2)=Oldbuf(M-(m-1)/2:M, : ); g=zeros(M+m-1,N+m-1); Im=zeros(M,N); %根据公式计算出处理后g(x,y)的像素值 for x=(m-1)/2+1:M+(m-1)/2 for y=(m-1)/2+1:N+(m-1)/2 for s=-(m-1)/2:(m-1)/2 for t=-(m-1)/2:(m-1)/2 g(x,y)=g(x,y)+W(s+(m+1)/2,t+(m+1)/2)*f(x+s,y+t); end end end end Im(1:M,1:N)=g((m-1)/2+1:M+(m-1)/2,(m-1)/2+1:N+(m-1)/2); Newbuf=uint8(Im);

%中值滤波函数 function Newbuf=MedianFilter(Oldbuf,M,N,m) %Newbuf 滤波后图像矩阵 %Oldbuf 含噪图像矩阵 %M、N 含噪图像矩阵像素行、列 %m 中值滤波窗口大小 f=zeros(M+m-1,N+m-1); %将原图像像素复制到f矩阵上,空出(m-1)/2大小的边界 f((m-1)/2+1:M+(m-1)/2,(m-1)/2+1:N+(m-1)/2)=Oldbuf(1:M,1:N); %将与边界相邻的(m-1)/2行(或列)的像素值复制到边界,以填充边界 f((m-1)/2+1:M+(m-1)/2,1:(m-1)/2)=Oldbuf( : ,1:(m-1)/2); f((m-1)/2+1:M+(m-1)/2,N+(m-1)/2:N+m-1)=Oldbuf( : ,N-(m-1)/2:N); f(1:(m-1)/2,(m-1)/2+1:N+(m-1)/2)=Oldbuf(1:(m-1)/2, : ); f(M+(m-1)/2:M+m-1,(m-1)/2+1:N+(m-1)/2)=Oldbuf(M-(m-1)/2:M, : ); g=zeros(M+m-1,N+m-1); Im=zeros(M,N); for x=(m-1)/2+1:M+(m-1)/2 for y=(m-1)/2+1:N+(m-1)/2 j=1; for s=-(m-1)/2:(m-1)/2 for t=-(m-1)/2:(m-1)/2 a(j)=f(x+s,y+t); %将窗口里的二维元素变成一维元素 j=j+1; end end g(x,y)=SeekMid(a,m); end end Im(1:M,1:N)=g((m-1)/2+1:M+(m-1)/2,(m-1)/2+1:N+(m-1)/2); Newbuf=uint8(Im);