matlab实现主成分分析方法图像压缩和传输重建
原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏
为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一次的1/4,这样导致重建最小的图之后,继续重建上一层,传输参数会增加为4倍,在带宽有限的情况下,采用分段传输就会让用户等待的时间变得越来越长,这个某些应用场景是不太能接受的,结合压缩算法可以缓解一部分这个问题,但是这不算完美的解决方案。于是我继续研究,发现可以采用主成分分析来完成我想要的功能。
主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,主要用于减少数据集的维度,同时尽可能保留数据的主要特征和结构。PCA通过将原始数据转换到一个新的坐标系中,使得新坐标系的第一个轴(第一主成分)最大化数据的方差,第二个轴(第二主成分)在与第一个轴正交的条件下最大化剩余数据的方差,以此类推。
什么是PCA,对于科普类的知识可以直接请教AI,快速了解大概。
PCA的基本原理:
-
数据标准化:PCA通常要求数据是标准化的,即每个特征的均值为0,方差为1。这是因为PCA对不同尺度的特征敏感,标准化可以避免某些特征因尺度较大而占据主导地位。
-
协方差矩阵:计算原始数据的协方差矩阵。协方差矩阵描述了各个特征之间的线性关系和数据的分布情况。
-
特征值和特征向量:求解协方差矩阵的特征值和特征向量。特征值表示对应特征向量方向上的方差大小,特征向量表示新的坐标轴方向。
-
选择主成分:根据特征值的大小选择前k个最大的特征值对应的特征向量,这些特征向量就是新的坐标轴,称为主成分。通常选择的主成分数量k使得累计方差贡献率达到一定的阈值(如95%)。
-
数据投影:将原始数据投影到新的坐标系中,得到降维后的数据。
PCA的应用:
-
数据可视化:通过将高维数据降到二维或三维,便于在图表中展示和分析。
-
特征提取:提取数据的主要特征,去除噪声和冗余信息。
-
数据压缩:减少数据存储和传输的成本。
-
机器学习:作为预处理步骤,提高模型的训练效率和预测性能。
PCA的优缺点:
优点:
-
降维:有效减少数据维度,简化模型复杂度。
-
去噪:去除数据中的噪声,提高数据质量。
-
可视化:将高维数据降到低维,便于可视化和理解。
缺点:
-
信息损失:降维过程中会丢失部分信息,特别是在选择较少主成分时。
-
线性假设:PCA假设数据之间的关系是线性的,对于非线性关系的数据效果不佳。
-
解释性:降维后的主成分通常难以直接解释其物理意义。
有了上述的基本了解,再查查别的资料,重要的不是手写PCA(当然手写也不是很困难),而是用PCA,先用matlab仿真试一下,编写pcasample函数能够实现基于样本(变量)的主成分分析:
本文处理的原图:

