www.gusucode.com > 自己编写的一个基于matlab的图像压缩程序,有GUI界面,不能程度的压缩效果以及信噪比 > 自己编写的一个基于matlab的图像压缩程序,有GUI界面,不能程度的压缩效果以及信噪比/BP神经网络的图像压缩/bp.m
%本程序最小均方误差阈值设定为0.003,对图像进行压缩比设定为4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %第一步:训练样本构造,对训练样本进行预处理 I=imread('123.jpg'); I=rgb2gray(I); imshow(I) I=imresize(I,[128,128]);%将源图像减小到128*128个像素 P=[]%输入矩阵 for i=1:32 for j=1:32 I2=I((i-1)*4+1:i*4,(j-1)*4+1:j*4);%将源图分成1024块4*4像素块 i3=reshape(I2,16,1);%将每块分成16*1的列向量 II=double(i3); P_1=II/255;%将原始像素划到[0,1]范围内,归一化处理 P=[P,P_1];%将原始数据转换成16*1024矩阵 end end T=P;%神经网络输入输出采用同一矩阵 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %第二步:创建神经网路 net=newff(minmax(P),[4,16],{'tansig','logsig'},'trainlm'); %创建bp网络,采用trainlm算法{}内为传输函数 P270 net.trainParam.goal=0.003;%设定阈值,误差低于此最小均方误差,则停止训练 net.trainParam.epochs=100; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %训练神经网络 tic net=train(net,P,T);%train函数对神经网络进行训练 toc %tic,toc把程序围起来,计算训练用的时间 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %编码仿真结果 Y_chonggou=sim(net,P);%sim函数对神经网络仿真 %图像重构 Ychonggou_ceshi=[]; for k=1:1024 Ychonggou_ceshi1=reshape(Y_chonggou(:,k),4,4); Ychonggou_ceshi=[Ychonggou_ceshi,Ychonggou_ceshi1]; end YYchonggou_ceshi=[] for k=1:32 YYchonggou_ceshi1=Ychonggou_ceshi(:,(k-1)*128+1:k*128); YYchonggou_ceshi=[YYchonggou_ceshi;YYchonggou_ceshi1]; end YYchonggou_ceshi; Ychonggou_ce=uint8(YYchonggou_ceshi*255); %YYchonggou_ceshi是一个16*1024的矩阵,每个矩阵元素*255,将[0,1]像素值恢复到[0,255] %把每个列向量变成像素块,再把所有像素块组合成源图像,完成图像的重构 figure,imshow(I) title('原始图像'); imwrite(I,'压缩前图像.jpg') figure,imshow(Ychonggou_ce) title('压缩比为4'); imwrite(Ychonggou_ce,'压缩后图像.jpg') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %使得压缩比为2,即隐含层数目为8,只需将原命令换成: % net=newff(minmax(P),[8,16],{'tansig','logsig'},'trainlm'); %使得压缩比为8,即隐含层数目为2,只需将原命令换成: % net=newff(minmax(P),[2,16],{'tansig','logsig'},'trainlm'); %其他不变 %************************************************************************ %PSNR 峰值信噪比 Q = 255; [m,n]=size(I); MSE = sum(sum((I-Ychonggou_ce).^2))/(m*n); fprintf('The PSNR performance is %.2f dB\n', 10*log10(Q*Q/MSE)); %峰值信噪比PSNR=10*log10((2^n-1)^2/MSE) %n为8,2^n-1=255表示信号最大值的平方,n是每个采样值的比特数,PSNR值越大,就代表失真越少 %SNR 信噪比 A=sum(sum(I)); B=abs(sum(sum(Ychonggou_ce-I))); fprintf('The SNR performance is %.2f dB\n', A/B); %信噪比SNR=(洁净图片中的像素点的灰度值之和)/abs(重建图片的灰度值之和-洁净图片中的灰度值之和)为该图像的信噪比。