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(重建图片的灰度值之和-洁净图片中的灰度值之和)为该图像的信噪比。