神经网络建模

BP神经网络用于压缩的原理如下:

BP网络至少包含一个隐含层,这里只采用一个隐含层,因此整体构成了一个三层的网络。把一组输入模式通过少量的隐含层单元映射到一组输出模式,并使输出模式尽可能等于输入模式。因此,隐含层神经元的值和相应的权值向量可以输出一个与原输入模式相同的向量。当隐含层的神经元个数较少时,就意味着隐含层能用更少的数来表现输入模式,而这实际上就是压缩。

第一层为输入层,中间层为隐含层,网络的映射功能依赖隐含层实现。输入层到隐含层的变换相当于压缩的编码过程。而从隐含层到输出层的变换则相当于解码的过程。如下图:

假设网络的输入层和输出层均由M个神经元组成,隐含层包含K个神经元,且K<M。为了解码时能复原原有的数据信号,这里的输入样本与目标响应是相同的,输入模式即为导师信号。由于K<M,输入模式必须经过隐含层才能到达输入层,因此无法通过简单的线性映射将信号传递到网络的输出端,只能对数据进行压缩编码,保存在隐含层,再由隐含层输出到下一层。

假设输入图像为NxN像素大小,被细分为多个nxn的像素块。如果将像素块中每一个像素点与一个输入或输出神经元相对应,便得到了如下图的所示的模型:

在图像中,每个图像被量化为m比特,因此共有2m个可能的值。2m个灰度按线性关系转换为0~1之间的数值作为网络的输入和期望的输出。网络随机地抽出图像中各nxn图像块作为学习模式,使用反向传播算法进行学习,通过调整网络中神经元之间的连接权值,使训练数据图像的重建误差E=f-g的均值达到最小。训练好的网络隐层神经元矢量便是数据压缩的结果,而输出层神经元矢量便是重建的数据。BP网络的计算模型如下图所示:

至此,我们构建了一个三层BP神经网络。输入层与隐含层之间的连接权值矩阵为Wij,。隐含层第j个神经元的阈值可表示为:bj,

同理,输出层和隐含层之间的连接权值矩阵可表示为Wji,。输出层第i个神经元的阈值可表示为bi,。通过不断训练网络,调整网络的权值,使得网络的输入与输出的方差达到最小,最终将N维向量压缩为K维向量。

根据图13-5,隐含层第j个神经元的输出值为:

输出层第i个神经元的输出值为:

其中为隐含层传递函数,一般为Sigmoid函数。为输出层传递函数,一般采用线性函数。

神经网络压缩的实现

利用BP神经网络做图像压缩和解压的过程如下图所示:

其中,熵编码过程针对神经网络压缩的输出进行,进一步去除统计冗余,在这里不涉及。

压缩步骤

(1)图像块划分

为简单起见,这里将所有输入图像的大小调整为128×128像素大小。为了控制神经网络规模,规定网络输入神经元节点数为16个,即将图像划分为1024个4×4大小的图像块,将每个图像块作为一个样本向量,保存为16×1024大小的矩阵,如下图所示:

在MATLAB中新建函数文件block_divide.m输入代码如下,即可实现图像块的划分:

function P = block_divide(I,K)
% P=block_divede(I)
% [row,col]=size(I),row%K==0, and col%K==0
% divide matrix I into K*K block,and reshape to
% a K^2*N matrix
% example:
% I=imread('lena.jpg');
% P=block_divide(I,4);% 计算块的个数:R*C个
[row,col]=size(I); % 获取Image数组的大小
R=row/K;
C=col/K; % 计算将Image划分为多少个小的像素块(K为一个小像素块的大小)% 预分配空间
P=zeros(K*K,R*C);
for i = 1 : Rfor j = 1 : C% 依次取K*K 图像块I2 = I((i-1) * K + 1 : i * K, (j-1) * K + 1:j * K);% 将K*K块变为列向量i3 = reshape(I2, K*K, 1);% 将列向量放入矩阵P( :, (i-1) * R + j) = i3;end
end

