尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Haar小波变换图像压缩实战:Python/OpenCV 3步实现,PSNR 35dB+
Haar小波变换图像压缩实战Python/OpenCV 3步实现35dB高质量压缩当我们需要在有限存储空间保存高分辨率图像时图像压缩技术显得尤为重要。传统JPEG压缩在较高压缩比时会出现明显的块状伪影而基于Haar小波变换的压缩方法能更好地保留图像边缘和纹理细节。本文将带您用Python和OpenCV三步实现PSNR超过35dB的高质量图像压缩。1. Haar小波变换核心原理与优势Haar小波作为最早被提出的小波函数因其计算简单且支持快速实现成为图像处理领域的经典选择。其基本函数由以下两个部分组成尺度函数父小波φ(x) 1 (0≤x1)小波函数母小波ψ(x) {1 (0≤x0.5), -1 (0.5≤x1)}在图像处理中二维Haar小波变换通过行列分离计算实现def haar_2d_transform(img): # 行变换 row_avg (img[:, 0::2] img[:, 1::2]) / 2 row_diff (img[:, 0::2] - img[:, 1::2]) / 2 # 列变换 col_avg (row_avg[0::2, :] row_avg[1::2, :]) / 2 col_diff (row_avg[0::2, :] - row_avg[1::2, :]) / 2 return col_avg, col_diff, row_diff[::2, :], row_diff[1::2, :]与传统DCT变换相比Haar小波具有三大独特优势特性DCT变换Haar小波变换局部适应性固定8x8分块全图多尺度分析高频处理整体丢弃高频分层阈值控制压缩伪影明显方块效应边缘平滑过渡提示Haar小波特别适合处理具有明显边缘和纹理的图像如建筑摄影、医学影像等2. 三步实现图像压缩的完整流程2.1 图像分解与多级小波变换我们先实现多级小波分解每级分解产生四个子带import cv2 import numpy as np def multi_level_decomposition(img, level3): coeffs [] current img.astype(np.float32) for _ in range(level): ll, lh, hl, hh haar_2d_transform(current) coeffs.append((lh, hl, hh)) current ll coeffs.append(ll) return coeffs分解后的系数分布呈现金字塔结构LL低频近似分量保留主要能量LH水平细节分量HL垂直细节分量HH对角细节分量2.2 阈值处理与系数量化通过阈值处理去除不重要的高频系数是实现压缩的关键步骤def threshold_coeffs(coeffs, threshold15): new_coeffs [] for c in coeffs: if isinstance(c, tuple): # 高频子带 new_subbands [] for sub in c: mask np.abs(sub) threshold sub[mask] 0 new_subbands.append(sub) new_coeffs.append(tuple(new_subbands)) else: # 低频子带 new_coeffs.append(c) return new_coeffs阈值选择直接影响压缩质量和压缩比阈值越大 → 压缩比越高 → 质量越低阈值越小 → 压缩比越低 → 质量越高2.3 小波重构与图像恢复重构过程是分解的逆操作def inverse_haar_2d_transform(ll, lh, hl, hh): # 列重构 row_avg np.zeros((ll.shape[0]*2, ll.shape[1])) row_avg[0::2, :] ll lh row_avg[1::2, :] ll - lh # 行重构 reconstructed np.zeros((row_avg.shape[0], row_avg.shape[1]*2)) reconstructed[:, 0::2] row_avg hl reconstructed[:, 1::2] row_avg - hl return reconstructed def multi_level_reconstruction(coeffs): current coeffs[-1] for i in range(len(coeffs)-2, -1, -1): current inverse_haar_2d_transform(current, *coeffs[i]) return np.clip(current, 0, 255).astype(np.uint8)3. 性能优化与质量评估3.1 压缩比与PSNR计算我们定义两个关键指标评估压缩效果def calculate_metrics(original, compressed): # 计算压缩比 orig_size original.nbytes comp_size len(pickle.dumps(compressed)) ratio orig_size / comp_size # 计算PSNR mse np.mean((original - compressed) ** 2) psnr 10 * np.log10(255**2 / mse) return ratio, psnr典型测试结果对比阈值压缩比PSNR(dB)视觉质量描述108:138.2几乎无失真2015:135.7轻微模糊3022:132.1明显纹理损失5035:128.4严重模糊边缘锯齿3.2 自适应阈值优化固定全局阈值可能导致部分区域过度压缩。改进方案def adaptive_threshold(coeffs): new_coeffs [] for level, c in enumerate(coeffs[:-1]): adaptive_thresh 10 * (level 1) # 随分解层级增加阈值 new_subbands [] for sub in c: sub[np.abs(sub) adaptive_thresh] 0 new_subbands.append(sub) new_coeffs.append(tuple(new_subbands)) new_coeffs.append(coeffs[-1]) return new_coeffs这种分层阈值策略能在保持高频细节的同时有效提升压缩比。4. 进阶技巧与工程实践4.1 色彩空间优化处理对于彩色图像推荐先在YCrCb空间处理def compress_color_image(img, level3, threshold15): ycrcb cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) channels [multi_level_decomposition(ycrcb[:,:,i], level) for i in range(3)] compressed [threshold_coeffs(c, threshold) for c in channels] reconstructed [multi_level_reconstruction(c) for c in compressed] result cv2.merge(reconstructed) return cv2.cvtColor(result, cv2.COLOR_YCrCb2BGR)4.2 实际应用中的参数调优通过网格搜索寻找最优参数组合def find_optimal_params(img): best_psnr 0 best_params {} for level in [2, 3, 4]: for threshold in [10, 15, 20, 25]: coeffs multi_level_decomposition(img, level) compressed threshold_coeffs(coeffs, threshold) reconstructed multi_level_reconstruction(compressed) _, psnr calculate_metrics(img, reconstructed) if psnr best_psnr: best_psnr psnr best_params {level: level, threshold: threshold} return best_params典型图像的最优参数范围自然风景level3, threshold12-18文本图像level2, threshold8-12医学影像level4, threshold5-10
RELATED

