pca图像压缩python_基于PCA的图像降维及图像重构
1 PCA简述
PCA(Principal Component Analysis)主成分分析算法,在进行图像识别以及高维度数据降维处理中有很强的应用性,算法主要通过计算选择特征值较大的特征向量来对原始数据进行线性变换,不仅可以去除无用的噪声,还能减少计算量。
2算法过程
2.1对所有的样本进行中心化;
数据集的每个样本的不同特征减去所有样本对应特征的均值,处理过的不同特征上的数据均值为0。这样处理的好处是可以减少特征之间的差异性,可以使得不同的特征具有相同的尺度,让不同特征对参数的影响程度一致。
2.2计算样本的协方差矩阵(每列代表一个特征,每行代表一个样本)
2.2.1 计算样本矩阵每一列的均值
2.2.2 样本矩阵的每个样本减去对应列的均值
2.2.3 通过以下公式得到协方差矩阵 (m为样本总数)
2.3对协方差矩阵进行特征值分解,得到特征值和特征向量;
2.4取出最大的k个特征值对应的特征向量,组成投影矩阵W;
2.5对样本集中的每一个样本,都乘以投影矩阵W进行转化,得到降维的数据;
3Python代码实例
#encoding:GBK
"""
Created on 2019/09/23 16:19:11
@author: Sirius_xuan
"""
'''
基于PCA的图像降维及重构
'''
import numpy as np
import cv2 as cv
#数据中心化
def Z_centered(dataMat):
rows,cols=dataMat.shape
meanVal = np.mean(dataMat, axis=0) # 按列求均值,即求各个特征的均值
meanVal = np.tile(meanVal,(rows,1))
newdata = dataMat-meanVal
return newdata, meanVal
#协方差矩阵
def Cov(dataMat):
meanVal = np.mean(data,0) #压缩行,返回1*cols矩阵,对各列求均值
meanVal = np.tile(meanVal, (rows,1)) #返回rows行的均值矩阵
Z = dataMat - meanVal
Zcov = (1/(rows-1))*Z.T * Z
return Zcov
#最小化降维造成的损失,确定k
def Percentage2n(eigVals, percentage):
sortArray = np.sort(eigVals) # 升序
sortArray = sortArray[-1::-1] # 逆转,即降序
arraySum = sum(sortArray)
tmpSum = 0
num = 0
for i in sortArray:
tmpSum += i
num += 1
if tmpSum >= arraySum * percentage:
return num
#得到最大的k个特征值和特征向量
def EigDV(covMat, p):
D, V = np.linalg.eig(covMat) # 得到特征值和特征向量
k = Percentage2n(D, p) # 确定k值
print("保留99%信息,降维后的特征个数:"+str(k)+"\n")
eigenvalue = np.argsort(D)
K_eigenValue = eigenvalue[-1:-(k+1):-1]
K_eigenVector = V[:,K_eigenValue]
return K_eigenValue, K_eigenVector
#得到降维后的数据
def getlowDataMat(DataMat, K_eigenVector):
return DataMat * K_eigenVector
#重构数据
def Reconstruction(lowDataMat, K_eigenVector, meanVal):
reconDataMat = lowDataMat * K_eigenVector.T + meanVal
return reconDataMat
#PCA算法
def PCA(data, p):
dataMat = np.float32(np.mat(data))
#数据中心化
dataMat, meanVal = Z_centered(dataMat)
#计算协方差矩阵
#covMat = Cov(dataMat)
covMat = np.cov(dataMat, rowvar=0)
#得到最大的k个特征值和特征向量
D, V = EigDV(covMat, p)
#得到降维后的数据
lowDataMat = getlowDataMat(dataMat, V)
#重构数据
reconDataMat = Reconstruction(lowDataMat, V, meanVal)
return reconDataMat
def main():
imagePath = 'D:/desktop/banana.jpg'
image = cv.imread(imagePath)
image=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
rows,cols=image.shape
print("降维前的特征个数:"+str(cols)+"\n")
print(image)
print('----------------------------------------')
reconImage = PCA(image, 0.99)
reconImage = reconImage.astype(np.uint8)
print(reconImage)
cv.imshow('test',reconImage)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__=='__main__':
main()
4 结果
重构前
重构后
5 总结
不难发现,在保留99%信息的情况下,维度由1000降到了44,这大大减小了图像分类时的计算量,重构前和重构后的特征依然明显,读者也可自行调整percentage参数,体验PCA的效果。
PS:喜欢的读者,欢迎随时评论,觉得受益的话,给博主点个赞吧!!
pca图像压缩python_基于PCA的图像降维及图像重构相关推荐
- sklearn的pca建模_基于pca和内容的建模,用于英雄推荐英雄联盟
sklearn的pca建模 Note: All the code for the below can be found here. 注意:以下所有代码均可在此处找到. Previously I wro ...
- 基于PCA的图像压缩实现
基于PCA的图像压缩实现 注:该内容为校内课程实验,仅供参考,请勿抄袭! 源码:PPCA-for-Image-Compession 摘要 随着计算机互联网的发展和数据的日益增长,如何高效的处理和传 ...
- 图像处理合集:图像基础操作(图像翻转、图像锐化、图像平滑等)、图像阈值分割(边缘检测、迭代法、OSTU、区域增长法等)、图像特征提取(图像分割、灰度共生矩阵、PCA图像压缩)
文章目录 说明 一.图像锐化或增强相关 1. 图像点处理 1.1 图像翻转 1.2 幂运算和对数运算 2. 直方图处理 3. 图像平滑 4. 图像锐化 5. 图像增强 二.图像阈值分割 1. 边缘检测 ...
- 基于TensorFlow理解三大降维技术:PCA、t-SNE 和自编码器
ythonista 数据科学家 Elior Cohen 近日在 Medium 上发文解读了最常见的三大降维技术:PCA.t-SNE 和自编码器.为了帮助理解,他还为其中每种相关算法编写了代码(也发布在 ...
- 【机器学习】基于PCA/LDA的数据降维和可视化(二维+三维)
基于PCA/LDA的数据降维和可视化 Introduction Project Intro File Intro Tools Intro Code&Dataset Link Process P ...
- 基于PCA与LDA的数据降维实践
基于PCA与LDA的数据降维实践 描述 数据降维(Dimension Reduction)是降低数据冗余.消除噪音数据的干扰.提取有效特征.提升模型的效率和准确性的有效途径, PCA(主成分分析)和L ...
- matlab进行图像降维,KLT降维与图像压缩(附MATLAB代码)
KLT简述 KLT (Karhunen-Loeve Transform) 是变换编码 (Transform Coding) 的一种方法,它可以将数据转化为更利于压缩的一种形式,去除数据相关性形成的冗余 ...
- 基于PCA方法的ORL人脸识别及Python代码实现
基于PCA方法的ORL人脸识别及Python代码实现 PCA算法 方案设计 代码实现 结果分析 参考文献 PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找 ...
- 基于PCA的人脸特征抽取
我们将应用PCA技术来抽取人脸特征.一幅人脸照片往往由比较多的像素构成,如果以每个像素作为1维特征,将得到一个维数非常高的特征向量, 计算将十分困难:而且这些像素之间通常具有相关性.这样,利用PCA技 ...
最新文章
- OpenCASCADE:形状愈合之分析
- linux环境下用docker安装rabbitmq
- Android应用程序之间共享文字和图片(一)
- Python CheckiO 题解系列 丨 博客目录索引
- css中如何实现帧布局_?如何在Python中加入多个数据帧?
- 人为什么必须积极有为?
- 链路聚合_链路聚合实验
- asp.net 抓取html内容,c# – 如何从ASP.NET获取网页的HTML内容
- 【数据科学】探索性数据分析
- 使用AjaxPro实现ajax效果
- 创建与管理Oracle的分区表和本地索引
- 编译Caffe错误:libpython3.5m.a(abstract.o): relocation R_X86_64_32S against
- 标签上title属性与alt属性的区别是什么
- 三次握手 resend
- shiro自定义filter,anon不生效
- 互联网新机遇:移动社交电商将成为下一个风口?
- vue 获取当前日期的农历(阴历)
- codeforces 186D Mushroom Scientists 不等式
- 基于Python的SQLite基础知识学习
- 合理应用对阿斯克码值进行类型转换(尽量别用强制类型转换)
热门文章
- idea打包meven镜像_Intelij IDEA中修改maven为国内镜像
- 情绪调节的自适应_如何做好情绪的管理者
- python的进程线程和协程_python成长之路 :线程、进程和协程
- 小牛地图矢量抓取工具_SEO优化网站sitemap需要注意哪些要点才能很好的被百度蜘蛛抓取...
- 去掉边框_安卓也有堪比 VOUN 的加边框应用了,素材丰富到没朋友
- python 轨迹预测_CVPR 2019轨迹预测竞赛冠军方法总结
- ajax实现重新绘图,如何画Flot AJAX更新图
- OpenCV中文路径问题、matplotlib可视化中文乱码问题的解决办法
- Python 操作 Elasticsearch 实现 增 删 改 查
- Replace Method with Method Object(以函数对象取代函数)