python SVD奇异值分解
svd函数会返回三个分解部分U、S、VT,其中S是一个对角矩阵。
S中的每个值与VT的行向量以及U中的列向量对应,默认按照从大到小的顺序排列,表示与其对应向量的重要性
奇异值大小差别很大

原图
灰度化
接下来使用前n个向量进行叠加:
1个
20个

100个
1000个
全部:
向量数目越多,效果越好,用所有向量即可还原原始图片
代码:
import numpy as np
import cv2 as cvimg = cv.imread('lena.jpg')
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
U, S, VT = np.linalg.svd(img)def composite(n):return np.dot(U[:, :n], S[:n, np.newaxis] * VT[:n, :])cv.imshow('img1', composite(1).astype(np.uint8))
cv.imshow('img20', composite(20).astype(np.uint8))
cv.imshow('img100', composite(100).astype(np.uint8))
cv.imshow('img1000', composite(1000).astype(np.uint8))
cv.imshow('img_all', composite(len(S)).astype(np.uint8))
cv.waitKey(0)
cv.destroyAllWindows()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