相关推荐

质点强迫振动 MATLAB/Simulink 仿真:3种阻尼比(Qm值)下的幅频响应曲线绘制

质点强迫振动 MATLAB/Simulink 仿真:3种阻尼比(Qm值)下的幅频响应曲线绘制

质点强迫振动 MATLAB/Simulink 仿真:3种阻尼比(Qm值)下的幅频响应曲线绘制 在机械振动与声学系统分析中,强迫振动现象的研究具有核心地位。无论是桥梁的防风设计、精密仪器的隔振方案,还是扬声器的频响优化&#xff0c…

📅 2026/9/5 1:00:43
Codex 找不到 gpt-5.6 怎么办?

Codex 找不到 gpt-5.6 怎么办?

若您的 Codex 程序没有 gpt-5.6 可以尝试更新: 1. cli 直接更新 npm install -g openai/codex ,使用/model 切换. 2. codex app需要更新成 Chatgpt. 3. Vscode : 1).按下快捷键Win R,打开左下脚运行窗口,输入以…

📅 2026/8/22 20:12:58
3分钟完成安装!免费Chrome视频下载插件完整使用指南

3分钟完成安装!免费Chrome视频下载插件完整使用指南

3分钟完成安装!免费Chrome视频下载插件完整使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到过这样的情况&…

📅 2026/9/10 3:51:26
MORE NEWS

更多资讯

📰

Orleans 虚拟 Actor 模型收益与权衡详解:稳定身份、轮次执行与可组合的运行时服务

后端微服务 【免费下载链接】orleans Cloud Native application framework for .NET 项目地址: https://gitcode.com/gh_mirrors/or/orleans 点击查看 免费下载 虚拟 Actor(Virtual Actor)编程模型是 Orleans 作为 .NET 云原生框架&#xff…

📰

Flink 应用参数处理:使用 ParameterTool 管理配置输入的完整指南

大数据流处理批处理数据工程 【免费下载链接】flink 项目地址: https://gitcode.com/gh_mirrors/fli/flink 点击查看 免费下载 在 Flink 中,无论是批处理还是流处理应用,几乎都依赖外部配置参数来驱动运行:它们用于指定输入输出源…

📰

FX3U PLC与绝对值编码器通讯实战:ADPRW与RS2指令详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

高通骁龙865 QPST刷机全攻略:从EDL模式到救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Redwood 环境变量完全指南:Web 端与 API 端的加载、注入与安全实践

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 Redwood 应用由 API(Node.js 目标)与 Web(浏览器目标)两个固定 Side 组成…

📰

Hermes Agent 定时自动化实战:cron 定时任务 + 技能编排 + MCP 网关配置

Hermes Agent 不只是个 CLI,它能配置定时任务(cron)、把重复流程固化成技能(Skill)、还能通过 MCP 网关把工具开放给外部调用。很多人卡在"怎么让它每天定时跑、怎么复用技能、怎么在线程里编排多个子任务"。本文用可跑配置带你从零搭一套定时自动化流水线。## …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