def svd(img, topk_percent=0.7):"""使用svd对图片降维,可作为一种数据增强手段
每列作为一个向量,先构建方阵,再求特征值 特征向量,取前N个主成分,再重构图像
:param img: 输入图像
:param topk_percent: 图像恢复率,
:return: img after svd"""img_src=img[...]if len(img.shape) == 3:
img_src=cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
h, w=img_src.shape
data=np.asarray(img_src, np.double)#以下两种方式都可以
#method 1
U, s, V =np.linalg.svd(data)
K= round(len(s) *topk_percent)
K= min(h, w) if K > min(h, w) elseK
S=np.diag(s)
major_data=np.dot(U[:, :K], np.dot(S[:K, :K], V[:K, :]))## method 2
#feat_values, feat_vectors = np.linalg.eig(np.dot(data.T, data))
#feat_index = np.argsort(np.sqrt(feat_values), axis=0)[::-1]
#S = np.diag(feat_values)
#V = feat_vect