数字图像处理实验报告-基于Matlab_第1页
数字图像处理实验报告-基于Matlab_第2页
数字图像处理实验报告-基于Matlab_第3页
数字图像处理实验报告-基于Matlab_第4页
数字图像处理实验报告-基于Matlab_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、iginal,0 1,1 0); %反比above=imadjust(original,0 1,0 1,2); %gamma>1equal=imadjust(original,0 1,0 1,1); %gamma=1below=imadjust(original,0 1,0 1,0.5); %gamma<1subplot(3,3,1);imshow(original);title('原图像');subplot(3,3,2);imshow(linstr);title('线性拉伸');subplot(3,3,3);imshow(opposite);tit

3、le('反比');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(his

4、tequal);title('均衡后的图像');subplot(3,3,9);imhist(histequal);title('均衡图像的直方图');a*is(0 256 0 2000);【输出图像】【实验思考】根据以以下图片以及实验结果可知gamma>1时图像整体变暗,灰度级整体变小;gamma<1时图像整体变亮,灰度级整体变小;而gamma=1时,图像维持不变。实验2:图像的平滑滤波【实验目的】平滑的目的是减少噪声对图像的影响。掌握线性滤波和中值滤波两种最典型、最常用的图像平滑方法,对输出结果加以比较、加深理解。【实验容】1编写并调试窗口为3&#