这个函数要求输入的图像矩阵为二维矩阵,且图像的函数和列数均是K的倍数,取K=4时,输出值为一个16xN矩阵,N的大小视图像大小而定。

(2)归一化

神经网络的输入样本一般都需要进行归一化处理,这样更能保证性能的稳定性。归一化可以使用mapminmax函数进行,考虑到图像数据的特殊性,像素点灰度值为整数,且处于0~255之间,因此归一化处理统一将数据除以255即可。例如,读入一副图像后,进行归一化:

%% 归一化
P=double(P)/255; % 对每一个像素点进行归一化处理

归一化后图像的数据处于0~1区间内。这样做还有一个好处,如果使用mapminmax函数,需要存储每一行数据的最大值和最小值,这样最终的压缩数据里必须包含这一部分数据,使得压缩率下降。

(3)建立BP神经网络

采用MATLAB神经网络工具箱feedforwardnet函数创建BP网络,并制定训练算法。为了达到较好的效果,采用LM训练法。同时确定目标误差和最大迭代次数。

%% 建立BP神经网络 feedforwardnet(hiddenSizes,trainFcn)
net=feedforwardnet(N,'trainlm'); % Feedforward neural network
T=P;
net.trainParam.goal=0.001; % 设置BP网络训练参数
net.trainParam.epochs=500;
tic % Start stopwatch timer
net=train(net,P,T); % Train neural network
toc % Read elapsed time from stopwatch

然后,就可以调用train函数进行训练了,tic和toc用于记录训练时间。

(4)保存结果

训练完成后,压缩的结果是每个输入模式对应的隐含层神经元的值,以及网络的权值和阈值。将输入模式输入网络,与输入层和隐含层的权值矩阵相乘,再用Sigmoid函数处理,即可得到隐含层神经元的值:

此时得到大结果为浮点数,为了提高压缩效率,将其量化为5~8比特的整数。方法是先对矩阵进行归一化,使其范围固定在0~1之间,在乘,最后取整数即可。

在MATLAB中使用sava命令即可将变量保存至文件。

save comp com minlw maxlw minb maxb maxd mind

解压缩步骤

加载文件,使用load命令加载数据文件。

数据反归一化。每一个数据除以,得到0~1之间的小数,再将其映射到函数原区间中去,形式如下:

com.lw=double(com.lw)/63;
com.lw=com.lw*(maxlw-minlw)+minlw;

重建。此时得到的数据为BP神经网络隐含层的神经元输出值,为了重建图像,需要将其输入到网络中,与隐含层和输出层之间的权重矩阵相乘。

图像反归一化。图像反归一化不需要使用自定义的区间范围,只需将没份数据乘以像素峰值255,并取整数即可。

图像块恢复。假设划分图像块时,以4×4位单位进行划分,则矩阵因为16xN大小。将每一列抽取出来,重新排列为4×4矩阵,并对各个4×4矩阵按行排列,即可恢复原图像。

在MATLAB中新建函数文件re_divide.m,输入代码如下:

function I=re_divide(P,col,K)
% I=re_divide(P)
% P:  K^2*N matrix
% example:
% I=re_divide(P);
% I=uint8(I*255);
% imshow(I)% 计算大小
[~,N]=size(P);
m=sqrt(N);% 将向量转为K*K矩阵
b44=[];
for k=1:Nt=reshape(P(:,k),K,K);b44=[b44,t];
end% 重新排布K*K矩阵
I=[];
for k=1:mYYchonggou_ceshi1=b44(:,(k-1)*col+1:k*col);I=[I;YYchonggou_ceshi1];
end

压缩/解压代码与运行结果

至此,已经完成使用BP神经网络进行压缩和解压的过程。下面为压缩程序的完成代码(需要使用block_divide函数):

