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()


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部