使用PCA对彩色图片降维

article/2025/10/13 16:40:03

PCA对图片降维

  • 1.原图片
  • 2.PCA降维思路
  • 3.代码
  • 4.k=5效果图
  • 5.结论

1.原图片

小灰灰图片

2.PCA降维思路

    1、小灰灰图片(407,367)2、求图片407行每行的均值mean,再将407行每行元素各自减去对应行的均值mean,即去中心化。得矩阵X(407,367)3、为求特征,需要矩阵X为方阵,故方阵C=X^T * X。的矩阵C(367,367)4、求C的特征值(367,1)和特征向量(367,367)5、取前k个最大特征值对应的特征向量。得k个特征向量Vec,也就是k个基(367,k)6、将去中心化了的原图片矩阵X在这k个基中投影,在基中降维为k的新矩阵D=X * Vec。得D(407,k)[注]因为Vec矩阵(367,k)中k的不同取值,会导致原图丢失信息,故恢复后的图片与原图片不同另外,当k=367时,将不会丢失信息,k值越少,丢失信息越多,因为降维只取了k个最主要的成分7、将降维后的矩阵恢复为图片:X'=D * Vec^T。得X'(407,367)[注]因此降维后图片与原图尺寸相同

3.代码

from PIL import Imageimport numpy as np
import os"""参数说明:file_path:该路径存放原图片和产生的灰度图片work_path:该路径存放pca处理后的图片,图片编号代表此图片使用了多少特征数img_path:用于判断,不必理会
"""
file_path = './img/'
work_path = './pcaImg/'
img_path = file_path + '1.jpg'#用于创建文件夹,不必理会
if not os.path.exists(file_path):os.mkdir(file_path)
if not os.path.exists(img_path):print('请在img文件夹中添加一张照片并将其命名为1.jpg')exit()
if not os.path.exists(work_path):os.mkdir(work_path)"""函数功能:将原图片变为灰度图片参数说明:path:原图片路径输出说明:data:灰度图片像素数组
"""
def loadImage(path):# 打开图片img = Image.open(path)# 将图像转换成灰度图img = img.convert("L")# 图像对象,可变为数组data = img.getdata()# size中1为长,0为宽# 为了避免溢出,这里对数据进行一个缩放,缩小100倍data = np.array(data).reshape(img.size[1], img.size[0])/100# 查看原图的话,需要还原数据new_im = Image.fromarray(data*100)# 将图片保存在路径中# 一定要写convert()不然会一直报错cannot write mode F as JPEG或者keyerrornew_im.convert('RGB').save(file_path+'gImg.jpg', format='jpeg')# 展示灰度图片# new_im.show()return data"""函数功能:使用pca对灰度图片进行降维处理参数说明:data:灰度图路径k:主成分个数输出说明:pass
"""
def pca(data, k):# 求图片每一行的均值mean = np.array([np.mean(data[:, index]) for index in range(data.shape[1])])# 去中心化normal_data = data - mean# 得到协方差矩阵:1/n*(X * X^T),这里不除以n也不影响matrix = np.dot(np.transpose(normal_data), normal_data)# 此函数可用来计算特征值及对应的特征向量# eig_val存储特征值,eig_vec存储对应的特征向量eig_val, eig_vec = np.linalg.eig(matrix)# 对矩阵操作,按从小到大的顺序对应获得此数的次序(从0开始)# 比如说有矩阵[2,1,3,1]# 那么将按数组的顺序[1,123]输出对应的下标# 即[2130]eig_index = np.argsort(eig_val)# 取下标的倒数k位,也就是取前k个大特征值的下标eig_vec_index = eig_index[:-(k+1):-1]# 取前k个大特征值的特征向量feature = eig_vec[:, eig_vec_index]# 将特征值与对应特征向量矩阵乘得到最后的pca降维图new_data = np.dot(normal_data, feature)# 将降维后的数据映射回原空间rec_data = np.dot(new_data, np.transpose(feature)) + mean# 压缩后的数据也需要乘100还原成RGB值的范围newImage = Image.fromarray(np.uint8(rec_data*100))# 将处理好的降维图片存入文件夹newImage.convert('RGB').save(work_path + 'k=' + str(k) + '.jpg')# newImage.show()if __name__ == '__main__':data = loadImage(img_path)for i in range(1, data.shape[1]+1):pca(data, i)print('正在处理第', str(i) + '/' + str(data.shape[1]), '张图片')print('处理完成,请查看pcaImg文件夹')

4.k=5效果图

k=5效果图

5.结论

该程序可以处理任何图片,请随意使用。如果有问题请留言。


http://chatgpt.dhexx.cn/article/02DOcFlS.shtml

相关文章

使用PCA拟合平面

PCA原理&使用PCA拟合平面 背景三点确定一平面多点拟合平面基础数学知识PCA基本思想PCA拟合平面计算过程 PCA理解中心化协方差对角化 背景 本文参考以下两篇平面解析的论文。 《Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Cluster…

Dynamic inner PCA 和 Dynamic PCA

动态PCA方法的核心思想: 将数据X变成增广矩阵,即: l为潜在变量数,然后对X进行传统的PCA方法进行求解,即是动态PCA的结果。 动态内模PCA与之不同,上述动态PCA的一大缺陷是增加了数据的维度,而动…

python实现PCA

★ PCA个人理解: PCA降维是通过变换坐标系,来尽可能的减少信息损失。 ★ PCA思路: 我们的初始矩阵为X,它是mn维的矩阵,其中:m是该数据集有m条记录,n是每条记录中有n个特征,X的基本格…

PCA降维算法

目录 1.维度1.1数据维度1.2特征维度 2.sklearn中的降维算法2.1PCA与SVD2.2降维的实现2.3重要参数n_components2.3.1最大似然估计自选超参数2.3.2 按信息量占比选超参数 3.PCA中的SVD3.1重要参数svd_solver 与 random_state3.2重要属性components_3.3重要接口inverse_transform …

PCA降维

一、主成分分析 1、动机:多个变量之间往往存在一定的相关性,可以通过线性组合的方式从中提取信息。 2、主成分分析:将原始的n维数据投影到低维空间,并尽可能的保留更多的信息。 ---投影后方差最大 ---最小化重构误差 从而达到…

pca绘图

pca 1 PCAtools 1.1 加载R包 library(PCAtools) library(tidyverse)1.2 加载数据&#xff0c;构建表达矩阵和分组信息&#xff08;以iris为例&#xff09; iris <- as.data.frame(iris) iris <- iris %>% mutate(class str_c("a",1:dim(iris)[1],sep …

PCA算法详解

文章出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c;所以记…

PCA 算法详解

PCA算法步骤&#xff1a; 设有m条n维数据。 1&#xff09;将原始数据按列组成n行m列矩阵X 2&#xff09;将X的每一行&#xff08;代表一个属性字段&#xff09;进行零均值化&#xff0c;即减去这一行的均值 3&#xff09;求出协方差矩阵 4&#xff09;求出协方差矩阵的特征值及…

PCA原理

PCA 各位&#xff0c;久违了&#xff5e; 什么是PCA&#xff1f; 什么是PCA呢&#xff1f;这是一个问题&#xff0c;什么样的问题&#xff1f;简单而又复杂的问题&#xff0c;简单是因为百度一下就会出现一大堆的解释&#xff0c;复杂是因为它里面蕴含的内容还是很多的&…

python实现PCA降维

本文包括两部分&#xff0c;使用python实现PCA代码及使用sklearn库实现PCA降维&#xff0c;不涉及原理。 总的来说&#xff0c;对n维的数据进行PCA降维达到k维就是&#xff1a; 对原始数据减均值进行归一化处理&#xff1b;求协方差矩阵&#xff1b;求协方差矩阵的特征值和对…

PCA算法

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。 参考&#xff1a;http://www.cnblogs.com/pinard/p/6239403.html PCA的思想 PCA顾名思义&#xff0c;就是找出数据里最主要的方面&#xff0c;用数据里最…

PCA

R语言实现PCA 一次来自男神MR.来的作业PCA读取数据PCA主体部分输出PCA的主要结果&#xff0c;列出主成分分析分析结果利用碎石图来展示PCA结果对component进行一些解释 简略分析利用PCA结果来进行一个排序下面进行聚类分析 一次来自男神MR.来的作业 PCA 读取数据 #读取数据&…

主成分分析(PCA)原理详解

转载请声明出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c…

PCA详解

本文目录 一、来源及作用存在问题基本作用 二、 基本原理及求解步骤核心思想如何选择投影方向 三、原理分析最大投影方差最小重构代价 四、SVD与PCA的关系 一、来源及作用 存在问题 在我们训练模型的过程中&#xff0c;有时会出现在训练集上误差较小&#xff0c;但到了测试集误…

主成分分析法(PCA)

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA&#xff0c;下面我们就对PCA的原理做一个总结。 目录 …

主成分分析(PCA)方法步骤以及代码详解

主成分分析&#xff08;PCA&#xff09;方法步骤以及代码详解 前言 上一节我们了解到在构建神经网络模型&#xff0c;除了掌握如何搭建神经网络架构&#xff0c;了解参数具体含义&#xff0c;规避风险等方法。第一步是要对采用数据集的详细了解&#xff0c;无需接触任何神经网…

机器学习——PCA降维(我至今为止遇见的最好的博文)

参考文章&#xff1a;https://zhuanlan.zhihu.com/p/77151308 PCA&#xff08;Principal Component Analysis&#xff09; 是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;可用于提取数据的主要特征分量。 PCA 的数学推导可以从最大可分型和最大重构性…

通达OA工作流数据报表二次开发版

此模块除具备工作流——数据报表所有功能外&#xff0c;新加入的功能包括&#xff1a; 1&#xff1a;查询条件自带可查询未完成的流程&#xff1b; 2&#xff1a;查询条件可设置查询所有子流程的字段&#xff1b; 3&#xff1a;报表可显示流程当前处理人&#xff0c;并且点击每…

开发通达OA工作流接口从ERP自动生成OA请款单(图文)

ERP系统很多不带审批系统&#xff0c;即使有审批系统的话应用起来也不那么容易&#xff0c;因为领导一般都是不使用ERP系统的&#xff0c;那么我就用通达OA来完成ERP的单据审批吧&#xff0c;是不是很酷呢&#xff0c;而且还支持移动端app和微信审批。 ERP端的数据发起由ERP方…

OA工作流引擎:作为组织血脉支撑的重要性解析

前面提到协同OA管理平台是以“人和事”为管理对象&#xff0c;但如何把“人和事”通过一定的方法能全部贯通起来呢。就如同一个人&#xff0c;有手、脚、嘴、头脑等各种器官&#xff0c;但如何能把这些器官充分的调动起来&#xff0c;里面最核心的还是人的血液&#xff0c;OA系…