5、215;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 fliterI = imread('lena.bmp'); %原始图像读取J = imnoise(I,'salt & pepper',0.02); %含噪图像加椒盐噪声subplot(2

6、,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; %

7、设置加权平均掩膜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中值滤波,调用中值滤波函数s

8、ubplot(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行或列的像素值复

9、制到边界,以填充边界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(*,y)的像素值

10、for *=(m-1)/2+1:M+(m-1)/2for y=(m-1)/2+1:N+(m-1)/2for s=-(m-1)/2:(m-1)/2for t=-(m-1)/2:(m-1)/2 g(*,y)=g(*,y)+f(*+s,y+t)*1/(m*m);endendendendIm(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)%Newb

11、uf 滤波后图像矩阵%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( : ,

12、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(*,y)的像素值for *=(m-1)/2+1:M+(m-1)/2for y=(m-1)/2+1:N+(m-1)/2for s=-(m-1)/2:(m-1)/2for t=-(m-1)/2:(m-1)/2 g(*,y)=g(*,y)+W(s+

13、(m+1)/2,t+(m+1)/2)*f(*+s,y+t);endendendendIm(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

14、+(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

15、(M+m-1,N+m-1);Im=zeros(M,N);for *=(m-1)/2+1:M+(m-1)/2for y=(m-1)/2+1:N+(m-1)/2 j=1;for s=-(m-1)/2:(m-1)/2for t=-(m-1)/2:(m-1)/2 a(j)=f(*+s,y+t);%将窗口里的二维元素变成一维元素 j=j+1;endend g(*,y)=SeekMid(a,m);endendIm(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 mid=SeekMid(w

16、inbuf,m)%mid 排序后的中值%winbuf 待排序窗口%m 窗口大小%采用冒泡排序方法将窗口像素值从小到大排列,返回中间像素值for i=1:m*m-1for k=1:m*m-iif winbuf(k)>winbuf(k+1) temp=winbuf(k); winbuf(k)=winbuf(k+1); winbuf(k+1)=temp;endendendmid=winbuf(m*m+1)/2);【输出图像】【实验思考】1. 比较均值滤波和中值滤波的优缺点均值滤波可以减小图像灰度级的“sharp变化,可以降低噪声,但是降噪的同时也使边缘局部变得模糊,还可以平滑伪轮廓,去除图像中

17、的不相关的小于掩模尺寸的细节。中值滤波器的主要功能是使具有不同灰度的点看起来更接近它的相邻点,去除那些相对于其邻域像素更亮或更暗、且区域小于n2/2的孤立像素集。中值滤波对降低*些类型的随机噪声性能优异,模糊程度低。在处理椒盐噪声时,均值滤波使图像变得模糊,并且噪声去除性能很差,而中值滤波的效果却很好。显然,中值滤波比均值滤波更适合去除椒盐噪声。2. 分析窗口尺寸对滤波结果的影响窗口尺寸越大,图像越模糊,图像边缘和与掩膜大小接近的细节受到的影响也越大实验3:图像的锐化处理【实验目的】锐化的目的是加强图像的边界和细节,熟悉Robert、Sobel和Laplace算子进展检测,使图像特征如边缘、轮

18、廓等进一步增强并突出。【实验容】1编写Robert算子滤波函数;2编写Sobel算子滤波函数;3编写Laplace算子滤波函数;4编写限幅和标定函数,给出增强后的图像。【实验代码】function E*3I=imread('rice.bmp');subplot(2,4,1);imshow(I);title('原始图像');rob=RobertFilter(I);subplot(2,4,2);imshow(rob);title('Robert算子滤波结果');R1=I+rob;la1=LimitAmplitude(R1);subplot(2,4,6

19、);imshow(la1);title('Robert算子增强结果');a2=-1 -2 -1;0 0 0;1 2 1;b2=-1 0 1;-2 0 2;-1 0 1; sob=SobelFilter(I,a2,b2);subplot(2,4,3);imshow(sob);title('Sobel算子滤波结果');R2=I+sob;la2=LimitAmplitude(R2);subplot(2,4,7);imshow(la2);title('Sobel算子增强结果');% s=0 1 0;1 -4 1;0 1 0;s=1 1 1;1 -8 1;

20、1 1 1;lap=LapFilter(I,s);cal=Calibration(lap);subplot(2,4,4);imshow(cal);title('Laplace算子滤波结果');lap=uint8(lap);lapr=I-lap;lapr3=LimitAmplitude(lapr);subplot(2,4,8);imshow(lapr3);title('Laplace算子增强结果');%Robert算子滤波function rob=RobertFilter(F)a1=-1 0;0 1;b1=0 -1;1 0;%Robert算子模板M,N=size(

21、F);f=zeros(M+1,N+1);f(1:M,1:N)=F(1:M,1:N);f(1:M,N+1:N+1)=F( : ,N:N);f(M+1:M+1,1:N)=F(M:M, : );%边界填充g=zeros(M+1,N+1);for *=1:Mfor y=1:N mod=f(*,y) f(*,y+1);f(*+1,y) f(*+1,y+1); gs*=a1.*mod; gsy=b1.*mod; g(*,y)=abs(sum(gs*(:)+abs(sum(gsy(:);endendIm=zeros(M,N);Im(1:M,1:N)=g(1:M,1:N);rob=uint8(Im);%Sob

22、el算子滤波function sob=SobelFilter(F,s*,sy)%s*,sy为Sobel算子模板M,N=size(F);m,n=size(s*);f=zeros(M+m-1,N+n-1);f(m-1)/2+1:M+(m-1)/2,(n-1)/2+1:N+(n-1)/2)=F(1:M,1:N);f(m-1)/2+1:M+(m-1)/2,1:(n-1)/2)=F( : ,1:(n-1)/2);f(m-1)/2+1:M+(m-1)/2,N+(n-1)/2:N+m-1)=F( : ,N-(n-1)/2:N);f(1:(m-1)/2,(n-1)/2+1:N+(n-1)/2)=F(1:(m-

23、1)/2, : );f(M+(m-1)/2:M+m-1,(n-1)/2+1:N+(n-1)/2)=F(M-(m-1)/2:M, : );%边界填充g=zeros(M+m-1,N+n-1);for *=(m-1)/2+1:M+(m-1)/2for y=(n-1)/2+1:N+(n-1)/2 mod=f(*-1,y-1) f(*-1,y) f(*-1,y+1); f(*,y-1) f(*,y) f(*,y+1);f(*+1,y-1) f(*+1,y) f(*+1,y+1); gs*=s*.*mod; gsy=sy.*mod; g(*,y)=abs(sum(gs*(:)+abs(sum(gsy(:)

24、;endendIm=zeros(M,N);Im(1:M,1:N)=g(m-1)/2+1:M+(m-1)/2,(n-1)/2+1:N+(n-1)/2);sob=uint8(Im);%Laplace算子滤波function lap=LapFilter(F,S)M,N=size(F);m,n=size(S);f=zeros(M+m-1,N+n-1);f(m-1)/2+1:M+(m-1)/2,(n-1)/2+1:N+(n-1)/2)=F(1:M,1:N);f(m-1)/2+1:M+(m-1)/2,1:(n-1)/2)=F( : ,1:(n-1)/2);f(m-1)/2+1:M+(m-1)/2,N+(n

25、-1)/2:N+m-1)=F( : ,N-(n-1)/2:N);f(1:(m-1)/2,(n-1)/2+1:N+(n-1)/2)=F(1:(m-1)/2, : );f(M+(m-1)/2:M+m-1,(n-1)/2+1:N+(n-1)/2)=F(M-(m-1)/2:M, : );g=zeros(M+m-1,N+n-1);for *=(m-1)/2+1:M+(m-1)/2for y=(n-1)/2+1:N+(n-1)/2 mod=f(*-1,y-1) f(*-1,y) f(*-1,y+1); f(*,y-1) f(*,y) f(*,y+1);f(*+1,y-1) f(*+1,y) f(*+1,y

26、+1); gs=S.*mod; g(*,y)=sum(gs(:);endendIm=zeros(M,N);Im(1:M,1:N)=g(m-1)/2+1:M+(m-1)/2,(n-1)/2+1:N+(n-1)/2);lap=Im;%限幅函数function la=LimitAmplitude(F)f=uint8(F);M,N=size(f);for *=1:Mfor y=1:Nif f(*,y)>=255; f(*,y)=255;elseif f(*,y)<=0 f(*,y)=0;else f(*,y)=f(*,y);%将灰度值限定在0到255之间endendendendla=f;%

27、标定函数function cal=Calibration(F)F=double(F);M,N=size(F);m1=min(min(F);for *=1:Mfor y=1:N fm(*,y)=F(*,y)-m1;endendm2=ma*(ma*(fm);Fm=double(fm);for *=1:Mfor y=1:N fs(*,y)=255*(Fm(*,y)/m2);endendcal=uint8(fs);【输出图像】实验4:图像的统计特性【实验目的】观察序列图像帧、帧间差值信号的分布曲线,理解图像在空间域和频率域上的统计特性及其在压缩中的重要性。【实验容】1编写帧统计函数,计算差值图像同一行

28、差值、同一列差值,观察统计分布曲线;2编写帧间统计函数,计算差值图像相邻帧的差值,观察统计分布曲线cla0/1或girl0/1。附:可供参考的Matlab函数有sum、cat、plot【实验代码】function E*4oldbuf=imread('rice.bmp');I1=imread('CLA1.bmp');I2=imread('CLA2.bmp');newbuf1=Intrah(oldbuf,1);%帧水平差值统计特性newbuf2=Intrah(oldbuf,0);%帧垂直差值统计特性newbuf3=Inter(I1,I2);帧间统计特

29、性subplot(2,3,1);imshow(oldbuf);title('原始图像');subplot(2,3,2);draw(newbuf1);title('水平差值统计特性');subplot(2,3,3);draw(newbuf2);title('垂直差值统计特性');subplot(2,3,4);imshow(I1);title('CLA1');subplot(2,3,5);imshow(I2);title('CLA2');subplot(2,3,6);draw(newbuf3);title('帧

30、间统计特性');function newbuf=Intrah(oldbuf,pop2) %帧统计函数oldbuf=double(oldbuf);M,N=size(oldbuf); %防止溢出将数据类型从uint8型转换为double型newbuf=zeros(1,511);ifpop2=1for i=1:Mfor j=1:N-1 dH=oldbuf(i,j)-oldbuf(i,j+1);%帧水平灰度差值 newbuf(dH+256)=newbuf(dH+256)+1;endendelsefor i=1:M-1for j=1:N dV=oldbuf(i,j)-oldbuf(i+1,j);

31、 newbuf(dV+256)=newbuf(dV+256)+1;endendendfunction newbuf=Inter(oldbuf,oldbuf1) %帧间统计函数oldbuf=double(oldbuf);oldbuf1=double(oldbuf1);M,N=size(oldbuf); newbuf=zeros(1,511);for i=1:Mfor j=1:N dt=oldbuf(i,j)-oldbuf1(i,j);%计算帧间差值 newbuf(dt+256)=newbuf(dt+256)+1;endendfunction draw(D)D=D/sum(D);*=-255:25

32、5;plot(*,D);a*is(-100 100 0 0.5);%为了显示效果好缩小坐标轴围【输出图像】实验6:方块编码【实验目的】掌握方块编码的根本方法及压缩性能。【实验容】1编程实现子块为n×n的方块编码算法;2分别取n4和8的方块尺寸进展实验,计算重建图像的PSNR和压缩比。【实验代码】1.主程序I=imread('lena.bmp');M,N=size(I);subplot(1,3,1);imshow(I);title('原图像');%显示原图像I=double(I);newbuf1=BtcCode(I,4);PSNR1,Cr1=Analyz

33、e(I,newbuf1,M,N,4);subplot(1,3,2);imshow(uint8(newbuf1);title('4*4BTC重建图像,PSNR=',num2str(PSNR1),'压缩比=',num2str(Cr1);newbuf2=BtcCode(I,8);PSNR2,Cr2=Analyze(I,newbuf2,M,N,8);subplot(1,3,3);imshow(uint8(newbuf2);title('8*8BTC重建图像,PSNR=',num2str(PSNR2),'压缩比=',num2str(Cr2)

34、;function outbuf=BtcBlock(inbuf,n)%btc 方块编码算法函数%inbuf 子块数组%n 方块尺寸%对每个子块的图像数据分别计算*t、a0、a1值,再用分辨率分量%(a0,a1)替代方块原来的数据,最后放入方块图像数组中并返回该数组inbuf=double(inbuf);temp=0;%总的像素值temp0=0;%小于阀值的总像素temp1=0;%大于阀值的总像素q=0;%大于阀值的像素的个数m=n*n;for i=1:nfor j=1:n temp=temp+inbuf(i,j);endend*t=temp/m;%平均像素值即阀值for i=1:nfor j=

35、1:n if inbuf(i,j)<*t temp0=temp0+inbuf(i,j);%得出小于阀值的总像素else temp1=temp1+inbuf(i,j);%得出大于阀值的总像素 q=q+1;%大于阀值的像素个数endendendif q=m a0=uint8(temp0/(m-q);%得出小于阀值的像素值endif q=0 a1=uint8(temp1/q); %得出大于阀值的像素值endfor i=1:nfor j=1:nif inbuf(i,j)<*t outbuf(i,j)=a0;else outbuf(i,j)=a1;endendendfunction newb

36、uf=BtcCode(oldbuf,n)%调用方块编码算法函数,输出编码后的图像M,N=size(oldbuf);row_num=M/n;%子块行数col_num=N/n;%子块列数row_start=(0:row_num)*n+1;%子块起始行row_end=(1:row_num)*n;%子块终止行col_start=(0:col_num-1)*n+1;%子块起始列col_end=(1:row_num)*n;%子块终止列for i=1:row_numfor j=1:col_num f=oldbuf(row_start(i):row_end(i),col_start(j):col_end(j)

37、;%此式太长为方便书写定义f oldbuf(row_start(i):row_end(i),col_start(j):col_end(j)=BtcBlock(f,n);%将原图像分成一个个子块,在原图像里一个个对这些子块进展编码,编码后的结果保存原图像里endendnewbuf=oldbuf;%编码后的图像4. Analyze.mfunction PSNR,Cr=Analyze(I1,I2,M,N,n)%计算重建图像的PSNR和压缩比m=n*n;mse=sum(sum(I1-I2).2)/(M*N);PSNR=10*log10(2552)/mse);Cr=8/(1+2*8/m);end【输出图

38、像】实验7:JPEG压缩编码【实验目的】掌握n×n块的DCT图像变换及频谱特点。熟悉JPEG根本系统的图像编解码方法。【实验容】 1编程实现n×n块DCT变换的图像频谱显示,块DCT系数按照Zig-Zag扫描并取局部进展图像重建,计算图像的均方根误差RMSE,显示误差图像和误差直方图。 2对8×8块的DCT系数,采用JPEG默认的量化矩阵进展量化和反量化,计算原图像与重建图像之间的均方根误差RMSE、并显示误差图像。【实验代码】1.主程序F=imread('lena.bmp');subplot(231);imshow(F);title('&

39、#212;­Í¼Ïñ');%显示原图像F=double(F);F=F-128;%将原图像减小一半便于处理%计算原图像的8×8块的DCT系数,并转换为可视频谱图以便观察dctfre=DctBlock(F,8);subplot(232);imshow(log(abs(dctfre)*5+1),);title('8*8DCT频谱显示');%表示将原图像的最大最小值之间的围整体映射到0255之间,即做限幅DCTch=10;n=8;I,e,rmse1=ZigIDCT(F,dctfre,DCTch,n);subplot(2

40、33);imshow(uint8(I);title('取',num2str(DCTch),'个DCT系数时的重建图像');subplot(234);imhist(uint8(abs(e);title('差值直方图,RMSE=',num2str(rmse1);scale=4;newbuf,err,rmse2=QuanIQuan(F,dctfre,n,scale);subplot(235);imshow(uint8(newbuf);title('scale为',num2str(scale),'时的重建图像');subp

41、lot(236);imshow(uint8(abs(err),);title('量化误差图像,RMSE=',num2str(rmse2);2. ZigIDCT.mfunction I,e,rmse1=ZigIDCT(oldbuf,dctfre,DCTch,n)%oldbuf:原始图像数据%dctfre:DCT系数矩阵%DCTch:每个分块中需要保存的DCT系数个数%n:分块的大小%e:原图像与保存局部DCT系数后的重建图像之间的误差矩阵% 按Zig-Zag扫描顺序,根据DCTch参数,只保存64个% DCT系数中的前DCTch个系数,对修改后的DCT系数用逆DCT变换重建图像,

42、得到DCT变% 换的压缩图像。计算重建图像的均方根误差RMSE ;显示误差图像和误差直方图。zigzag = 1 2 6 7 15 16 28 29 3 5 8 14 17 27 30 43 4 9 13 18 26 31 42 44 10 12 19 25 32 41 45 54 11 20 24 33 40 46 53 55 21 23 34 39 47 52 56 61 22 35 38 48 51 57 60 62 36 37 49 50 58 59 63 64;%设置z扫描顺序mask=zigzag<=DCTch; %根据当前DCTch值得到“Z字扫描的逻辑值,mask为log

43、ic类型%对修改后的DCT系数用逆DCT变换重建图像,得到DCT变换的压缩图像D=dctmt*(n);I=blkproc(dctfre,n n,'P1*(*.*P2)*P3',D',maskbuf,D);%I为重建的压缩图像矩阵e=oldbuf-I;%e:原图像与保存局部DCT系数后的重建图像之间的误差矩阵I=I+128;rmse1=RMSE(e);endfunction dctfre = DctBlock(oldbuf,n)%分块DCT函数:根据给定的n值,计算原图像的n×n块的DCT系数,并转换为可视频谱图以便观察 % oldbuf 原始图像数据 % n

44、分块的大小 % dctfre DCT系数矩阵D=dctmt*(n);%D是返回N×N的DCT变换矩阵,矩阵A的DCT变换可用D×A×D来计算dctfre=blkproc(oldbuf,n,n,'P1*P2',D,D'); %D'为D的转置end4. QuanIQuan.mfunction newbuf,e,rmse2=QuanIQuan(oldbuf,dctfre,n,scale)%量化和反量化函数:根据给定的默认JPEG量化表,%对每个n×n块的DCT系数进展量化和反量化,显示量化误差图像及其直方图。%oldbuf:原始

45、图像数据%dctfre:DCT系数矩阵%n:分块的大小%scale;量化系数z= 16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99;%默认JPEG量化表 Qvalue=blkproc(dctfre,n n,'round(*./P1)&#

46、39;,scale*z);%量化 IQvalue=blkproc(Qvalue,n n,'*.*P1',scale*z);%反量化%对经过量化和反量化后的矩阵进展逆DCT变换得到重建图像矩阵 D=dctmt*(n); newbuf=blkproc(IQvalue,n n,'P1*P2',D',D); e=newbuf-oldbuf;%e为量化误差矩阵 rmse2=RMSE(e);%求均方根误差 newbuf=newbuf+128;end5. RMSE.mfunction rmse=RMSE(oldbuf)%求均方根误差M,N=size(oldbuf);

47、e=oldbuf.2; rmse=sqrt(sum(e(:)/(M*N);end【输出图像】实验8:运动估计【实验目的】熟悉运动估计的块匹配BMA算法原理,编程实现全搜索算法三步搜索或钻石搜索算法,了解运动估计在混合编码器中的作用。【实验容】1编写全搜索算法函数,将运动矢量叠加到当前帧上并显示输出;2显示输出预测帧、残差帧和重建图像,计算预测帧的PSNR。附:可供参考的Matlab函数有hold、quiver【实验代码】1.主程序imgI=imread('CLA1.bmp');%定义参考帧imgP=imread('CLA2.bmp');%定义当前帧subplot

48、(231);imshow(imgI);title('参考帧');subplot(232);imshow(imgP);title('当前帧');imgI=double(imgI);imgP=double(imgP);mbSize=16;% 块尺寸为16*16p=7;%搜索窗口为(2p+1)*(2p+1)motionVect,ESputations,blk_center,costs=ME_ES(imgP,imgI,mbSize,p);%基于块的全搜索算法imgMV(motionVect,imgP,blk_center);%画运动矢量图imgp=motionp(img

49、I,motionVect,mbSize);%根据运动矢量计算预测帧,并传输残差帧psnr=imgPSNR(imgP,imgp);%计算峰值信噪比subplot(234);imshow(uint8(imgp);title('预测帧,PSNR=',num2str(psnr);imgErr=imgP-imgp;%残差帧cal=Calibration(imgErr);%标定,显示更好效果subplot(235);imshow(cal);title('残差帧');ChongJian=imgp+imgErr;%根据运动矢量指明的位置及残差帧重建图像subplot(236);

50、imshow(uint8(ChongJian);title('重建帧');2.ME_ES.mfunction motionVect,ESputations,blk_center,costs = ME_ES(imgP, imgI, mbSize, p)%function:FS算法:全搜索Full Search/E*haustive Search%img:当前帧%imgI:参考帧%mbSize:MB尺寸%p:搜索窗口大小2p+1×2p+1%motionVect:整像素精度MV%ESputations:搜索每个宏块所需的平均点数row,col=size(imgP);blk_

51、center=zeros(2,row*col/(mbSize2);%定义每个宏块中心点位置motionVect=zeros(2,row*col/(mbSize2);%定义每个宏块运动矢量costs=ones(2*p+1,2*p+1)*65537;putations=0;%搜索的点数之和mbCount=1;for i = 1:mbSize:row-mbSize+1 %当前帧起始行搜索围,步长是块数for j = 1:mbSize:col-mbSize+1 %当前帧起始列搜索围,步长是块数for m=-p:pfor n=-p:p ref_blk_row=i+m;%参考帧搜索框起始行 ref_blk

52、_col=j+n;%参考帧搜索框起始列%如果参考块的行列围的任意一点在已经搜索过的宏块之外,则跳过,搜索下一点if (ref_blk_row<1|ref_blk_row+mbSize-1>row|ref_blk_col<1|ref_blk_col+mbSize-1>col) continue; end%否则计算该点SAD值 costs(m+p+1,n+p+1)=costSAD(imgP(i:i+mbSize-1,j:j+mbSize-1),imgI(ref_blk_row:ref_blk_row+mbSize-1,ref_blk_col:ref_blk_col+mbSize-1); putations=putations+1;endend blk_center(1,mbCount) = i+ mbSize/2-1;%记录中心点行坐标 blk_center(2,mbCount) = j+ mbSize/2-1;%记录中心点列坐标 minc,d*,dy=minCost(c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论