数字图像处理——图像压缩
背景
图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。
技术总览
当下图像压缩JPEG几乎一统天下,本文主要依据其原理,进行解析。
工作流总览
- 颜色空间(YUV)下采样
- 分块DCT
- 依据量化表进行DCT量化
- zigzag扫描
- RLE编码
- Huffman编码
- 上述过程反向进行,解压缩
颜色空间下采样
关于YUV空间一些基础知识:
https://zhuanlan.zhihu.com/p/587189669https://zhuanlan.zhihu.com/p/587189669其中Y空间也称灰度空间,直方图均衡化、灰度拉伸等操作就是基于这个空间进行的,很多时候,为了图像处理的简洁,经常在该空间上进行操作。
将颜色空间RGB转化为YUV之后,由于人眼主要对Y(亮度)敏感,而对UV空间不敏感,所以可以对UV空间进行下采样,(这里对UV空间体积分别缩小到原来的1/4),以512 * 512尺寸的RGB图片为例。仅一步颜色空间下采样,存储空间就压缩为了原本的
(512*512 + 256*256 + 256*256)/ 512*512*3 = 1/2
分块DCT
关于dct的一些相关知识⬇️
https://zhuanlan.zhihu.com/p/85299446https://zhuanlan.zhihu.com/p/85299446dct将空域转化成等价的频域, 在频域中,人眼对高频的信息不敏感,那么如果略去高频,保留低频,则实现了图像的有损压缩。
dct仅仅是一步变换而已,并不对图像构成压缩,真正起到压缩效果的是量化 + 编码(也即接下来两步)
为何分块?
全局dct当然可以完成任务,并且压缩效果依旧十分优异。但分块后的好处是明显的
从空间上来说:有固定分块更容易研究量化表,读者仔细思考就会发现,对于任意尺寸的dct二维数组,去用函数生成量化表是困难的,但是如果行业定下一个固定的dct二维数组尺寸,大家就可以尽情研究这个条件下什么样的量化表效果会比较好。
从时间上来说:进行分块后,计算的总体时间比整体计算快很多。在此之外,对于8*8分块的dct,也有很多研究其快速算法的,ANN算法就是其中典例。
DCT矩阵量化
这一步的根本目标就是把DCT的高频部分消去。
具体的计算步骤为,DCT矩阵的元素处以量化矩阵的对应位置元素
读者的困惑应该大多在于量化表的生成。 关于这一点,对于任意M*N尺寸的图片,其量化表可以设计一个指数函数去表达, 其中k的值应当偏小,对于512 * 512的lena图来说,笔者尝试值为0.4效果较佳。当然,如果真使用幂函数,记得在最外加上1,防止在0位置除0
Zigzag扫描
JPEG图像压缩探索_zigzag扫描(原创)-CSDN博客文章浏览阅读2k次。文章详细介绍了DCT变换后如何使用zigzag扫描算法将图像数据从高频到低频有序地转化为一维数据,以便于后续的霍夫曼编码等操作。该方法允许在不知原始二维数据边长的情况下,将二维数据转换为一维并能恢复原状。文中还提供了Java代码示例来实现这一过程。https://blog.csdn.net/cjzjolly/article/details/129158254
借上方博客图一用,zigzag扫描顺序如上图所示,其中“扫描”的目的是为了把二维数组转一维数组,方便进一步编码压缩,采用“zigzag”顺序的理由是,这样扫描让尽可能多的‘0’ 靠在了一起,为随后的RLE编码提供基础。
RLE编码
关于该编码,下边这篇讲的挺不错。
https://zhuanlan.zhihu.com/p/1892905961586405848https://zhuanlan.zhihu.com/p/1892905961586405848经过RLE之后,就把重复很多的0给去除了 (其实这一点的效用和Huffman编码稍微有点打架,因为如果没有RLE,在量化后DCT矩阵的Huffman编码中,最主要能节省的空间就是重复的0)
Huffman编码
Huffman编码的知识⬇️
Huffman 编码原理详解(代码示例)_霍夫曼解码原理-CSDN博客文章浏览阅读2.9w次,点赞19次,收藏47次。本文介绍了Huffman编码的基本原理,包括路径长度、带权路径长度等概念,并详细阐述了Huffman树的构造过程及其编码实现。通过实例展示了如何选择最优二叉树以获得最短编码。https://blog.csdn.net/qinglongzhan/article/details/80982067关于该编码压缩空间的机理:
我们知道一个int在存储空间占用4个字节 32位, 但是如果使用编码的方式以字节流存入,则根本用不了32位,在解码的时候只需保留Huffman的编码表即可。
在调试这一段代码的实践中笔者其实废了挺多力气,因为按字节流存入,再读取的时候由于不清楚大端读还是小端读导致调试的一头雾水。
解码过程
整体的解码过程,按上方流程反过来走一遍即可达成完整解码的效果。
相关文章:
数字图像处理——图像压缩
背景 图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下ÿ…...

