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

matlab实现主成分分析方法图像压缩和传输重建

原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏

为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一次的1/4,这样导致重建最小的图之后,继续重建上一层,传输参数会增加为4倍,在带宽有限的情况下,采用分段传输就会让用户等待的时间变得越来越长,这个某些应用场景是不太能接受的,结合压缩算法可以缓解一部分这个问题,但是这不算完美的解决方案。于是我继续研究,发现可以采用主成分分析来完成我想要的功能。

主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,主要用于减少数据集的维度,同时尽可能保留数据的主要特征和结构。PCA通过将原始数据转换到一个新的坐标系中,使得新坐标系的第一个轴(第一主成分)最大化数据的方差,第二个轴(第二主成分)在与第一个轴正交的条件下最大化剩余数据的方差,以此类推。

什么是PCA,对于科普类的知识可以直接请教AI,快速了解大概。

PCA的基本原理:

  1. 数据标准化:PCA通常要求数据是标准化的,即每个特征的均值为0,方差为1。这是因为PCA对不同尺度的特征敏感,标准化可以避免某些特征因尺度较大而占据主导地位。

  2. 协方差矩阵:计算原始数据的协方差矩阵。协方差矩阵描述了各个特征之间的线性关系和数据的分布情况。

  3. 特征值和特征向量:求解协方差矩阵的特征值和特征向量。特征值表示对应特征向量方向上的方差大小,特征向量表示新的坐标轴方向。

  4. 选择主成分:根据特征值的大小选择前k个最大的特征值对应的特征向量,这些特征向量就是新的坐标轴,称为主成分。通常选择的主成分数量k使得累计方差贡献率达到一定的阈值(如95%)。

  5. 数据投影:将原始数据投影到新的坐标系中,得到降维后的数据。

PCA的应用:

  1. 数据可视化:通过将高维数据降到二维或三维,便于在图表中展示和分析。

  2. 特征提取:提取数据的主要特征,去除噪声和冗余信息。

  3. 数据压缩:减少数据存储和传输的成本。

  4. 机器学习:作为预处理步骤,提高模型的训练效率和预测性能。

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 江苏 为了研究图像的渐进式传输技术&#xff0c;前文提到过小波变换&#xff0c;但是发现小波变换非常适合传输缩略图&#xff0c;实现渐进式传输每次传输的数据量不一样&#xff0c;这是因为每次变换之后低频成分大约是上一…...

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感知组件&#xff0c…...

【 ElementUI 组件Steps 步骤条使用新手详细教程】

本文介绍如何使用 ElementUI 组件库中的步骤条组件完成分步表单设计。 效果图&#xff1a; 基础用法​ 简单的步骤条。 设置 active 属性&#xff0c;接受一个 Number&#xff0c;表明步骤的 index&#xff0c;从 0 开始。 需要定宽的步骤条时&#xff0c;设置 space 属性即…...

MQTT从入门到精通之 MQTT 客户端编程

MQTT 客户端编程 1 在VUE中使用MQTT 具体步骤如下所示&#xff1a; 1、初始化vue项目 // 创建一个使用vite构建的前端项目 npm create vitelatest// 进入到项目中&#xff0c;执行如下命令安装项目依赖 npm install 2、安装element plus // 安装element plus npm install …...

数据结构-集合

一.集合的表示 一个重要的操作是查某个元素属于哪个集合&#xff0c;另一个操作是合并操作 从这个树的节点去找树根也就是从下往上找,要把树并起来只需把两个根并在一起就可以了 不存在已知一个节点去找孩子节点&#xff0c;根重要的是已知一个节点找它的父亲节点,与之前的二…...

前端 JS面向对象 原型 prototype

目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题&#xff1a; function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…...

Java中的不可变集合:性能与安全并重的最佳实践

Java中的不可变集合&#xff1a;性能与安全并重的最佳实践 在现代软件开发中&#xff0c;集合类&#xff08;如List、Set和Map&#xff09;是Java开发者的日常工具。它们用于存储和操作数据&#xff0c;能极大地简化开发工作。但随着并发编程和大规模应用的广泛使用&#xff0…...

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 下载地址 安装好后&#xff0c;通…...

PyQt入门指南五十二 版本控制与协作开发

在开发PyQt应用程序时&#xff0c;版本控制和协作开发是提高开发效率和项目可维护性的重要手段。本指南将介绍如何使用Git进行版本控制&#xff0c;以及如何使用GitHub进行协作开发。 版本控制基础 Git简介&#xff1a;Git是一种分布式版本控制系统&#xff0c;用于跟踪代码变…...

思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉啊“ (**)

Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 这里提出使用 vi / vim 进行简单的编辑操作的原因&#xff0c;主要是在容器镜像中&#xff0c;普遍都是使用这个。 在 linux 服务器应用场景&#x…...

共筑开源技术新篇章 | 2024 CCF中国开源大会盛大开幕

在这个技术革新日新月异的时代&#xff0c;开源精神如同点燃创新火焰的火种&#xff0c;照亮了无数技术探索者的征途。2024年11月9日&#xff0c;备受瞩目的2024 CCF中国开源大会在深圳这座充满活力的创新之城盛大开幕。这场开源领域的顶级盛事&#xff0c;以“湾区聚力 开源启…...

SpringBoot(十八)SpringBoot集成Minio

项目上传文件集成一下Minio,下面是我在项目中集成Minio的全过程。 首先介绍一下Minio:MinIO是高性能的对象存储,单个对象最大可达5TB。适合存储图片、视频、文档、备份数据、安装包等一系列文件。是一款主要采用Golang语言实现发开的高性能、分布式的对象存储系统。客户端支…...

ODOO学习笔记(3):Odoo和Django的区别是什么?

Odoo和Django都是基于Python的开源框架&#xff0c;但它们的设计目标和用途有所不同&#xff1a; 设计目标和用途&#xff1a; Odoo&#xff1a;Odoo是一个企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;它提供了一套完整的商业管理软件&#xff0c;包括会计、库存…...

持续收集解决VCcode各种报错的方法

在学习中我们经常会发生各种各样的报错&#xff0c; 1、pip 安装失败的报错 类似下面的 我们有时候纠结在上面会纠结好久&#xff0c;浪费很多时间。&#xff08;什么轮子我不知道&#xff09; 常见的解决方法: s-1:先uninstall packing&#xff0c;再重新装一次(有时候会重…...

Windows下使用adb实现在模拟器中ping

文章目录 前言安装adb执行adb命令查找模拟器设备链接模拟器命令行执行ping命令 总结 前言 有时在模拟器中测试应用不像在Windows这种开发环境中那么方便&#xff0c;毕竟Windows或者Linux下的工具五花八门&#xff0c;可以满足各种测试需求&#xff0c;比如应用在模拟器中无法…...

c++之deque和priority_queue

Deque 文档&#xff1a;https://legacy.cplusplus.com/reference/deque/deque/?kwdeque 相关接口&#xff1a; push_back():在尾部插入 #include <iostream> #include <deque>int main () {std::deque<int> mydeque;int myint;std::cout << "…...

SDL渲染器和纹理

文章目录 渲染器 (SDL_Renderer)纹理 (SDL_Texture)代码 渲染器 (SDL_Renderer) &#xff1a;它是渲染内容的接口&#xff0c;负责将内容绘制到窗口中。通过SDL_CreateRenderer创建&#xff0c;可以设置渲染器的背景颜色、绘图颜色、透明度等。所有绘图操作&#xff08;如绘制…...

基于Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…...

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&#xff0c;MOC 和 RCC 工具 set(…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...