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

news2024/9/20 16:38:26

目录

    • 一、图像压缩
    • 二、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.coloradmin.cn/o/467800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础项目:图书管理系统(详解)

java基础学习后适合写的测试语法和代码熟练度的小项目(学校学java,总得练一练的) 文章目录 架构 / 流程架构流程具体内容 代码实现booksBook(图书类)BookList(图书列表类) userUser(…

U盘数据恢复怎么做?分享4个恢复方法!

案例:u盘数据恢复 【我之前丢失的u盘前两天突然找到了,但是我将它插入电脑后很多数据都读不出来了,遇到u盘无法读取的情况怎么办呀?怎么才能恢复u盘数据呢?】 u盘是一种便携式存储设备,广泛用于数据传输和…

使用Inno Setup将QT开发的软件制作成安装包(仅Windwos平台)

使用Inno Setup将QT开发的软件制作成安装包(仅Windwos平台) 前言 在使用QT完成软件开发后要把软件给别人使用,我之前是打包发布后直接弄成压缩包发给别人,但是接收的人就要通过解压软件解压才能使用软件,如果没有解压…

WizardKM:Empowering Large Language Models to Follow Complex Instructions

WizardKM:Empowering Large Language Models to Follow Complex Instructions Introduction参考 Introduction 作者表明当前nlp社区的指令数据比较单一,大部分都是总结、翻译的任务,但是在真实场景中,人们有各式各样的需求,这限制…

MyBats

一、MyBatis简介 1. MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来…

【Python | 基础语法篇】02、标识符、运算符、字符串扩展及数据输入

目录 一、标识符 1.1 什么是标识符 1.2 标识符命名规则 1.2.1 标识符命名规则 - 内容限定 1.2.2 标识符命名规则 - 大小写敏感 1.2.3 标识符命名规则 - 不可使用关键字 1.3 案例演示 1.4 变量命名规范 1.4.1 变量命名规范 - 见名知意 ​1.4.2 变量命名规范 - 下划线…

Spring aop如何寻找advisor

1.bean的生命周期第一步回去解析所有的advisor 2.第四个是我们之前开启的注解EnableAspectJAutoProxy 3.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation 4.org.springframework.aop.framework.autoproxy.AbstractAutoP…

ChatGPT的提示的一些高级知识

作为一个大型语言模型(LLM)接口,ChatGPT有令人印象深刻的潜力,但是真正能否用好取决与我们的提示(Prompt ),一个好的提示可以让ChatGPT晋升到一个更好的层次。 在这篇文章中,我们将介绍关于提示的一些高级…

可视化 | Flask+Pyecharts可视化模板二

文章目录 🏳️‍🌈 1. 系统说明界面🏳️‍🌈 2. 柱状图示例界面🏳️‍🌈 3. 散点图示例界面🏳️‍🌈 4. 折线图示例界面🏳️‍🌈 5. 饼图示例界面&#x1f3f…

单链表——你需要掌握的那些内容

如有错误,感谢不吝赐教、交流 文章目录 前言本文涉及题目:设计链表有无头结点的区别头指针无头结点有头结点为什么需要头结点呢?注意: 单链表,本文使用Java实现定义链表节点定义一个链表类并初始化get(int index)addA…

HAproxy与web集群

文章目录 一、HAproxy1.HAProxy是什么2.HAProxy的核心能力和关键特性3.LVS、Nginx、HAproxy的区别: 二、实验步骤1.Haproxy搭建 Web 群集 总结 一、HAproxy 1.HAProxy是什么 HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。…

儿童生长发育迟缓的鉴别和干预

(英国)国家临床医学研究所(NICE)2017年发布关于婴儿/儿童生长发育迟缓的鉴别、评估和监测的指南,该指南确定了生长发育的界值,指出了诱因及危险因素,并提出了干预的方案。 ▼Part1:…

“无人值守”时代已来,千巡翼X4给出怎样的答案?

随着技术和产品的逐渐成熟,无人机在各行业的应用越来越普遍,但如何进一步解放人力,提高运营效率,还有很大的探索空间。针对作业频率高、重复性高、周期性强、作业环境艰险危险等痛点,用户迫切需要更高效、更智能的全自…

LeetCode876. 链表的中间结点

876. 链表的中间结点 描述示例解题思路以及代码解法1解法2 描述 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 示例1 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释…

希尔排序的实现

希尔排序是插入排序的一种升级,其基本思想是: 先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每 一组内的记录进行排序。然后,取,重复上述分组和排序的工 作…

可执行Jar项目

一个复杂Jar的运行,要解决classpath问题,否则运行时会有ClassNotFoundException抛出。而用java,需要手动维护一个classpath文件,或者将所有的库位置放到命令行参数里。有没有更好的办法? Jar库目录方式 核心配置在于两…

算法训练Day40:343. 整数拆分 96.不同的二叉搜索树

文章目录 整数拆分题解(动态规划)贪心 不同的二叉搜索树题解 整数拆分 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (62.22%)11660--0 Tags 数学 | 动态规划 Companies 给定一个正整数 n ,将其拆分为…

推荐几个免费的在线文本转语音网站(支持中英文多种语音)

如果你正在寻找一款免费的在线文本转语音工具,那么你来对地方了!本文将介绍几个完全免费的在线文本转语音网站,推荐收藏下来以备不时之需。 No.1 免费文本转语音(TTSMaker) TTSMaker是第一个推荐的工具,这…

院内导航方案怎么样?什么地图可以用于医院导航系统?

什么地图可以用于医院导航系统?随着医疗事业的不断发展,医院的建制规模越来越大,在医疗能力得到增强的同时,由于楼宇众多,院内寻路难度难免增加。不少前来医院就诊的患者经常会有“寻路难”的困扰。此时一张一目了然的…

从在线监测与故障诊断系统视角,探讨动设备安全运行的重要性

在工业生产中,动设备是生产线的重要组成部分,但是随着设备运行时间的不断延长,设备的损耗逐渐加大,设备故障和损坏的风险也随之增加,给生产效率和安全带来不小的影响。因此,如何保证动设备的安全运行成为了…