当前位置: 首页 > article >正文

用Python和NumPy手把手实现SVD图片压缩:从原理到实战,5分钟搞定你的第一张压缩图

用Python和NumPy手把手实现SVD图片压缩从原理到实战5分钟搞定你的第一张压缩图当你第一次听说奇异值分解这个名词时脑海中是不是立刻浮现出一堆复杂的数学公式别担心今天我们要用最直观的方式——图片压缩带你领略SVD的神奇魅力。想象一下只需几行Python代码就能让一张几MB的照片瘦身到原来的几分之一而肉眼几乎看不出差别。这就是SVD在图像处理中的魔法。1. 准备工作搭建你的Python环境在开始之前确保你的电脑上已经安装了以下Python库pip install numpy pillow matplotlib这些库将帮助我们完成整个图片压缩流程NumPy处理矩阵运算的核心工具PillowPILPython图像处理的标准库Matplotlib用于显示和对比压缩前后的图片效果提示如果你使用Anaconda这些库通常已经预装好了。让我们先创建一个新的Python文件比如svd_image_compression.py然后导入必要的库import numpy as np from PIL import Image import matplotlib.pyplot as plt2. 理解SVD的核心思想奇异值分解SVD的本质是将任何矩阵A分解为三个特殊矩阵的乘积A U × Σ × V^T其中U左奇异向量矩阵包含图像的行空间信息Σ对角矩阵对角线上的奇异值按从大到小排列V^T右奇异向量矩阵的转置包含图像的列空间信息为什么这能用于图片压缩因为图像数据中大部分能量都集中在前面几个大的奇异值上。通过只保留前k个最大的奇异值我们可以用更少的数据近似表示原始图像。3. 加载并预处理图片让我们从加载一张图片开始。你可以使用任何你喜欢的图片这里我们以一张常见的测试图片为例def load_image(image_path): 加载图片并转换为NumPy数组 img Image.open(image_path) img_array np.array(img) return img_array # 加载图片 original_img load_image(test_image.jpg) print(f图片形状: {original_img.shape}) # 输出类似 (height, width, 3)彩色图片通常有三个通道红、绿、蓝每个通道都是一个二维矩阵。为了处理方便我们需要将这三个通道分开# 分离RGB通道 red_channel original_img[:, :, 0] green_channel original_img[:, :, 1] blue_channel original_img[:, :, 2]4. 实现SVD压缩函数现在让我们编写核心的压缩函数。这个函数将对单个颜色通道进行SVD分解并根据指定的压缩比例保留相应数量的奇异值def compress_channel(channel, k): 压缩单个颜色通道 U, s, VT np.linalg.svd(channel, full_matricesFalse) # 只保留前k个奇异值 compressed_U U[:, :k] compressed_S np.diag(s[:k]) compressed_VT VT[:k, :] # 重建压缩后的通道 compressed_channel compressed_U compressed_S compressed_VT # 确保像素值在0-255范围内 compressed_channel np.clip(compressed_channel, 0, 255) return compressed_channel.astype(uint8)5. 完整图片压缩流程现在我们可以将各个部分组合起来实现完整的图片压缩流程def compress_image(image_path, k_percentage0.5): 压缩图片并显示结果 # 加载原始图片 original_img load_image(image_path) # 分离通道 red original_img[:, :, 0] green original_img[:, :, 1] blue original_img[:, :, 2] # 确定保留的奇异值数量 k int(min(red.shape) * k_percentage) print(f保留前{k}个奇异值 (压缩比例: {k_percentage*100:.0f}%)) # 压缩各通道 compressed_red compress_channel(red, k) compressed_green compress_channel(green, k) compressed_blue compress_channel(blue, k) # 合并通道 compressed_img np.stack([compressed_red, compressed_green, compressed_blue], axis2) # 计算压缩率 original_size original_img.nbytes compressed_size (U[:, :k].nbytes s[:k].nbytes VT[:k, :].nbytes) * 3 # 三个通道 compression_ratio compressed_size / original_size # 显示结果 plt.figure(figsize(10, 5)) plt.subplot(1, 2, 1) plt.title(Original Image) plt.imshow(original_img) plt.axis(off) plt.subplot(1, 2, 2) plt.title(fCompressed (Ratio: {compression_ratio:.2f})) plt.imshow(compressed_img) plt.axis(off) plt.show() return compressed_img6. 不同压缩比例的效果对比让我们尝试不同的压缩比例看看效果如何# 测试不同压缩比例 for ratio in [0.9, 0.7, 0.5, 0.3, 0.1]: _ compress_image(test_image.jpg, ratio)你会发现一个有趣的现象即使只保留30%的奇异值图片质量仍然相当不错。这是因为能量集中前几个大的奇异值包含了图像的大部分信息视觉冗余人眼对高频细节的敏感度较低颜色通道相关性三个颜色通道之间存在一定的相关性7. 高级技巧与优化7.1 自动确定最优k值我们可以根据奇异值的累积能量自动确定保留多少奇异值def auto_determine_k(s, energy_threshold0.9): 自动确定保留的奇异值数量 total_energy np.sum(s) cumulative_energy np.cumsum(s) / total_energy k np.argmax(cumulative_energy energy_threshold) 1 return k7.2 批量处理图片文件夹如果你有一批图片需要压缩可以这样处理import os def batch_compress(input_folder, output_folder, k_percentage0.5): 批量压缩文件夹中的所有图片 os.makedirs(output_folder, exist_okTrue) for filename in os.listdir(input_folder): if filename.lower().endswith((.jpg, .jpeg, .png)): try: img_path os.path.join(input_folder, filename) compressed_img compress_image(img_path, k_percentage) # 保存压缩后的图片 output_path os.path.join(output_folder, fcompressed_{filename}) Image.fromarray(compressed_img).save(output_path) except Exception as e: print(f处理 {filename} 时出错: {e})7.3 存储优化实际存储时我们可以进一步优化def save_compressed_components(U, s, VT, output_path): 存储SVD分解后的组件 np.savez_compressed( output_path, UU, ss, VTVT ) def load_compressed_components(input_path): 加载SVD组件并重建图片 data np.load(input_path) return data[U], data[s], data[VT]8. 实际应用中的注意事项图片格式选择JPEG适合自然场景照片有损压缩PNG适合线条图、文字无损压缩WebP现代格式更好的压缩率性能考量大图片可以先缩小尺寸再处理对于实时应用考虑使用近似算法质量评估指标PSNR峰值信噪比SSIM结构相似性主观视觉评估def calculate_psnr(original, compressed): 计算PSNR值 mse np.mean((original - compressed) ** 2) if mse 0: return float(inf) max_pixel 255.0 psnr 20 * np.log10(max_pixel / np.sqrt(mse)) return psnr9. 超越基础SVD在其他领域的应用虽然我们聚焦于图片压缩但SVD的应用远不止于此推荐系统用户-物品评分矩阵分解发现潜在特征自然语言处理潜在语义分析LSA文档主题建模信号处理噪声去除特征提取计算机视觉人脸识别特征脸方法背景建模10. 进一步学习的资源如果你想深入了解SVD及其应用可以参考经典教材《线性代数及其应用》by Gilbert Strang《矩阵计算》by Gene H. Golub在线课程MIT OpenCourseWare 线性代数课程Coursera上的机器学习专项课程实用工具库SciPy的稀疏矩阵SVDTensorFlow/PyTorch中的SVD实现在实际项目中我发现最有效的学习方式是将理论知识与实践相结合。尝试用不同的图片、不同的压缩比例进行实验观察效果变化你会对SVD有更直观的理解。

