您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 造纸印刷 > 数字图像处理与模式识别作业
数字图像处理与模式识别作业姓名:学号:专业:控制科学与工程学院:自动化学院作业一用C语言或者VC,VB,Matlab或其他语言完成如下实验:1)打开一个BMP文件2)将其局部区域的灰度值进行改变3)另存为一个新的BMP文件要求显示出原BMP图像和新BMP图像。总结:读入一幅图像,首先如果是rgb图像,要转化为灰度图像。灰度图像有256个灰度等级。改变对应的数值,可以改变局部区域的灰度值。以下程序中实现了将一矩形区域全部变为白色。Matlab源程序:clearall;f=imread('image1.bmp');f1=rgb2gray(f);%转换为灰度图figure(1);imshow(f1);imwrite(f1,'image1_gray.bmp');f1(100:150,100:120)=256;%局部改变灰度值figure(2);imshow(f1);imwrite(f1,'image1_gray_1.bmp');size(f1)whosf1原始灰度图像:局部改变灰度值的图像:作业二1.编程实现图像傅立叶高通、低通滤波。2.尝试傅立叶压缩。1.低通滤波MATLAB源程序:clearall;I=imread('image1_gray.bmp');figure(1);imshow(I);I=double(I);f=fft2(I);g=fftshift(f);[M,N]=size(g);n1=floor(M/2);n2=floor(N/2);d0=30;fori=1:Mforj=1:Nd=sqrt((i-n1)^2+(j-n2)^2);ifd=d0h1=1;elseh1=0;endg1(i,j)=(h1+0)*g(i,j);endendg2=ifftshift(g1);g3=uint8(real(ifft2(g2)));figure(2);imshow(g3);title('低通滤波结果')经低通滤波以后的图像:低通滤波结果2.高通滤波源程序:clearall;I=imread('image1_gray.bmp');figure(1);imshow(I);I=double(I);f=fft2(I);g=fftshift(f);[M,N]=size(g);n1=floor(M/2);n2=floor(N/2);d0=5;fori=1:Mforj=1:Nd=sqrt((i-n1)^2+(j-n2)^2);ifd=d0h1=1;elseh1=0;endg1(i,j)=(h1+0.5)*g(i,j);endendg2=ifftshift(g1);g3=uint8(real(ifft2(g2)));figure(2);imshow(g3);title('高通滤波结果')高通滤波结果:高通滤波结果总结:图像低通滤波使图像变的模糊,平滑。高通滤波能突出图像的边缘,是图像清晰。作业三1.打开一幅图像,添加椒盐、高斯噪声,然后使用邻域平均法、中值滤波法、K邻近平均法进行平滑。1)首先加入椒盐噪声,然后对其处理。源程序:clearall;f=imread('image1.bmp');I=rgb2gray(f);%转为灰度图像figure(1);imshow(I);title('原始图像')imwrite(I,'image1_gray.bmp');P2=imnoise(I,'salt&pepper',0.02)%加入椒盐躁声figure(2);imshow(P2);title('加入椒盐躁声')h1=medfilt2(P2);%对椒盐躁声中值滤波figure(3);imshow(h1);title('对椒盐躁声中值滤波后')%邻域平均法w1=fspecial('average');%产生一个3x3大小的方形平均滤波模板w1h2=imfilter(P2,w1,'replicate');%g1为处理后的图像。'replicate'指卷积填充边缘时用复制边界的值来扩展。figure(4);imshow(h2);title('邻域平均法平滑')加入椒盐噪声后的图像:加入椒盐躁声对椒盐噪声中值滤波后的图像:对椒盐躁声中值滤波后对椒盐噪声采用邻域法平滑后的图像:邻域平均法平滑对椒盐噪声采用K邻域法平滑后的图像:K邻域平均法平滑2)加入高斯噪声后对图像滤波处理源程序:P2=imnoise(I,'gaussian',0.02)%加入高斯躁声其他与加入椒盐噪声的处理程序相同。加入高斯噪声后的图像:加入高斯躁声对高斯噪声中值滤波平滑后的图像:对高斯躁声中值滤波后对高斯噪声邻域均平均法平滑后的图像:邻域平均法平滑对高斯噪声K邻近均平均法平滑后的图像:K邻域平均法平滑实验结果分析:对于椒盐噪声,采用中值滤波的方法对图像平滑效果较好,对于高斯噪声,采用邻域平均法对图像平滑的效果较好。2.打开一幅图像,利用Roberts梯度法、Sobel算子和拉普拉斯算子进行锐化,并比较结果。源程序:clearall;%Roberts梯度法[I,map]=imread('image1_gray.bmp');imshow(I,map);title('原始图像')I=double(I);[Gx,Gy]=gradient(I);%计算梯度G=sqrt(Gx.*Gx+Gy.*Gy);%注意是矩阵点乘J1=G;figure(2),imshow(J1,map);title('Roberts梯度法进行锐化')%拉普拉斯算子进行锐化I=double(I);h=[0-10;-14-1;0-10];J=conv2(I,h,'same');K=J;figure(3),imshow(K,[]);title('拉普拉斯算子进行锐化')%Sobel算子锐化I=double(I);h1=[-101;-202;-101];J1=conv2(I,h1,'same');K1=J1;figure(4),imshow(K1);title('Sobel算子锐化')利用Roberts梯度法锐化后的图像:Roberts梯度法进行锐化利用Sobel算子锐化后的图像:Sobel算子锐化利用拉普拉斯算子锐化后的图像:拉普拉斯算子进行锐化作业四编写一个程序,对输入的图像进行哈夫曼编码,显示原图像的熵、编码后的平均码字长度、并能够根据编码重建出图像。Matlab源程序:clearall;clc;I=imread('image1_gray_1.bmp');x=isrgb(I);ifx==1I=rgb2gray(I);elseendi=double(I);[m,n]=size(I);len=m*n;forp=1:256;j=find(i==p-1);u(p)=length(j);endstem(u);r=find(u0);k=length(r);F(1,:)=r-1;v=u(r);A=v/sum(v);F(2,:)=A;B=F';B=sortrows(B,2);B=B';B=fliplr(B);A=B(2,:);[avlen,END,H,P,L]=huffenco(A);B=sym(B);B(3,:)=END;q=double(1/(sum(L.*(sum(v)*B(2,:)))/len/8));function[avlen,END,H,P,L]=huffenco(A)A=fliplr(sort(A));%按降序排列T=A;[m,n]=size(A);B=zeros(n,n-1);%空的编码表(矩阵)fori=1:nB(i,1)=T(i);%生成编码表的第一列endr=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=fliplr(sort(T));t=n-1;forj=2:n-1%生成编码表的其他各列fori=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在%该列的位置r=(B(t-1,j)+B(t,j));%最后两个元素相加T(t-1)=r;T(t)=0;T=fliplr(sort(T));t=t-1;endB;%输出编码表END=sym('[0,1]');%给最后一列的元素编码t=2;forj=n-2:-1:1%从倒数第二列开始依次对各列元素编码y=B(n,j+1);ify~=n-jtemp=END(y);fori=y:(n-j)-1END(i)=END(i+1);endEND(i+1)=temp;endtemp1=END(t);END(t)=[char(temp1),'0'];END(t+1)=[char(temp1),'1'];t=t+1;endENDfori=1:n[a,b]=size(char(END(i)));L(i)=b;endLavlen=sum(L.*A)%平均码长H1=log2(A);H=-A*(H1')%熵P=H/avlen%编码效率程序运行结果:平均码字长度:avlen=6.1022熵:H=7.3328编码效率:P=1.2017灰度直方图统计:050100150200250300010002000300040005000600070008000总结:为了达到大的压缩率,提出了一种方法就是将在图像中出现频度大的像素值,给一个比较短的编码,将出现频度小的像数值,给一个比较长的编码。先将输入灰度级按出现的概率由大到小顺序排列(如果概率相同的灰度级可以任意颠倒排列的位置)。将最小的两个概率相加形成一个新的概率集合在按步方法重排.(此时概率集中,概率的个数已减少一个)。如此重复进行直到只有两个概率为止。分配码字.码字分配从最后一步开始反向进行.对最后两个概率一个赋予“0”码,一个赋予“1”码.如此反向进行到开始的概率排列.在此过程中,若概率不变仍用原码字。若概率分裂为两个,其码字前几位码元仍用原来的.码字的最后一位码元赋予“0”码元,另一个赋予“1”码元。作业五在图像中生成一个矩形,然后用模板匹配法找出矩形位置。使用SSDA或改进的SSDA法。Matlab源程序:%模板匹配法算法函数%生成一个矩形,并用ssda算法找出矩形所在的位置,程序输出的是匹配处的第一个点的坐标。img=zeros(30);img(8:13,3:6)=1;mask=[1111;1111;1111;1111;1111;1111];[maskH,maskW]=size(mask);[imgH,imgW]=size(img);energyMask=0;forn=1:maskHform=1:maskWenergyMask=energyMask+mask(n,m)*mask(n,m);endendif(energyMask==0)energyMask=1;endenergyMask=sqrt(energyMask);R=zeros(imgH,imgW);fory=1:(imgH-maskH)forx=1:(imgW-maskW)%whetherposition(y,x)isOK?relateVal=0;energySubImage=0;forn=1:maskHform=1:maskW%S-y+n-1relateVal=relateVal+img(y+n-1,x+m-1)*mask(n,m);energySubImage=energySubImage+img(y+n-1,x+m-1)*img(y+n-1,x+m-1);endendenergySubImage=sqrt(energySubImage);if(energySubImage==0)energySubImage=1;endR(y,x)=relateVal/(energySubImage*energyMask);aaa=R(y,x);if(R(y,x)=1)%y,x为匹配点的起始坐标;yxendendend程序运行结果:y=8;x=3总结:通过相关函数的计算来找到它及被搜索的图的坐标位置。由于模板要在个参数位置上作相关计算,其中除一点以外都是在非匹配点上作“无用”
本文标题:数字图像处理与模式识别作业
链接地址:https://www.777doc.com/doc-4253592 .html