function [coeff,score,rate]=pcasample(X,p)% X:样本矩阵% p:提取前p个主成分% coeff:特征向量矩阵(系数矩阵)% score:得分向量% reta:贡献率% % 将样本归一化% X=zscore(X); %这里好像不用归一化% 计算样本方差的特征向量[V,D]=eig(X'*X);% 将特征向量中的最大值置为正数for i=1:size(V,2)[~,idx]=max(abs(V(:,i)));V(:,i)=V(:,i)*sign(V(idx,i));end% 将特征根按照从大到小的顺序排列[lambda,locs]=sort(diag(D),'descend');V=V(:,locs);% 只提取前p个主成分coeff=V(:,1:p);% 计算得分矩阵score=X*V(:,1:p);% 计算贡献率rate=sum(lambda(1:p))/sum(lambda);end
找个图片运行一下,然后发现主成分个数每次都是1???说好的有多个主成分,按照重要性排列呢?怎么只能有一个,那不就变成纯纯的压缩了嘛?没办法,继续研究,在《计算机视觉和深度学习实战》这本书里面,终于明白了怎么回事。
PCA主要是降维,默认输入一张图片就是一整块矩阵,最多算是2维数据。所以要处理图像,生成多个主成分,需要预处理一下。
在一般情况下,数字图像矩阵可以被视为二维数组,为了将图像数组转换为样本矩阵,需要首先对图像进行子块划分,然后将每个子块都拉伸成一维的,最后将所有子块都组合成一个样本矩阵。其中,MATLAB自带的im2col函数可以实现二维数组的分块及向量整合。
继续阅读:“主成分分析(PCA)计算协方差矩阵的特征值和特征向量,并选择少数几个主分量代表多变量的方差(即协方差)结构,是一种有效的特征提取方法。数字图像是二维矩阵,对其通过PCA处理来提取特征,可以在一定比例上保留原始图像的特征信息,并且能够大大减少计算量。因此,PCA图像压缩处理属于一种降维方法,它通过对高维图像块向量空间进行降维处理,将多变量的图像块数据表进行最佳综合、简化,导出少数几个主分量,进而实现在一定比例上保留原始图像信息,又能保持图像块之间的不相关性,进而保证图像压缩的有效性。”
参考例程:
先写一个例程进行PCA分析和重建。
clc;clear;close all;% 读取图像image = imread('pic1.png');%%k=1;for p=1:5:20[Ipca,ratio,contribution]=pcaimage(image,p,[24 24]);subplot(2,2,k);imshow(Ipca)title(['主成分个数=',num2str(p),'压缩比=',num2str(ratio),'贡献率=',num2str(contribution)]);k=k+1;endfunction [Ipca,ratio,contribution] =pcaimage(I,pset,block)%pcaimage 使用主成分实现图像的压缩% 此处提供详细说明% I:进行压缩的图像% pset:主成分个数% Ipca:主成分分析重构图像% ratio:压缩比% contribution:贡献率if nargin<1disp('argument is too few.')endif nargin<2pset=3;endif nargin<3block=[16 16];end% 将彩色图像转换为灰度图if ndims(I)==3I=rgb2gray(I);end% 将图像数组转换为样本矩阵X=im2col(double(I),block,'distinct')';% 样本和变量个数[n,p]=size(X);% 主成分个数不能超过变量个数m=min(pset,p);% 提取前p个主成分,在压缩之后只需要保存coeff和score[coeff,score,contribution]=pcasample(X,m);% 根据系数矩阵重建X=score*coeff';% 将样本矩阵转换为图像数组Ipca=cast(col2im(X',block,size(I),'distinct'),class(I));% 计算压缩比ratio=n*p/(n*m+p*m);endfunction [coeff,score,rate]=pcasample(X,p)% X:样本矩阵% p:提取前p个主成分% coeff:特征向量矩阵(系数矩阵)% score:得分向量% reta:贡献率% % 将样本归一化% X=zscore(X);% 计算样本方差的特征向量[V,D]=eig(X'*X);% 将特征向量中的最大值置为正数for i=1:size(V,2)[~,idx]=max(abs(V(:,i)));V(:,i)=V(:,i)*sign(V(idx,i));end% 将特征根按照从大到小的顺序排列[lambda,locs]=sort(diag(D),'descend');V=V(:,locs);% 只提取前p个主成分coeff=V(:,1:p);% 计算得分矩阵score=X*V(:,1:p);% 计算贡献率rate=sum(lambda(1:p))/sum(lambda);end
得到如下的结果:

看结果,嗯,恢复得还行。
回到渐进式传输的实现,主成分是可以生成多个的,那么可以按照第1主成分、第2主成分、第3主成分……直到传输到够清晰为止,看实际应用,我觉得20已经差不多了。然后写代码来模拟这个过程:
clc;clear;close all;row=4;column=5;% 读取图像image = imread('pic1.png');I=rgb2gray(image);pset=row*column;block=[30 30]; %需要选择合适的参数,让系数最少,初步测试30比较少% 将图像数组转换为样本矩阵X=im2col(double(I),block,'distinct')';% 样本和变量个数[n,p]=size(X);% 主成分个数不能超过变量个数m=min(pset,p);% 提取前p个主成分,在压缩之后只需要保存coeff和score[coeff,score,contribution]=pcasample(X,m);% 根据系数矩阵重建X=score*coeff';% 将样本矩阵转换为图像数组Ipca=cast(col2im(X',block,size(I),'distinct'),class(I));% 计算压缩比ratio=n*p/(n*m+p*m);figuresubplot(1,2,1);imshow(I)title('原图')subplot(1,2,2);imshow(Ipca);title(['主成分个数=',num2str(m),'压缩比=',num2str(ratio),'贡献率=',num2str(contribution)]);figure% 模拟传输过程,每次传输一点,重建一点gScore=[];gcoeff=[];for k=1:psetgScore=[gScore score(:,k)];gcoeff=[gcoeff;coeff(:,k)'];%根据系数矩阵重建X=gScore*gcoeff;%将样本矩阵转换为图像数组Ipca=cast(col2im(X',block,size(I),'distinct'),class(I));subplot(row,column,k);imshow(Ipca)end
得到结果:


嗯,模拟重传过程就在“想象”中实现了,具体应用还需要更多的处理。注意block=[30 30]参数的选择,根据矛盾论的主要矛盾,当传输带宽是主要限制的时候,需要合理选择参数让每一次的传输数据量最小。30这个数据是我大概对比了一下,选择了差不多小的。
相关文章:
matlab实现主成分分析方法图像压缩和传输重建
原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一…...
18.UE5怪物视野、AI感知、攻击范围、散弹技能
2-20 怪物视野、AI感知、攻击范围、散弹技能_哔哩哔哩_bilibili 目录 1.AI感知组件 2.AI感知更新的函数 3.攻击范围 4.散弹技能 4.1创建发射物i 4.2创建远程攻击方式 4.3散弹自定义事件的实现 4.4动画通知实现攻击 1.AI感知组件 为怪物蓝图添加AI感知组件,…...
【 ElementUI 组件Steps 步骤条使用新手详细教程】
本文介绍如何使用 ElementUI 组件库中的步骤条组件完成分步表单设计。 效果图: 基础用法 简单的步骤条。 设置 active 属性,接受一个 Number,表明步骤的 index,从 0 开始。 需要定宽的步骤条时,设置 space 属性即…...
MQTT从入门到精通之 MQTT 客户端编程
MQTT 客户端编程 1 在VUE中使用MQTT 具体步骤如下所示: 1、初始化vue项目 // 创建一个使用vite构建的前端项目 npm create vitelatest// 进入到项目中,执行如下命令安装项目依赖 npm install 2、安装element plus // 安装element plus npm install …...
数据结构-集合
一.集合的表示 一个重要的操作是查某个元素属于哪个集合,另一个操作是合并操作 从这个树的节点去找树根也就是从下往上找,要把树并起来只需把两个根并在一起就可以了 不存在已知一个节点去找孩子节点,根重要的是已知一个节点找它的父亲节点,与之前的二…...
前端 JS面向对象 原型 prototype
目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题: function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…...
Java中的不可变集合:性能与安全并重的最佳实践
Java中的不可变集合:性能与安全并重的最佳实践 在现代软件开发中,集合类(如List、Set和Map)是Java开发者的日常工具。它们用于存储和操作数据,能极大地简化开发工作。但随着并发编程和大规模应用的广泛使用࿰…...
RandomWords随机生成单词
from random_words import RandomWords rw RandomWords() r rw.random_word() print(r) 更多How to use — random_words documentation (randomwords.readthedocs.io) li LoremIpsum()# 这行代码创建了一个 LoremIpsum 类的实例。li.get_sentence()# 这个方法返回一个随机…...
从零开始使用Intel的AIPC使用xpu加速comfyui
Intel的AIPC使用xpu加速跑comfyui 环境安装python环境搭建驱动及oneAPI安装创建python环境验证环境是否生效 ComfyUI的安装下载、汉化comfyui下载checkpoint 测试使用xpu加速测试使用cpu执行测试 环境安装 python环境搭建 直接下载Anaconda 下载地址 安装好后,通…...
PyQt入门指南五十二 版本控制与协作开发
在开发PyQt应用程序时,版本控制和协作开发是提高开发效率和项目可维护性的重要手段。本指南将介绍如何使用Git进行版本控制,以及如何使用GitHub进行协作开发。 版本控制基础 Git简介:Git是一种分布式版本控制系统,用于跟踪代码变…...
思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉啊“ (**)
Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 这里提出使用 vi / vim 进行简单的编辑操作的原因,主要是在容器镜像中,普遍都是使用这个。 在 linux 服务器应用场景&#x…...
共筑开源技术新篇章 | 2024 CCF中国开源大会盛大开幕
在这个技术革新日新月异的时代,开源精神如同点燃创新火焰的火种,照亮了无数技术探索者的征途。2024年11月9日,备受瞩目的2024 CCF中国开源大会在深圳这座充满活力的创新之城盛大开幕。这场开源领域的顶级盛事,以“湾区聚力 开源启…...
SpringBoot(十八)SpringBoot集成Minio
项目上传文件集成一下Minio,下面是我在项目中集成Minio的全过程。 首先介绍一下Minio:MinIO是高性能的对象存储,单个对象最大可达5TB。适合存储图片、视频、文档、备份数据、安装包等一系列文件。是一款主要采用Golang语言实现发开的高性能、分布式的对象存储系统。客户端支…...
ODOO学习笔记(3):Odoo和Django的区别是什么?
Odoo和Django都是基于Python的开源框架,但它们的设计目标和用途有所不同: 设计目标和用途: Odoo:Odoo是一个企业资源规划(ERP)系统,它提供了一套完整的商业管理软件,包括会计、库存…...
持续收集解决VCcode各种报错的方法
在学习中我们经常会发生各种各样的报错, 1、pip 安装失败的报错 类似下面的 我们有时候纠结在上面会纠结好久,浪费很多时间。(什么轮子我不知道) 常见的解决方法: s-1:先uninstall packing,再重新装一次(有时候会重…...
Windows下使用adb实现在模拟器中ping
文章目录 前言安装adb执行adb命令查找模拟器设备链接模拟器命令行执行ping命令 总结 前言 有时在模拟器中测试应用不像在Windows这种开发环境中那么方便,毕竟Windows或者Linux下的工具五花八门,可以满足各种测试需求,比如应用在模拟器中无法…...
c++之deque和priority_queue
Deque 文档:https://legacy.cplusplus.com/reference/deque/deque/?kwdeque 相关接口: push_back():在尾部插入 #include <iostream> #include <deque>int main () {std::deque<int> mydeque;int myint;std::cout << "…...
SDL渲染器和纹理
文章目录 渲染器 (SDL_Renderer)纹理 (SDL_Texture)代码 渲染器 (SDL_Renderer) :它是渲染内容的接口,负责将内容绘制到窗口中。通过SDL_CreateRenderer创建,可以设置渲染器的背景颜色、绘图颜色、透明度等。所有绘图操作(如绘制…...
基于Matlab 火焰识别技术
课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警࿰…...
Qt 监控USB设备的插入和移除
Qt 监控USB设备的插入和移除 flyfish Ubuntu22.04 Qt 6.2.4 CMakeLists.txt 内容 # 指定 CMake 的最低版本要求 cmake_minimum_required(VERSION 3.16)# 定义项目的名称和使用的编程语言 project(USBMonitor LANGUAGES CXX)# 开启自动 UIC,MOC 和 RCC 工具 set(…...
2026实测:宁波初一数学小升初本土品牌深度拆解
在宁波,几乎每一位小升初、中考、高考的家长都绕不开一个共同情绪——焦虑。镇海、海曙、鄞州等教育强区的竞争热度连年不减,优质初中与重点高中的入学门槛水涨船高,而面对纷至沓来的教培选择,家长们却常常陷入两难:全…...
2026 河北 GEO 优化服务商测评:理性看实力,盘古开物AI智推适配才是硬道理
覆盖石家庄、唐山、保定、邯郸、邢台,立足华北,辐射全国,不搞噱头,只讲真实能力随着生成式 AI 全面融入商业营销,GEO 优化已经从河北企业的可选服务,变成抢占区域流量、提升线上可见度的重要方式。尤其制造…...
2026学生背单词软件实测,这5款真心好用不踩坑
过去几年我们团队在帮助不同学段学生提升词汇量时,踩过不少坑:有的工具背词效率还行,但同步一塌糊涂;有的界面酷炫,算法推荐却毫无个性,仿佛在用十年前的技术。市面上背单词软件看似饱和,真正能…...
华硕笔记本G-Helper显示管理全攻略:从色彩异常到专业校准的5步解决方案
华硕笔记本G-Helper显示管理全攻略:从色彩异常到专业校准的5步解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivob…...
当AI推理遭遇通信瓶颈时,NIXL如何重新定义高性能数据传输架构?
当AI推理遭遇通信瓶颈时,NIXL如何重新定义高性能数据传输架构? 【免费下载链接】nixl NVIDIA Inference Xfer Library (NIXL) 项目地址: https://gitcode.com/gh_mirrors/ni/nixl 在大规模分布式AI推理场景中,数据传输和通信瓶颈已成为…...
如何在5分钟内彻底改变你的Illustrator工作流程:批量替换脚本终极指南
如何在5分钟内彻底改变你的Illustrator工作流程:批量替换脚本终极指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中重复的替换操作浪费宝贵…...
ABAP中OAuth 2.0最小权限落地:从Authorization Code到AUTHORITY-CHECK
1. 这不是“配个Token就完事”的集成——为什么ABAP系统里OAuth 2.0落地总卡在“权限收不紧、业务接不住”上你有没有遇到过这样的场景:前端调用SAP Fiori应用时,后端ABAP系统明明配置了OAuth 2.0授权服务器,但一到实际业务环节就出问题——用…...
从原理图到Ping通:我的STM32F407 RMII以太网调试笔记(含LAN8720硬件差异处理)
从原理图到Ping通:我的STM32F407 RMII以太网调试笔记(含LAN8720硬件差异处理) 第一次点亮STM32F407的以太网接口时,那种成就感至今难忘。但在此之前,我经历了整整两周的煎熬——原理图反复检查、PCB打样两次、软件调试…...
跨平台B站视频下载终极指南:如何用BilibiliDown轻松搞定离线观看
跨平台B站视频下载终极指南:如何用BilibiliDown轻松搞定离线观看 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh…...
VideoDownloadHelper:打破视频下载壁垒的智能浏览器插件
VideoDownloadHelper:打破视频下载壁垒的智能浏览器插件 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 在信息爆炸的时代&#x…...