相关文章:

用Python和NumPy手把手实现SVD图片压缩:从原理到实战,5分钟搞定你的第一张压缩图

用Python和NumPy手把手实现SVD图片压缩:从原理到实战,5分钟搞定你的第一张压缩图 当你第一次听说"奇异值分解"这个名词时,脑海中是不是立刻浮现出一堆复杂的数学公式?别担心,今天我们要用最直观的方式——图…...

世界第一个开源可商用 .NET Office 转 PDF 工具/库 - MiniPdf涝

1. 智能软件工程的范式转移:从库集成到原生框架演进 在生成式人工智能(Generative AI)从单纯的文本生成向具备自主规划与执行能力的“代理化(Agentic)”系统跨越的过程中,.NET 生态系统正在经历一场自该平台…...

Rust的std--ptr--addr_of!:直接获取字段地址绕过对齐检查

Rust的std::ptr::addr_of!:直接获取字段地址绕过对齐检查 Rust作为一门注重内存安全的系统级编程语言,其严格的编译时检查机制在大多数情况下能有效避免未定义行为。在某些底层场景中,开发者可能需要绕过这些限制,直接操作内存地…...

【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---HITL(Human In The Loop)讣

插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能,现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包,包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件&#xff0…...

CYBER-VISION零号协议实战:从零到一搭建智能助盲眼镜目标分割系统

CYBER-VISION零号协议实战:从零到一搭建智能助盲眼镜目标分割系统 1. 项目背景与核心价值 想象一下,当你走在繁忙的街道上,眼前的一切都是模糊不清的。这就是视障人群每天面临的挑战。传统的导盲杖只能提供有限的触觉反馈,而CYB…...

