2026/2/17 12:22:33
网站建设
项目流程
江苏省 建设 注册中心网站首页,wordpress列表页分页,如何打开用wordpress,网站制作出名的公司在前面几篇文章中#xff0c;我们谈了SVD的基本原理#xff0c;从几何角度用二维坐标展示了SVD的拉伸和旋转。现在通过一张具体的图片来看看SVD是如何处理矩阵的。
下图展示的是#xff1a;把一张 256256 的灰度图当成一个矩阵 A#xff0c;做 SVD 分解后#xff0c;只保…在前面几篇文章中我们谈了SVD的基本原理从几何角度用二维坐标展示了SVD的拉伸和旋转。现在通过一张具体的图片来看看SVD是如何处理矩阵的。下图展示的是把一张256×256 的灰度图当成一个矩阵 A做 SVD 分解后只保留前 k 个奇异值以及对应的左右奇异向量就能得到一张“压缩/降噪后的近似图”。图片分析这张图片是一个2x2的网格图展示了同一张灰度图像一位戴帽子的女性侧脸照在不同奇异值保留数量下的效果演示了奇异值分解SVD在图像压缩中的应用。图像尺寸看起来是256x256像素基于坐标轴从50到250步长50原图有256个奇异值这在方阵图像中常见因为最小维度决定最大奇异值数量。左上Original Image 256 singular values这是原始图像细节清晰包括女性的头发卷曲、帽子纹理、眼睛和面部表情都锐利可见。没有压缩保留所有奇异值因此图像质量最高但数据量最大。右上retaining 20 singular values只保留前20个最大的奇异值图像严重模糊几乎看不清细节只有大致轮廓如帽子形状和脸部大体位置。这展示了低秩近似导致的信息丢失适合极致压缩但牺牲质量。左下retaining 50 singular values保留前50个奇异值图像清晰度有所改善能辨认出头发、眼睛和帽子的基本结构但仍有噪点和模糊细节如羽毛纹理不清晰。这是一个中等压缩水平平衡了文件大小和可读性。右下retaining 85 singular values保留前85个奇异值图像质量进一步提升几乎接近原图能清楚看到面部表情、头发细节和帽子边缘。只有细微的模糊或噪点这表明85个奇异值已捕捉到大部分图像信息压缩效率高。总体来说随着保留奇异值数量增加图像从模糊到清晰过渡证明SVD可以有效压缩图像而保留主要特征。原图可能是一个经典的测试图像如Lena图像的变体用于展示低秩逼近的效果。压缩率可以粗略估计对于256x256图像原数据量约65KB假设8-bit灰度保留k个奇异值时存储需求约为k(2562561)U的k列、V的k行、Σ的k值例如k20时压缩到约10%大小。1) 图像为什么能做 SVD灰度图可以看成矩阵行 垂直方向的像素位置列 水平方向的像素位置矩阵元素 像素灰度值0~255SVD 把它分解成其中U一组“纵向模式”256 个长度为 256 的正交向量V一组“横向模式”Σ对角线上的奇异值表示“每个模式的重要程度/能量”更直观的写法是“很多张 rank-1 图的叠加”每一项 都像一张“基础纹理/阴影层”把它们加起来就还原原图。2) 为什么“只保留前 k 个”会得到模糊但像的图保留前 k 个就是性质很关键这是所有 rank-k 矩阵里对原图误差最小的近似Eckart–Young 定理。直觉大的奇异值通常对应“整体结构”脸的轮廓、明暗大块、帽子形状等低频信息小的奇异值更像“细节与高频”发丝、边缘锐利变化、纹理噪声等所以k 小 ⇒ 只剩大结构 ⇒更平滑、更糊k 大 ⇒ 细节回来 ⇒更接近原图3) 读图20 / 50 / 85 的区别在说什么你图里四张Original image 256 singular values用了全部 256 个奇异值理论上可完整重建原图。retaining 20 singular values只用 20 个“最重要层”。你会看到主体还在但明显糊细节几乎没了还会出现一些“条带/块状”的感觉——这是因为只用少量 rank-1 外积叠加表达能力有限。retaining 50 singular values轮廓更稳五官更清楚一些但纹理仍弱。retaining 85 singular values已经相当像原图了边缘和头发细节明显恢复。4) 这为什么能“压缩”原图需要存 256×25665536 个数。如果只保留 k 个奇异值需要存256×kk256×k总量约举例忽略额外开销与量化k20513×20 10260约是原来的 15.7%k5025650约 39.1%k8543605约 66.5%所以 k 越小压缩越狠但越糊。实际做图像压缩还会配合量化、整数编码、分块处理避免全局 SVD 太贵等。5) SVD 在图像处理里的典型应用A) 低秩压缩你图展示的就是用较小 k 存储/传输重建时用。B) 去噪Denoising噪声往往更分散在“小奇异值”里把小的截掉相当于做一种“全局平滑但尽量保结构”的去噪。C) 特征提取 / 降维PCA 的亲戚把图像或图像块看作高维向量SVD/ PCA 提取主成分用于人脸识别Eigenfaces、检索、聚类等。D) 背景建模/前景分离视频里很常见一段视频帧堆成矩阵后低秩部分≈稳定背景稀疏部分≈运动前景这思路会发展到 RPCA。6) 选 k 的常用办法比“拍脑袋”更稳用“能量占比”选 k比如选到 90% / 95% 能量为止就能在“清晰度”和“压缩率”之间做可解释的折中。我们把这张图背后的“每一层到底是什么”、以及怎么选 k、为什么会有条纹/鬼影讲透一点。1) “保留前 k 个”到底在做什么SVD 给你 是一个256×1 列向量纵向的权重分布是一个1×256 行向量横向的权重分布外积得到一张256×256 的 rank-1 图它的像素值形如 “纵向强度 × 横向强度”所以它本质上是一个“纵向模式”和“横向模式”相乘出来的二维图案。再乘上决定这一层加进去有多强。所以你可以把图像理解成很多张“非常简单的二维图案层”叠加起来前几层负责大轮廓和大明暗后面很多层负责细节、锐利边缘、纹理、噪声。2) 为什么 k20 会“糊 条带/鬼影”糊只剩低频结构前 20 个奇异值对应的层通常只能很好表达大块明暗平滑的阴影过渡主体的大轮廓细节发丝、边缘锐度、细纹理需要更多层来“拼”出来所以被砍掉就糊。条带/鬼影rank-1 层的“乘法结构”太简单单个 这层是“纵向×横向”的乘积图案容易出现沿某些方向的条纹看起来像“有一层半透明影子叠在上面”当你只叠 20 层时这些简化结构还没被足够多的层“互相抵消/补齐”所以视觉上更明显。随着 k 增大50、85更多层加入结构表达能力增强这些伪影就弱了。3) k 越大为什么“细节会回来”边缘和细纹理属于高频信息灰度变化更快、更复杂。表达这种复杂变化需要更多自由度也就是需要更多的 rank-1 层去组合。可以这样理解k 就像“用多少块乐高搭出这张图”20 块能搭出大轮廓但细节没法搭85 块细节开始像样256 块完全复刻4) 选 k 的更靠谱方法看“能量占比”常用指标解释可以看成第 i 个模式贡献的“能量”。经验90% 能量通常结构很清楚但细节略软95% 能量视觉更接近原图99% 能量几乎看不出差别但压缩优势变小5) SVD 做压缩到底省了多少原图存 256×25665536 个数。保留 k 个时需要存256k256kk总计约 513k所以k2010260约 15.7%k5025650约 39.1%k8543605约 66.5%这就是图里“20 很糊但压缩狠85 很清但压缩一般”的根本原因。6) SVD 去噪为什么“砍小奇异值”能去噪把噪声想成“到处乱抖的细小变化”它不太能形成强的、稳定的全局模式会分散在很多小的 σi 上所以你截断到 k保留大 σ ⇒ 保留主要结构丢掉小 σ ⇒ 丢掉很多噪声成分但注意细节也会一起被当成“高频”砍掉所以去噪往往伴随变糊。7) 彩色图怎么做彩色图是 3 个通道R/G/B最简单对每个通道分别做 SVD 截断更高级把通道联合起来做低秩模型但实现更复杂我们把SVD 的“第 i 层”单独拿出来看你就会立刻明白为什么前 20 个像“模糊大轮廓”后面的像“细节/噪声”。1) 每一层是什么一张 rank-1 的“纹理图”对灰度图矩阵 A定义第 i 层也叫第 i 个“模式/成分”是“纵向权重”每一行该多亮 是“横向权重”每一列该多亮外积 的结构决定了这层图像 纵向形状 × 横向形状所以它天然像“条带/渐变/大块阴影”而不是复杂细节。把前 k 层叠加就是近似图2) 单独看每一层时你会看到什么很直观第 1 层最大奇异值通常长得像整张图的“主光照 主轮廓”亮暗大块很明显类似一个“柔和的整体阴影模型”人脸/帽子/背景的主形状会隐约出现非常平滑、几乎没细节这就是为什么只保留很少的奇异值时图还能“认得出来是谁”但会很糊。第 210 层重要结构补充会开始出现更具体的轮廓强化帽檐弧线、脸部边界某些方向性的变化比如斜向的明暗分割仍然偏“平滑”但结构更像原图第 1050 层中频信息纹理开始出现你会看到头发的成团纹理、衣服/背景的局部起伏边缘更锐一些但还不是真正“发丝级”细节有时会呈现“局部条纹/波纹”样式正常因为 rank-1 层很像可分离的条纹组合第 50 之后高频细节 噪声越往后越像很细碎的纹理、边缘抖动类似“噪点/颗粒”对人眼来说贡献变小但对“锐利感”有用这也解释了SVD 截断能去噪但也会把细节一起当成“高频”砍掉。3) 为什么你会在低 k 图里看到“鬼影/条带”因为你只叠加了少数几张 Ci而每张 Ci 本身结构很“简单”纵向×横向容易留下方向性痕迹。当 k 增大时更多层加入这些痕迹被其它层补偿/抵消图就更自然。4) 实际“怎么看每一层”显示时要注意两件事正负号问题很重要和 同时乘以 -1不变所以每层的明暗“正负”没有绝对意义。因此你可能看到某一层是“反相”的——这是正常的。幅度跨度巨大前几层数值很大后几层很小。要把每层显示成图通常会对 Ci 做归一化比如把它线性缩放到 0~255否则后面的层几乎全黑。5) 你可以用一个“脑内小实验”秒懂把 C1 想成“拿一张很大的软毛刷把大轮廓涂出来”C2,C3... 想成“换更小的刷子补轮廓和局部阴影”后面很多层“用很细的笔补发丝、颗粒、边缘锐利感”所以只用 20 层有大刷子、少量中刷子 → 能画出人但细节没法画用到 85 层中小刷子足够多 → 细节明显回来了。我们继续把“为什么某些层像横/竖/斜条纹它们到底对应图像里的什么结构”讲清楚。核心点每个 SVD 层 是“纵向模式 × 横向模式”的乘积所以它天然会呈现出方向性纹理。1) 为什么会出现“横条纹 / 竖条纹”看一个 rank-1 层把行当作 y列当作 x如果变化很慢、几乎是常数而起伏很强⇒ 整张图主要随 x 变 ⇒竖向条纹因为同一列内部变化不大列与列差别大如果变化很慢、而起伏很强⇒ 主要随 y 变 ⇒横向条纹直觉“谁在变化条纹就垂直于谁的变化方向”。2) 为什么会出现“斜条纹 / 斜向结构”单个 rank-1 外积本质上还是“可分离”的x 和 y 分开它并不能直接产生一个真正旋转的二维纹理。但你会看到“斜”的原因有两个原因 A叠加效应两层或多层合成斜向如果你把两张“横条纹”和“竖条纹”合在一起或者把不同频率的条纹叠加就能形成看起来像斜的结构类似干涉/摩尔纹的感觉。也就是会比单独的 Ci 更“二维、更复杂”方向感也更丰富。原因 B图像本身有斜向边缘图里帽檐、头发、背景窗框等大量斜线。为了表达这些斜线SVD 必须用很多“可分离的层”去拼这些层在局部叠加后就会显出斜向的增强/减弱区域所以你视觉上会觉得“这一层像斜纹”。3) 每一层到底“对应图像哪里”可以把和当成两个“投影权重”告诉你哪些行更参与这层结构例如脸部高度范围、帽子高度范围告诉你哪些列更参与这层结构例如主体在中间、背景在右侧于是 生成的二维图会在“行权重高 × 列权重高”的区域最明显——也就是这层主要在图的哪个区域“发力”。所以前几层 通常是“低频、平滑” ⇒ 覆盖全局 ⇒ 管大轮廓/大明暗中间层会开始对某些区域更敏感 ⇒ 管局部结构比如脸、帽檐后面层 起伏更快、更碎 ⇒ 管细节、边缘、噪声4) “频率”这个词在这里怎么理解你可以把、想成一维信号起伏次数少 ⇒ 低频 ⇒ 对应平滑变化大块明暗起伏次数多 ⇒ 高频 ⇒ 对应快速变化细纹理、边缘越靠后的奇异向量往往越“抖”所以对应越细的东西。5) 为什么 SVD 压缩会“先保结构后保细节”因为奇异值排序本质是在做“贡献度排序”大 σi这一层能解释掉很多像素能量整体误差下降最多小 σi这一层只能修修补补主要修细节所以当你只保留前 k 个时本质是用最少的层先把误差降得最多这天然会先把“大结构”保住。6) 一个很形象的对比SVD vs JPEG让你更有把握SVD全局对整张图做“全局低秩”擅长保大轮廓代价是容易全局变糊、出现整体性伪影。JPEG分块 DCT把图切成 8×8 小块做频域压缩细节保留更“局部”但会出现块状马赛克。所以工程上很少直接对整张大图做全局 SVD 压缩太贵 伪影全局化更常见是对小块做类似 JPEG 思路或只把 SVD 当作去噪/降维工具而非最终图片压缩格式。