验证器回调中value值没有数据
复杂的响应式,导致回调中value值没有数据,最终还是通过手动判断获取值处理 原理没有搞清楚,为什么回调中value没有值背景:动态增加了form表单的字段,通过for循环处理的。对每个新增的字段还要添加字段验证其。就出现了…...

Python | 需求预测模型
目录 需求预测 1.方法选择 2.颗粒度选择 3.在医药行业的应用 预测模型 1.模型对比 2.Prophet 3.Holt-Winters 需求预测 1.方法选择 方法 适用范围分类移动平均法中小企业、SKU较少的卖家低成本预测方案Excel趋势线预测中小企业、SKU较少的卖家低成本预测方案季节性系数法中小企…...

双指针算法:原理与应用详解
文章目录 一、什么是双指针算法二、双指针算法的适用场景三、双指针的三种常见形式1. 同向移动指针2. 相向移动指针3. 分离指针 四、总结 一、什么是双指针算法 双指针算法(Two Pointers Technique)是一种在数组或链表等线性数据结构中常用的高效算法技…...

打造灵感投掷器:我的「IdeaDice」开发记录
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起源:我只是想“摇”出点灵感 有时候面对写作或者做产品设计,我会卡在「不知道从哪开始…...

2025ICPC邀请赛南昌游记
滚榜时候队伍照片放的人家的闹麻了,手机举了半天 。 最后银牌700小几十罚时,rank60多点。 参赛体验还行,队长是福建人,说感觉这个热度是主场作战哈哈哈哈。空调制冷确实不太行吧。 9s过A是啥,没见过,虽然…...

python重庆旅游系统-旅游攻略
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...