TrackingNet在线评估全流程指南:从注册到结果查看(附常见问题解决)

TrackingNet在线评估全流程指南:从注册到结果查看(附常见问题解决) 在计算机视觉领域,目标跟踪算法的性能评估是研究过程中不可或缺的一环。TrackingNet作为业内广泛使用的基准测试平台,为研究人员提供了标准化的评估环…...

中文新闻文本分类实战:从 TextCNN → BiLSTM → BERT 三档方案对比(附完整代码)

任务:中文新闻文本分类(如 THUCNews,10/14 类) 目标:给出可直接复现的三种主流方案,实现 对比1. 数据准备 以 THUCNews 为例(每行:label \t text) import torch from to…...

从暴力枚举到高效剪枝:回溯法求解0-1背包的优化之路

1. 从暴力枚举开始:回溯法的原始形态 第一次接触0-1背包问题时,很多人会本能地想到暴力枚举。假设我们有15件物品,每件物品都有选或不选两种可能,那么总共有2^1532768种组合需要检查。这种思路虽然简单直接,但效率极其…...

Go语言的sync.Cond条件变量与通道关闭在广播通知中的语义差异

Go语言中,sync.Cond条件变量与通道关闭均能实现广播通知,但两者在语义和适用场景上存在显著差异。条件变量基于锁的协作机制,适合复杂同步逻辑;而通道关闭则依赖Go的CSP模型,以无锁方式实现轻量级广播。理解二者的差异…...

【限时公开】SITS2026实验室未发布数据:92.7%的商用大模型API在无防护下3.8秒内被FGSM变体攻破?

