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的图像降维及图像重构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode笔记】4. 寻找两个正
- 下一篇: 用稳压管保护单片机引脚_一步一步,全程揭