MySQL企业版免费开启,强先体验
近期Oracle突然宣布,MySQL企业版面向开发者免费开放下载,这一消息瞬间引爆DBA圈。作为数据库领域的“顶配车型”,企业版长期因高昂授权费让中小团队望而却步,如今免费开放无异于“劳斯莱斯开进菜市场”。 本文将深度拆解企业版的…...
从纸质契约到智能契约:AI如何改写信任规则与商业效率?——从智能合约到监管科技,一场颠覆传统商业逻辑的技术革命
一、传统合同的“低效困境”:耗时、昂贵、风险失控 近年来,全球商业环境加速向数字化转型,但合同管理却成为企业效率的“阿喀琉斯之踵”。据国际商会(International Chamber of Commerce)数据显示,全球企业…...
常见的 HTTP 接口(请求方法)
一:GET 作用:从服务器获取资源(查询数据)。特点: 请求参数通过 URL 传递(如https://api.example.com/users?id123),参数会显示在地址栏中。不修改服务器数据,属于幂等操…...
iOS 抓包实战:从 Charles 到Sniffmaster 的日常工具对比与使用经验
iOS 抓包实战:从 Charles 到抓包大师 Sniffmaster 的日常工具对比与使用经验 抓包这件事,不是高级黑客才要做的。作为一名移动端开发,我几乎每天都要和网络请求打交道,尤其是 HTTPS 请求——加密、重定向、校验证书,各…...
Lodash isEqual 方法源码实现分析
Lodash isEqual 方法源码实现分析 Lodash 的 isEqual 方法用于执行两个值的深度比较,以确定它们是否相等。这个方法能够处理各种 JavaScript 数据类型,包括基本类型、对象、数组、正则表达式、日期对象等,并且能够正确处理循环引用。 1. is…...

Qt Widgets模块功能详细说明,基本控件:QCheckBox(三)
一、基本控件(Widgets) Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QCheckBox 1.1、概述 (用途、状态、继承关系) QCheckBox 是 Qt 框架中的复选框控件,用于表示二…...

第四天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下,我昨天看白色巨塔电视剧,看的入迷了,同时也看出一些道理,学到东西; 但是把昨天的写事情给忘记了,今天…...
【git进阶】git rebase(变基)
git rebase有很多用武之地,我一一道来 合并分支 当多人协作同一个分支时,在提交我们自己版本之前,我们会先用git pull获取远端最新的版本。但是 git pull = git fetch + git mergegit merge是一个非线性的合并操作,大量的merge会造成日志线的分散和交错。实际上 git pu…...

WPS中代码段的识别方法及JS宏实现
在WPS中,文档的基本结构可以通过对象模型来理解: (1)Document对象:表示整个文档 (2)Range对象:表示文档中的一段连续区域,可以是一个字符、一个句子或整个文档 &#…...

小米MUJIA智能音频眼镜来袭
智能眼镜赛道风云再起,小米新力作MIJIA智能音频眼镜2正式亮相,引发市场热议。 这款产品在设计和功能上都有显著提升,为用户带来更舒适便捷的佩戴体验,同时也标志着小米在智能眼镜领域的持续深耕。 轻薄设计,舒适体验 …...
【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散
引言部分 在深度学习领域,生成对抗网络(GAN)是一种强大的数据生成方法,它通过生成器(G)和判别器(D)之间的博弈来不断优化模型。然而,在实际训练过程中,GAN 往…...

基于SpringBoot的家政预约系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
[服务器备份教程] Rclone实战:自动备份数据到阿里云OSS/腾讯云COS等对象存储
更多服务器知识,尽在hostol.com 各位服务器的守护者们,咱们都知道,数据是数字时代的“黄金”,而服务器上的数据更是我们业务的命脉。可天有不测风云,硬盘可能会突然“寿终正寝”,手滑执行了“毁灭性”命令…...
使用 Whisper 生成视频字幕:从提取音频到批量处理
生成视频字幕是许多视频处理任务的核心需求。本文将指导你使用 OpenAI 的 Whisper 模型为视频文件(如电视剧《Normal People》或电影《花样年华》)生成字幕(SRT 格式)。我们将从提取音频开始,逐步实现字幕生成…...

Axure难点解决分享:垂直菜单展开与收回(4大核心问题与专家级解决方案)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…...

Linux:网络层的重要协议或技术
一、DNS DNS(Domain Name System)是一整套从域名映射到IP的系统 1.1 DNS的背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆. 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系. 最初,…...
【Hadoop 实战】Yarn 模式上传 HDFS 卡顿时 “No Route to Host“ 错误深度解析与解决方案
🌟 飞哥带你攻克 Hadoop 网络通信难题 大家好,我是小飞!最近在大数据集群运维中遇到一个典型问题:使用 Yarn 模式向 HDFS 上传大文件时进度条卡住不动,查看日志发现关键报错: No Route to Host from BigDat…...

JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received.
环境: vllm 0.8.5 java 17 Qwen3-32B-FP8 问题描述: JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…...

基于 CSS Grid 的网页,拆解页面整体布局结构
通过以下示例拆解网页整体布局结构: 一、基础结构(HTML骨架) <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…...
华为云Astro轻应用创建业务对象(BO)的概念梳理
目录 一、业务对象(BO)是什么?——【详细概念解释】 二、形象理解业务对象(BO) 🍱 类比方式: 📦 举个具体例子:以做一个“智能烟雾报警系统”应用 三、为什么使用BO很重要? 四、小结: 一、业务对象(BO)是什么?——【详细概念解释】 在华为云Astro轻应用…...
利用systemd启动部署在服务器上的web应用
0.背景 系统环境: Ubuntu 22.04 web应用情况: 前后端分类,前端采用react,后端采用fastapi 1.具体配置 1.1 前端配置 开发态运行(启动命令是npm run dev),创建systemd服务文件 sudo nano /etc/systemd/…...
ArkUI Tab组件开发深度解析与应用指南
ArkUI Tab组件开发深度解析与应用指南 一、组件架构与核心能力 ArkUI的Tabs组件采用分层设计结构,由TabBar(导航栏)和TabContent(内容区)构成,支持底部、顶部、侧边三种导航布局模式。组件具备以下核心特…...

psotgresql18 源码编译安装
环境: 系统:centos7.9 数据库:postgresql18beta1 #PostgreSQL 18 已转向 DocBook XML 构建体系(SGML 未来将被弃用)。需要安装 XML 工具链,如下: yum install -y docbook5-style-xsl libxsl…...