% bp_imageCompress.m
% 基于BP神经网络的图像压缩%% 清理
clc % Clear Command Window
clear all
rng(0) % Control random number generation%% 压缩率控制
K=4; % 设置将图片分成的小像素块的大小(KxK)
N=2; % 设置创建的BP神经网络的隐层数
row=256; % 设置所有进行压缩的图像的原始大小都为256x256
col=256;%% 数据输入
I=imread('d:\lena.bmp');% 统一将形状转为row*col
I = imresize(I,[row,col]); % Resize image%% 图像块划分,形成K^2*N矩阵
P=block_divide(I,K); % 调用自定义函数block_divide将图像进行划分,形成K^2 x N大小的矩阵%% 归一化
P=double(P)/255; % 对每一个像素点进行归一化处理%% 建立BP神经网络 feedforwardnet(hiddenSizes,trainFcn)
net=feedforwardnet(N,'trainlm'); % Feedforward neural network
T=P;
net.trainParam.goal=0.001; % 设置BP网络训练参数
net.trainParam.epochs=500;
tic % Start stopwatch timer
net=train(net,P,T); % Train neural network
toc % Read elapsed time from stopwatch%% 保存结果
com.lw=net.lw{2};
com.b=net.b{2};
[~,len]=size(P); % 训练样本的个数
com.d=zeros(N,len);
for i=1:lencom.d(:,i)=tansig(net.iw{1}*P(:,i)+net.b{1}); % Hyperbolic tangent sigmoid transfer function
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
% web -broswer http://www.ilovematlab.cn/forum-222-1.html

进行解压的完整脚本如下(需要使用re_divide函数):

% bp_imageRecon.m%% 清理
clear,clc
close all%% 载入数据
col=256;
row=256;
I=imread('d:\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:4096Y(:,i)=com.lw*(com.d(:,i)) +com.b;
end%% 反归一化
Y=uint8(Y*255);%% 图像块恢复
I1=re_divide(Y,col,4); % 将重建后的图片存储在I1变量中%% 计算性能
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) % Display value of variable
figure(1) % Create figure window
imshow(I) % Display image
title('原始图像');
figure(2)
imshow(I1)
title('重建图像'); <br>

运行脚本bp_imageCompress.m,指定待压缩图像为d:\lena.bmp,系统构建BP网络,并开始训练。

训练完成后,压缩结果将会保存到comp.mat数据文件中。

运行bp_imageRecon.m脚本进行解压,脚本读入comp.mat文件中的数据,计算网络输出,并显示原始图像和压缩后重建的图像,分别如下所示:

同时在命令窗口中输出重建图像的峰值信噪比和压缩比率:

从上图中可以看出,由于算法将图像强行分割成4×4大小的块,并分别进行训练,图像会在某种程度上出现块效应现象,表现为块与块之间差异较大。另外,由于后续没哟进行熵编码等原因,算法的压缩率(31%)并不高。这是基本的BP网络用于图像压缩的算法,基于BP神经网络的图像压缩还有一些改进的算法,如对分块进行分类,采用不同的隐含层点数进行训练,可以显著提高效果,这里暂时不做介绍。

此外,修改算法的参数可以调节图像压缩的质量。将隐含层神经元个数设为N=6时,可以提高压缩率,但图像的质量会出现一定的降低。如下图:(但图像质量还是会高于上述中N=2的情况)