第一章:SITS2026专家:大模型对抗攻击防护 2026奇点智能技术大会(https://ml-summit.org) 在大模型规模化部署的背景下,对抗样本攻击正从学术威胁演变为真实业务风险——微小扰动即可导致LLM输出恶意指令、泄露训练数据或绕过安全护栏。SITS…...

【2026奇点大会前瞻】:大模型视觉理解的5大技术断层与3个月落地攻坚指南

第一章:2026奇点大会视觉理解技术演进全景图 2026奇点智能技术大会(https://ml-summit.org) 2026奇点大会首次系统性地整合了多模态感知、神经符号推理与具身视觉学习三大范式,标志着视觉理解正从“识别”迈向“可解释因果建模”。本届大会展示的视觉架…...

仅限前500名技术决策者获取:2026奇点大会《大模型工具调用成熟度评估矩阵》(含9维打分表+自测链接)

第一章:2026奇点智能技术大会:大模型工具调用 2026奇点智能技术大会(https://ml-summit.org) 工具调用范式的根本性演进 在2026奇点智能技术大会上,大模型工具调用(Tool Use)已从早期的提示工程驱动,跃迁…...

【GPT-5时代生存指南】:为什么92%的企业微调失败?2026奇点大会首席科学家亲授4步精准对齐法

第一章:GPT-5时代企业微调失败的系统性归因 2026奇点智能技术大会(https://ml-summit.org) 在GPT-5模型架构全面转向混合专家(MoE) 动态稀疏激活范式后,传统基于全参数微调(Full Fine-tuning)或LoRA适配器…...

技术决策中的信息收集与分析判断

技术决策中的信息收集与分析判断:构建智能决策的核心支柱 在数字化时代,技术决策的质量直接影响企业的竞争力和发展潜力。无论是选择技术架构、开发工具,还是评估新兴技术的可行性,信息收集与分析判断都是决策过程中的关键环节。…...

Langchain Agent实战避坑:用通义千问调用高德API,我踩过的异步和工具定义那些坑

Langchain Agent实战避坑指南:异步调用与工具定义的那些坑 在构建基于Langchain的智能代理时,异步调用和工具定义是两个最容易让开发者踩坑的领域。本文将分享我在使用通义千问模型调用高德API过程中遇到的实际问题及其解决方案。 1. 异步调用的常见陷阱…...

【限时技术白皮书】全球首批通过MLPerf Inference v4.0弹性测试的6套扩缩容配置模板(含Qwen3-72B/Gemma3-27B实测参数)

第一章:大模型工程化自动化扩缩容策略 2026奇点智能技术大会(https://ml-summit.org) 大模型服务在生产环境中面临显著的负载波动:推理请求可能在秒级内激增数倍,而空闲时段又需快速释放资源以控制成本。工程化自动化扩缩容并非简单复用传统…...

GLM-OCR Python API调用详解:5行代码集成OCR能力到业务系统

GLM-OCR Python API调用详解:5行代码集成OCR能力到业务系统 1. 项目概述与核心价值 GLM-OCR是一个基于先进多模态架构的高性能OCR识别模型,专门为复杂文档理解而设计。与传统的OCR工具不同,它不仅能够识别普通文字,还能智能解析…...

为什么你的vLLM吞吐量比竞品低37%?,深度拆解基准测试套件中被忽略的3层时序对齐机制(含CUDA Graph级采样代码)

第一章:大模型工程化性能基准测试套件的范式演进 2026奇点智能技术大会(https://ml-summit.org) 大模型工程化已从单点推理验证迈入全栈协同优化阶段,性能基准测试套件不再仅关注吞吐量与延迟,而是系统性覆盖模型编译、显存调度、分布式通信…...

Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析

Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析 1. 为什么选择VMware部署Qwen3-TTS? 在本地部署AI模型时,环境隔离和资源管理常常让人头疼。VMware虚拟机提供了一种优雅的解决方案,特别适合像Qwen3-TTS这样的语音生成…...

软件数据可视化中的图表选择原则

在数据驱动的时代,软件数据可视化成为解读复杂信息的核心工具。选择合适的图表类型,不仅能清晰传达数据背后的故事,还能避免误导或信息冗余。面对多样化的数据场景,如何科学选择图表?以下是几个关键原则的详细解析。 …...

G-Helper:告别华硕笔记本卡顿耗电的轻量级控制神器

G-Helper:告别华硕笔记本卡顿耗电的轻量级控制神器 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar,…...

Java 虚拟机垃圾回收机制详解

Java虚拟机垃圾回收机制详解 在Java开发中,垃圾回收(Garbage Collection, GC)是自动管理内存的核心机制,它让开发者无需手动释放内存,有效避免了内存泄漏和悬垂指针等问题。理解JVM的垃圾回收机制,不仅有助…...

用 Microsoft Agent Framework 构建 SubAgent(Multi-Agent)卤

本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)…...

如何快速实现Unity游戏自动翻译:终极配置指南

如何快速实现Unity游戏自动翻译:终极配置指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏的语言障碍而烦恼吗?XUnity自动翻译器为你提供了一整套完整的游戏界面…...

Rust的匹配中的通配符模式与剩余模式在元组解构中的组合使用技巧

Rust作为一门注重安全与性能的系统级编程语言,其模式匹配机制为开发者提供了强大的表达能力。在元组解构中,通配符模式与剩余模式的组合使用尤其值得关注,它们能显著提升代码的简洁性与灵活性。本文将深入探讨这一技巧的实用场景,…...

CCF中学生计算机程序设计(提高篇)电子版

->入门篇<- ->基础篇<- ->CSP-S核心讲义<- 这本书可以为C的同学提供帮助&#xff0c;都给你免费还不点赞关注 –>CCF中学生计算机程序设计&#xff08;提高篇&#xff09;.pdf –>网页浏览 通过网盘分享的文件&#xff1a;代码源全套入门提高 链接…...

《SRE:Google 运维解密》读书笔记03: SRE 理念 - 从“零故障”到“理性风险”

作者: andylin02 学习章节&#xff1a;第2章 SRE 理念 关键词&#xff1a;SRE定义、软件工程、50%规则、对事不对人、自动化、简化 一、引言&#xff1a;当软件工程师开始做运维 传统的运维&#xff08;Ops&#xff09;模式通常会陷入一个死循环&#xff1a;系统越复杂&#x…...

《SRE:Google 运维解密》读书笔记02: 介绍 - SRE的起源与核心理念

作者: andylin02 学习章节&#xff1a;第1章 介绍 关键词&#xff1a;SRE起源、系统管理员模式、Dev vs Ops矛盾、错误预算、50%规则、自动化 一、引言&#xff1a;一场关于“快”与“稳”的战争 在上一本书的共读中&#xff0c;我们循序渐进地学习了从风险管理到监控、从消除…...

Rust的#[repr(align)]编程需求

Rust作为一门注重安全与性能的系统级编程语言&#xff0c;提供了精细控制内存布局的能力。其中&#xff0c;#[repr(align)]属性是一个强大的工具&#xff0c;允许开发者显式指定数据类型的对齐方式。这一特性在需要与硬件交互、优化性能或满足特定协议时尤为重要。本文将深入探…...

通义千问3-Reranker-0.6B应用指南:快速搭建智能问答排序服务

通义千问3-Reranker-0.6B应用指南&#xff1a;快速搭建智能问答排序服务 1. 引言&#xff1a;为什么选择Qwen3-Reranker-0.6B 在信息爆炸的时代&#xff0c;如何从海量文本中快速找到最相关的内容成为一大挑战。Qwen3-Reranker-0.6B作为通义千问家族的最新成员&#xff0c;专…...