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这个数据是我大概对比了一下,选择了差不多小的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886495.shtml

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

相关文章

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

Scala-字符串(拼接、printf格式化输出等)-用法详解

Scala 一、 使用 号连接字符串 在 Scala 中&#xff0c; 运算符实际上会调用 String 类的 concat 方法或者使用字符串的加法操作&#xff0c;生成一个新的字符串。 字符串是不可变的&#xff0c;每次拼接都会创建一个新的字符串。 Mr. yuTips&#xff1a; 性能相对较差&…

ISCTF2024

ezlogin 源码审计 先审源码,纯js题 const express require(express); const app express(); const bodyParser require(body-parser); var cookieParser require(cookie-parser); var serialize require(node-serialize); app.use(bodyParser.urlencoded({ e…

使用真实 Elasticsearch 进行更快的集成测试

作者&#xff1a;来自 Elastic Piotr Przybyl 了解如何使用各种数据初始化和性能改进技术加快 Elasticsearch 的自动化集成测试速度。 在本系列的第 1 部分中&#xff0c;我们探讨了如何编写集成测试&#xff0c;让我们能够在真实的 Elasticsearch 环境中测试软件&#xff0c;并…

MySQL:联合查询(2)

首先写一个三个表的联合查询 查询所有同学的每门课成绩&#xff0c;及同学的个人信息 1.我们首先要确定使用哪些表 学生表&#xff0c;课程表&#xff0c;成绩表 2.取笛卡尔积 select * from score,student,course; 3. 确定表与表之间的联合条件 select * from score,stud…

Vue3学习笔记(下)

文章目录 Vue3学习笔记&#xff08;下&#xff09;组合式API下的父子通信父传子子传父 模板引用defineExpose()provide和injectvue3新特性 - defineOptionsvue3新特性 - defineModelPiniaPinia异步写法 Vue3学习笔记&#xff08;下&#xff09; 组合式API下的父子通信 父传子…

CNN神经网络

CNN 一 基本概述二 基础知识三 经典案例 今天和大家聊聊人工智能中的神经网络模型相关内容。神经网络内容庞大,篇幅有限本文主要讲述其中的CNN神经网络模型和一些基本的神经网络概念。 一 基本概述 深度学习(Deep Learning)特指基于深层神经网络模型和方法的机器学习。它是在…

MySQL —— MySQL基础概念与常用功能介绍

文章目录 基本概念数据类型数据类型分类 约束主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;使用非空约束&#xff08;not null&#xff09;使用唯一性约束&#xff08;UNIQUE&#xff09;使用默认约束&#xff08;DEFAULT&#xff…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件&#xff08;此处是tsx、直接用app或者jsx也行&#xff09; import { useState, useEffect } from react impo…

MySQL面试之底层架构与库表设计

华子目录 mysql的底层架构客户端连接服务端连接的本质&#xff0c;连接用完会立马丢弃吗解析器和优化器的作用sql执行前会发生什么客户端的连接池和服务端的连接池数据库的三范式 mysql的底层架构 客户端连接服务端 连接的本质&#xff0c;连接用完会立马丢弃吗 解析器和优化器…

【开源免费】基于Vue和SpringBoot的私人健身与教练预约管理系统(附论文)

本文项目编号 T 618 &#xff0c;文末自助获取源码 \color{red}{T618&#xff0c;文末自助获取源码} T618&#xff0c;文末自助获取源码 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息…

JVM--内存结构

目录 1. PC Register&#xff08;程序计数器&#xff09; 1.1 定义 1.2 工作原理 1.3 特点 1.4 应用 2.虚拟机栈 2.1定义与特性 2.2内存模型 2.3工作原理 2.4异常处理 2.5应用场景 2.6 Slot 复用 2.7 动态链接详解 1. 栈帧与动态链接 动态链接的作用&#xff1a…

手机直连卫星NTN通信初步研究

目录 1、手机直连卫星之序幕 2、卫星NTN及其网络架构 2.1 NTN 2.2 NTN网络架构 3、NTN的3GPP标准化进程 3.1 NTN需要适应的特性 3.2 NTN频段 3.3 NTN的3GPP标准化进程概况 3.4 NTN的3GPP标准化进程的详情 3.4.1 NR-NTN 3.4.1.1 NTN 的无线相关 SI/WI 3.4.1.2…

【SpringBoot】什么是Maven,以及如何配置国内源实现自动获取jar包

前言 &#x1f31f;&#x1f31f;本期讲解关于Maven的了解和如何进行国内源的配置~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f3…

阿里斑马智行 2025届秋招 NLP算法工程师

文章目录 个人情况一面/技术面 1h二面/技术面 1h三面/HR面 20min 个人情况 先说一下个人情况&#xff1a; 学校情况&#xff1a;211本中9硕&#xff0c;本硕学校都一般&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况&…

富士施乐DocuContre S2520报打开盖子A,取出纸张。代码077-900故障检修

故障描述: 一台富士施乐DocuContre S2520复印机开机报错:打开盖子A,取出纸张。代码077-900故障,用户之前经常卡纸,卡着、卡着就一直提示打开盖子A,取出纸张了;复印机屏幕提示如下图: 故障检修: 富士施乐DocuContre S2520复印机报打开盖子A,取出纸张。077-900的错误代…

【Ubuntu24.04】VirtualBox安装ubuntu-live-server24.04

目录 0 背景1 下载镜像2 安装虚拟机3 安装UbuntuServer24.044 配置基本环境5 总结0 背景 有了远程连接工具之后,似乎作为服务器的Ubuntu24.04桌面版有点备受冷落了,桌面版的Ubuntu24.04的优势是图形化桌面,是作为一个日常工作的系统来用的,就像Windows,如果要作为服务器来…

01.防火墙概述

防火墙概述 防火墙概述1. 防火墙的分类2. Linux 防火墙的基本认识3. netfilter 中五个勾子函数和报文流向 防火墙概述 防火墙&#xff08; FireWall &#xff09;&#xff1a;隔离功能&#xff0c;工作在网络或主机边缘&#xff0c;对进出网络或主机的数据包基于一定的 规则检…

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术&#xff0c;设计了…

Vue 中的透传,插槽,依赖注入

1. 透传attributes 在组件上使用透传attribute&#xff1a; 当你在父组件中使用子组件时&#xff0c;你可以添加一些attribute到子组件上&#xff0c;即使这些attribute没有在子组件的props中声明。 父组件&#xff1a; <!-- 父组件&#xff0c;例如 ParentComponent.vue…