MATLAB实现基于BP神经网络的图像压缩相关推荐

  1. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  2. 使用MATLAB实现基于BP神经网络训练的手写字母识别程序

    前言 大三的时候利用MATLAB搭建了一个基于BP神经网络框架的手写字母识别程序,其中使用了EMNIST数据集进行训练和测试,可实时对手写输入样本进行识别,并返回两个最可能的结果,过程中可继续添加样本 ...

  3. 基于BP神经网络实现气凝胶加气混凝土抗压强度预测(附代码)

    目录 前言 1. 背景 1.1 什么是加气混凝土 1.2 传统AAC抗压强度测试方法 1.3 为什么选择BP神经网络 2. MATLAB算法实现 2.1 训练集数据编辑 2.2 数据导入与整理 2.3 ...

  4. 《MATLAB 神经网络43个案例分析》:第25章 基于MIV的神经网络变量筛选----基于BP神经网络的变量筛选

    <MATLAB 神经网络43个案例分析>:第25章 基于MIV的神经网络变量筛选----基于BP神经网络的变量筛选 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 < ...

  5. 【预测模型】基于BP神经网络、LSTM、GRNN实现风电功率预测附matlab代码

    1 简介 风电功率预测结果的准确性,不仅关系到风力发电厂的综合运行效率,也与区域运行成本具备直接联系,基于BP神经网络.LSTM.GRNN实现风电功率预测.​经过实例分析,证明设计的方法对风电功率的预 ...

  6. 基于matlab的电机故障诊断,基于BP神经网络的电机故障诊断的研究(MATLAB,程序)

    基于BP神经网络的电机故障诊断的研究(MATLAB,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文25600字,程序,答辩PPT) 摘 要 随着我国经济发展的不断提高,电气化的应用越 ...

  7. MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)

    光伏发电功率主要受太阳辐照度影响,所以准确预测太阳辐照度对光伏功率预测十分重要.程序采用小波分解先对辐照度数据进行分解,然后再用bp神经网络对分解的辐照度数据分别预测,再组合作为最后的预测结果. 人工 ...

  8. 【图像识别】基于BP神经网络和RGB颜色空间实现人民币识别系统matlab代码

    1 简介 随着信息化时代的到来,智能识别成为研究的热点,本文以人民币识别为研究对象,运用 Matlab 软件系统中所提供的神经网络工具箱,结合图像处理技术,实现对各种不同面值纸质版人民币的识别.本文主 ...

  9. 【图像识别】基于BP神经网络实现手写体大写字母识别附matlab代码

    1 简介 手写体字符识别是人机交互领域的一个重要内容,本文基于 BP 神经网络实现了任意数量字符模版的多字符手写体字符识别.分为以下几步,第一,首先对目标图像进行识别前预处理.包括灰度图像二值化,图像 ...

最新文章

  1. 图像数据增强(平移,旋转,亮度变换,翻转,添加高斯噪声,缩放,裁剪)
  2. typora高级设置字体_Mint(Linux)系统设置优化及其常用软件安装笔记
  3. R语言XML格式数据导入与处理
  4. 02.elasticsearch-meta-field元字段
  5. LVS负载均衡DR模式实现
  6. 无线路由器在手机上如何连接服务器,192.168.10.1路由器手机怎么设置? | 192路由网...
  7. Struts2使用Interceptor实现权限控制的应用实例详解
  8. 计蒜客网站 ACM-ICPC亚洲区赛题
  9. XP建立隐藏的超级用户
  10. php微商城微信支付教程,微信支付接口配置教程(微商城版)
  11. dataGridView单元格引用
  12. linux编译libmp3lame,使用libmp3lame库编码mp3
  13. Vue多个元素的过渡
  14. base ring shell skirt skirt 压力容器_压力容器工程规定(2)
  15. Skype for Business Server 2015-07-边缘服务器-1-安装-先决条件
  16. 如何保护个人信息安全?
  17. 使用sws_scale转换视频、使用swr_convert转换音频
  18. 数据库去重,group by、distinct、rowid的用法,oracle和mysql如何数据去重保留一条
  19. 图表生成pdf,出坑经历
  20. MG-SOFT 导入MIB文件

热门文章

  1. L5 U6 衣服与服装
  2. PCB板过孔激光焊接如果实现自动送丝
  3. 绘制屏幕报错:RFC callback call rejected by whitelist
  4. c语言定义y1代表英里数,河南理工大学C语言第二章课后习题答案.ppt
  5. 下拉选数据查询过来的如何设置默认值为空_如何在某些情况下禁止提交Select下拉框中的默认值或者第一个值(默认选中的就是第一个值啦……)...
  6. html+css+javascript弹跳球小游戏
  7. 哈佛大学教授建议微软去投资Linux应用软件
  8. 实践篇 | 构建下一代云上数据湖,助力车企数字化转型
  9. C/C++超详细的关键字大全!
  10. MediaBox HD v2.4.6.1 [Lite Mod] [最新]