采用Singular Value Decomposition降维后图像尺寸未变,该如何解决?
问题澄清与解决方案
你当前的代码实现的是图像压缩重构——用前x个奇异值保留图像的主要视觉信息,重构后的图像尺寸和原图一致(m*n),这是SVD在图像领域的经典应用之一,而非你想要的“维度降低到x”(这里的维度指空间尺寸或特征维度)。
根据你的需求,分两种场景给出解决方案:
场景1:将图像空间尺寸缩小(比如从mn变为pq,p<m、q<n)
SVD并非专门的图像下采样工具,但可以通过截断奇异矩阵的方式实现:
import numpy as np # 假设输入灰度图img,shape为(m, n) m, n = img.shape # 目标缩小后的尺寸:p行,q列 p = 100 q = 100 U, S, V = np.linalg.svd(img) # 取U的前p行、S的前k个奇异值(k=min(p,q))、V的前q列 k = min(p, q) img_small = U[:p, :k] @ np.diag(S[:k]) @ V[:k, :q] # img_small的shape为(p, q),即缩小后的图像
场景2:将图像转为x维特征向量(特征维度降维)
如果你的目标是把m*n的图像映射到x维的低维特征空间(用于后续机器学习等任务),可以这样做:
import numpy as np # 输入灰度图img,shape(m, n) m, n = img.shape # 目标特征维度x x = 64 # 1. 将图像展平为1D向量 img_flat = img.flatten() # shape (m*n,) # 2. 对展平后的向量做SVD分解(转为行矩阵) U, S, V = np.linalg.svd(img_flat.reshape(1, -1), full_matrices=False) # 3. 提取x维特征向量 # 方式一:通过奇异值和左奇异向量计算 img_embedding = (U[:, :x] @ np.diag(S[:x])).flatten() # shape (x,) # 方式二:直接用右奇异向量投影(更高效) img_embedding = img_flat @ V[:x, :].T # shape (x,)
关键区别
- 你原来的代码:重构出和原图尺寸一致的压缩图像,保留核心视觉信息,存储时只需保存
U[:, :x]、S[:x]、V[:x, :],节省存储空间。 - 场景1的代码:生成更小空间尺寸的图像,属于基于SVD的下采样。
- 场景2的代码:生成x维特征向量,属于特征空间的维度降低,常用于图像检索、分类等任务。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

