日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

pca图像压缩python_基于PCA的图像降维及图像重构

發布時間:2024/7/23 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的图像降维及图像重构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。