You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

采用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:45:14