当前位置: 首页 > article >正文

【MATLAB图像处理实用案例详解(12)】——利用BP神经网络实现图像压缩

目录

    • 一、图像压缩
    • 二、BP神经网络实现图像压缩原理
    • 三、算法步骤
      • 3.1 图像块划分
      • 3.2 归一化
      • 3.3 建立BP神经网络
      • 3.4 保存结果
    • 四、效果演示

一、图像压缩

常见的文件压缩软件如WinZip、WinRAR等采用的是无损压缩,能够完全恢复原文件内容。多媒体信息具有信息量大、冗余信息多的特点,往往采用有损压缩技术。

  1. 根据大面积着色原理,图像必须在一定面积内存在相同或相似的颜色,对于人眼的观察来说才有意义,否则看到的只是杂乱无章的雪花。因此,图像中相邻象素间存在相似性,这样就产生了图像的预测编码。
  2. 由于存在视觉的掩盖效应,因此人眼对于颜色细节往往并不敏感。图像信息上的微小损失往往是无法感知或可以接受的,这样就提供了广阔的压缩空间
  3. 数据都存在统计上的冗余,如在某一幅描绘海洋的图像中,蓝颜色出现的频率可能远高于红颜色,通过去除统计上的冗余同样可以实现压缩。

二、BP神经网络实现图像压缩原理

BP神经网络用于压缩 :
只采用一个隐含层,因此整体构成了一个三层的网络。

把一组输入模式通过少量的隐含层单元映射到一组输出模式,并使输出模式尽可能等于输入模式。因此,隐含层神经元的值和相应的权值向量可以输出一个与原输入模式相同的向量。当隐含层的神经元个数较少时,就意味着隐含层能用更少的数来表现输入模式,而这实际上就是压缩。
在这里插入图片描述
第一层为输入层,中间层为隐含层,网络的映射功能依赖隐含层实现。输入层到隐含层的变换相当于压缩的编码过程;而从隐含层到输出层的变换则相当于解码过程。
在这里插入图片描述
假设输入图像为像素 N ∗ N N*N NN大小,被细分为多个 n ∗ n n*n nn的图像块。如果将图像块中每一个像素点与一个输入或输出神经元相对应
在这里插入图片描述
网络随机地抽取图像中各 n ∗ n n*n nn图像块作为学习模式,使用反向传播算法进行学习,通过调整网络中神经元之间的连接权值,使训练集图像的重建误差 E=f-g 的均值达到最小。

其主要流程图如下:
在这里插入图片描述

三、算法步骤

主要步骤如下:

3.1 图像块划分

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

function P=block_divide(I,K)
%实现图像分块
%输入:I——二维矩阵,且图像的行数和列数都是K的倍数;
%输出:当K=4时,输出是一个16*N的矩阵
%计算块的个数
[row,col]=size(I);
R=row/K;
C=col/K;
%预分配空间
P=zeros(K*K,R*C);
for i=1:R
    for 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
end

3.2 归一化

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

P=double(P)/255;

3.3 建立BP神经网络

采用MATLAB神经网络工具箱的feedforwardnet函数创建BP网络,并指定训练算法。为了达到较好效果,采用LM训练法。
代码如下:

net=feedforwardnet(N,'trainlm');
T=P;
net.trainParam.goal=1e-3;
net.trainParam.epochs=500;
tic
net=train(net,P,T);
toc

3.4 保存结果

保存结果。训练完成后,压缩的结果是每个输入模式对应的隐含层神经元向量的值,以及网络的权值和阈值。 使用save命令保存为MAT文件。

save comp com minlw maxlw minb maxb mind maxd

四、效果演示

压缩过程如下:
在这里插入图片描述
解压过程如下:
原始图像和压缩重建图像如下:
在这里插入图片描述
PSNR:
29.2312

rate:
0.2766


如果需要源代码,可以参考资源:https://download.csdn.net/download/didi_ya/87734433。
制作不易,如果对你有所帮助,记得点个赞哟~


http://www.kler.cn/a/15540.html

相关文章:

  • LeetCode 445.两数相加 II
  • 基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
  • React中组件通信的几种方式
  • RT-Thread 星火1号学习笔记
  • cocosCreator视频web模式播放踩坑解决
  • Pytest从入门到精通
  • redis 过期消息订阅实现(java实现)
  • Java数组的学习(基础)
  • [ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南
  • 带你看懂 Vue Hook和React Hook
  • Java工程项目管理系统源码 工程项目源码
  • Prometheus 监控系统安装
  • 5.Java中抽象类和接口
  • 一曲微茫度余生 ——川剧《李亚仙》唱响香港西九戏曲中心
  • bagging(main: RF随机森林) 回归器
  • 神奇的饼状图:如何用最简单的方式呈现复杂的数据
  • layui入门使用文档(包含几个重要的组件)
  • mysql语句高级用法使用记录和sql_mode=only_full_group_by错误解决
  • LeetCode笔记:Weekly Contest 342
  • 快手智能处理与编码算法产品化之路
  • 7-4 多态练习-计算面积
  • 如何实现U盘低格?这样操作快速搞定!
  • [python][vpython]用vpython实现小球砸弹簧代码
  • 十四、51单片机之AD转换
  • 第五章 资源包使用
  • 代码随想录算法训练营第58天|739. 每日温度,496.下一个更大元素 I