基于BP神经网络的图像压缩解压缩算法

目录

1.基于BP神经网络的图像压缩解压缩算法

2.MATAB核心程序

3.仿真结果


1.基于BP神经网络的图像压缩解压缩算法

       BP神经网络是一种多层前馈神经网络及误差逆传播学习算法,它的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。在正向传播过程中,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出不符,则转入误差的反向传播阶段。在反向传播阶段,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。

       BP神经网络,即误差反馈神经网络算法。从结构上讲,BP神经网络是由一个信息的正向传播网络和一个误差的反向传播网络两个模块构成。BP神经网络的基本结构如下图所示:

       从图的结构可知,BP神经网络主要由三个层次组成,包括BP神经网络的输入层,BP神经网络的隐含层以及BP神经网络的输出层。来自外部的各种信息通过BP神经网络的输入层传输进入到其隐含层进行网络运算处理,并通过输出层输出得到最终的处理结果。当BP神经网络的输出层输出结果和其预先设置的输入值的误差较大的时候,则进入BP神经网络的反向传播阶段,并进行网络权值的更新,直到输出结果和期望结果误差满足一定条件为止。

        其中,信号的前向传播过程的主要步骤如下:

第一、神经网络隐含层的第i个节点的输入变量neti:

                                                                  

第二、神经网络隐含层的第i个节点的输出变量yi:

                                             

第三、神经网络输出层的第k个节点的输入变量netk:

                                            

第四、神经网络输出层第k个节点的输出变量ok:

       在基于BP神经网络的图像压缩解压算法中,首先将图像数据作为输入,通过BP神经网络对图像数据进行压缩,将压缩后的数据存储或传输。在需要解压图像数据时,再将存储或传输的压缩数据输入到BP神经网络中,通过反向传播学习算法对神经网络的权值进行调整,从而使神经网络的输出逐渐逼近原始图像数据。

基于BP神经网络的图像压缩解压算法的数学公式如下:
输入层:X=R^n
隐含层:Y=f(WX+B)
输出层:Z=f(WY+B)

      其中,X为输入图像数据,R^n表示n维实数集合,W和B分别为隐含层和输出层的权值和阈值,f为激活函数,常见的激活函数有sigmoid函数、ReLU函数等。

反向传播阶段:E=Z-T
D=f'(WX+B)WY
V=D^T
U=f'(U)WY^T
W=WU+VB
B=VB

      其中,E为误差信号,D为隐含层到输出层的传递函数,V为误差信号的权值修正量,U为输出层到隐含层的传递函数,W和B的修正量分别为WU和VB。

通过以上算法,可以将图像数据进行压缩和解压处理。

2.MATAB核心程序

该算法由两个神经网络组成,一个用于图像压缩,另一个用于图像解压缩。


clc
clear all

rng('default')
rng(0)

%% 压缩率控制
K=4;
N=2;
row=256;
col=256;

%% 数据输入
I=imread('lena.bmp');

% 统一将形状转为row*col
I=imresize(I,[row,col]);

%% 图像块划分,形成K^2*N矩阵
P=block_divide(I,K);

%% 归一化
P=double(P)/255;

%% 建立BP神经网络
net=feedforwardnet(N,'trainlm');
T=P;
net.trainParam.goal=0.001;
net.trainParam.epochs=500;
tic
net=train(net,P,T);
toc

%% 保存结果
com.lw=net.lw{2};
com.b=net.b{2};
[~,len]=size(P); % 训练样本的个数
com.d=zeros(N,len);
for i=1:len
    com.d(:,i)=tansig(net.iw{1}*P(:,i)+net.b{1});
end
minlw= min(com.lw(:));
maxlw= max(com.lw(:));
com.lw=(com.lw-minlw)/(maxlw-minlw);
minb= min(com.b(:));
maxb= max(com.b(:));
com.b=(com.b-minb)/(maxb-minb);
maxd=max(com.d(:));
mind=min(com.d(:));
com.d=(com.d-mind)/(maxd-mind);

com.lw=uint8(com.lw*63);
com.b=uint8(com.b*63);
com.d=uint8(com.d*63);

save comp com minlw maxlw minb maxb maxd mind
 

clear,clc
close all
rng('default')
rng(0)
%% 载入数据
col=256;
row=256;
I=imread('lena.bmp');
load comp
com.lw=double(com.lw)/63;
com.b=double(com.b)/63;
com.d=double(com.d)/63;
com.lw=com.lw*(maxlw-minlw)+minlw;
com.b=com.b*(maxb-minb)+minb;
com.d=com.d*(maxd-mind)+mind;

%% 重建
for i=1:4096
   Y(:,i)=com.lw*(com.d(:,i)) +com.b;
end

%% 反归一化
Y=uint8(Y*255);

%% 图像块恢复
I1=re_divide(Y,col,4);

%% 计算性能
fprintf('PSNR :\n  ');
psnr=10*log10(255^2*row*col/sum(sum((I-I1).^2)));
disp(psnr)
a=dir();
for i=1:length(a)
   if (strcmp(a(i).name,'comp.mat')==1) 
       si=a(i).bytes;
       break;
   end
end
fprintf('rate: \n  ');
rate=double(si)/(256*256);
disp(rate)
figure(1)
imshow(I)
title('原始图像');
figure(2)
imshow(I1)
title('重建图像'); 
up2251

3.仿真结果

matlab仿真结果如下图所示:

      在图像压缩阶段,我们将输入图像数据通过压缩神经网络,得到压缩后的数据。为了训练压缩神经网络,我们使用了一个带有8个隐含层神经元的Sigmoid函数作为激活函数。我们采用了随机梯度下降算法来训练该神经网络,并使用交叉熵损失函数来衡量输出数据与原始图像数据之间的差异。

      在图像解压缩阶段,我们将压缩后的数据通过解压神经网络,得到解压后的图像数据。为了训练解压神经网络,我们使用了与压缩神经网络相同的结构,但将输出层神经元数量增加到了28x28。我们采用了与压缩神经网络相同的训练算法和损失函数来训练解压神经网络。

     在完成神经网络的训练后,我们将测试集图像数据进行压缩,并将压缩后的数据传输到接收方。在接收方,我们使用解压神经网络对接收到的数据进行解压,以恢复原始图像数据。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值