1.简述
BP神经网络的图像压缩原理
数字图像压缩实际上是以较少的比特数有损或者无损的来表示原来像素矩阵的一种图像处理技术,实际上就是减少图像数据中的时间冗余,空间冗余,频谱冗余等等作为目的,从而同过减少上述的一种或者多种冗余的信息而达到更加高效的存储与传输数据.图像的压缩系统其实无论采用什么样的具体的架构或者技术方法,基本的过程都是一致的,主要还是可以概述为编码,量化,解码这三个部分,流程图如下:
从理论上讲,编解码问题其实就可以归结为映射与优化的问题,从神经网络的方面来看无非就是实现了从输入到输出的一个非线性的映射关系,并且衡量性能的标准可以从并行处理能力是否高效,容错率是否合适,以及是否具有鲁棒性.分析图像压缩的基本原理其实和上述的BP神经网络的原理一样:如下图所示:
在BP网络中,输入层到隐藏层之间的映射关系相当于编码器,用于对于图像信号进行线性或者非线性的变换,而隐藏层到输出层之间的映射关系相当于编码器,通过对于压缩后的信号数据进行反变换来达到重建图像数据.压缩比率S=输入层神经元个数/隐藏层神经元节点数.BP神经网络的输入层与输出层的神经元节点数从理论上说是一致的.而隐含层的神经元数目比输出层输入层的数目要少得多.这样理论上就可以通过调节隐藏层神经元节点数目来达到对于不同图像压缩比的效果.
2.代码
%% 清理
clc
clear all
rng(0)
%% 压缩率控制
K=4;
N=10;
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
3.运行结果