原理代码实现
SVD
import cv2.cv2 as cv
import numpy as np
img = cv.imread("lena.png")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) / 256.0
src = gray.copy()
u, s, v = np.linalg.svd(gray)
s = np.diag(s)
feature = 128
u, s, v = u[:, :feature], s[:feature, :feature], v[:feature, :]
gray = u.dot(s)
gray = gray.dot(v)
cv.imshow("src", src)
cv.imshow("lena", gray)
cv.waitKey(0)
PCA
import numpy as np
import cv2.cv2 as cv
from PIL import Image
def pca(data,k):
n_samples, n_features = data.shape
mean = np.array([np.mean(data[:,i]) for i in range(n_features)])
normal_data = data - mean
matrix_ = np.dot(np.transpose(normal_data),normal_data)
eig_val, eig_vec = np.linalg.eig(matrix_)
eigIndex = np.argsort(eig_val)
eigVecIndex = eigIndex[:-(k+1):-1]
feature = eig_vec[:,eigVecIndex]
new_data = np.dot(normal_data,feature)
rec_data = np.dot(new_data,np.transpose(feature)) + mean
return rec_data
A = np.array([[2, 3], [1, 2]])
img = cv.imread("lena.png")
A = cv.cvtColor(img,cv.COLOR_BGR2GRAY) / 256.0
y = pca(A, 100)
cv.imshow("lean", y)
cv.waitKey(0)
sklearn实现
import numpy as np
import numpy as np
from sklearn.decomposition import PCA, TruncatedSVD
import cv2.cv2 as cv
img = cv.imread("lena.png")
A = cv.cvtColor(img,cv.COLOR_BGR2GRAY) / 256.0
pca = PCA(n_components=10)
dst = pca.fit_transform(A)
dst = pca.inverse_transform(dst)
svd = TruncatedSVD(n_components=10)
dst = svd.fit_transform(A)
dst = svd.inverse_transform(dst)
cv.imshow("lena", dst)
cv.waitKey(0)