一张 图像降维再重构:
import numpy as np
import cv2 as cv
# 数据中心化
def Z_centerted(dataMat):
rows, clos = dataMat.shape
meanVal = np.mean(dataMat, axis=0)
meanVal = np.tile(meanVal, (rows, 1))
newdata = dataMat - meanVal
return newdata, meanVal
# 求出最大特征值k的个数
def Percentage2n(eigen, p):
sortArray = np.sort(eigen) # 升序
sortArray = sortArray[-1::-1] # 降序
arraysum = sum(sortArray)
num = 0
itemnum = 0
for i in sortArray:
itemnum += i
num += 1
if itemnum >= arraysum*p:
return num
# 求出特征值和特征向量
def EigDV(dataMat, p):
D, V = np.linalg.eig(dataMat) # 求出特征值和特征向量
k = Percentage2n(D, p) # 求出k值
print("保留99%的信息:"+str(k)+"\n")
eigenvalue = np.argsort(D)
K_eigenvalue = eigenvalue[-1:-(k+1):-1]
K_eigenvactor = V[:, K_eigenvalue]
return K_eigenvalue, K_eigenvactor
# 获得降维图片
def getlowDataMat(dataMat, K_eigenvactor):
return dataMat * K_eigenvactor
# 重构数据
def Reconstruction(lowDataMat, K_eigenvactor, meanVal):
reconDatMat = lowDataMat*K_eigenvactor.T + meanVal
return reconDatMat
# 创建PCA
def PCA(data, p):
dataMat = np.float32(np.mat(data))
dataMat, manVal = Z_centerted(dataMat)
# 计算协方差矩阵
covMat = np.cov(dataMat, rowvar=0)
D, V = EigDV(covMat, p)
lowDataMat = getlowDataMat(dataMat, V)
reconstruction = Reconstruction(lowDataMat, V, manVal)
return reconstruction
def main():
imagePath = r'All_Resize/c1/15.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.8)
reconImage = reconImage.astype(np.uint8)
print(reconImage.shape)
if __name__ == '__main__':
main()
一个文件夹多个图像降维再重构
import numpy as np
import cv2 as cv
def Z_centered(dataMat):
rows, clos = dataMat.shape
meanVal = np.mean(dataMat, axis=0)
meanVal = np.tile(meanVal, (rows, 1))
newdata = dataMat - meanVal
return newdata, meanVal
def Percentage2n(eigVals, percentage):
sortarray = np.sort(eigVals) # 升序
sortarray = sortarray[-1::-1] # 降序
sumarray = sum(sortarray)
num = 0
tempsum = 0
for i in sortarray:
num += 1
tempsum += i
if tempsum >= sumarray*percentage:
return num
def EigDv(dataMat, p):
# 特征值越大,所携带的东西越多
D, V = np.linalg.eig(dataMat) # 确定协方差和协方差矩阵
k = Percentage2n(D, p)
print("保留99%信息,降维后的特征个数:"+str(k)+"\n")
eigenValue = np.argsort(D) # 升序
K_eigenValue = eigenValue[-1:-(k+1):-1]
K_eigenVactor = V[:, K_eigenValue]
return K_eigenValue, K_eigenVactor
def getlowDataMat(dataMat, K_eigenVactor):
return dataMat*K_eigenVactor
def Reconstruction(lowDataMat, K_eigenvactor, meanval):
reconstruction = lowDataMat*K_eigenvactor.T + meanval
return reconstruction
def PCA(data,p):
dataMat = np.float32(np.mat(data))
dataMat, meanval = Z_centered(dataMat)
convdata = np.cov(dataMat, rowvar=0)
K_eigenvalue, K_eigenvactor = EigDv(convdata, p)
lowDataMat = getlowDataMat(dataMat, K_eigenvactor)
reconstruction = Reconstruction(lowDataMat, K_eigenvactor, meanval)
return reconstruction
def main():
for i in range(30):
imagePath = r'All_Resize/c10/'+str(i+1)+'.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.999)
reconImage = reconImage.astype(np.uint8)
reconImage = cv.applyColorMap(reconImage, cv.COLORMAP_WINTER)
print(reconImage)
cv.imwrite('color-decline-resize/c10/'+str(i+1)+'.jpg', reconImage)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == '__main__':
main()