数字图像处理——图像压缩

背景

图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。

技术总览

当下图像压缩JPEG几乎一统天下,本文主要依据其原理,进行解析。

工作流总览

  1. 颜色空间(YUV)下采样
  2. 分块DCT
  3. 依据量化表进行DCT量化
  4. zigzag扫描
  5. RLE编码
  6. Huffman编码
  7. 上述过程反向进行,解压缩

颜色空间下采样

关于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的编码表即可。

在调试这一段代码的实践中笔者其实废了挺多力气,因为按字节流存入,再读取的时候由于不清楚大端读还是小端读导致调试的一头雾水。

解码过程

整体的解码过程,按上方流程反过来走一遍即可达成完整解码的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音视频怎么去掉抖音号水印

你是不是经常遇到这样的烦恼?看到喜欢的抖音视频,想保存下来分享给朋友或二次创作,却被抖音号水印挡住了画面?别着急,今天教你几种超简单的方法,轻松去除水印,高清无水印视频一键保存&#xff0…

RISC-V 开发板 MUSE Pi Pro PCIE 测试以及 fio 崩溃问题解决

视频讲解: RISC-V 开发板 MUSE Pi Pro PCIE 测试以及 fio 崩溃问题解决 板子上有一个m.2的pcie插槽,k1有三个pcie控制器,pcie0和usb3复用一个phy,所以实际开发板就两个,测试的话,上一个nvme硬盘&#xff0c…

超级管理员租户资源初始化与授权管理设计方案

背景说明 在多租户系统中,资源(如功能模块、系统菜单、服务能力等)需按租户维度进行授权管理。超级管理员在创建新租户时,需要初始化该租户的资源授权信息。 两种可选方案 方案描述方案 A:前端传入选中的资源列表创…

stm32week16

stm32学习 十一.中断 4.使用中断 EXTI的配置步骤: 使能GPIO时钟设置GPIO输入模式使能AFIO/SYSCFG时钟设置EXTI和IO对应关系设置EXTI屏蔽,上/下沿设置NVIC设计中断服务函数 HAL库的使用: 使能GPIO时钟:__HAL_RCC_GPIOx_CLK_EN…

什么是RDMA?

什么是RDMA? RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络…

golang 安装gin包、创建路由基本总结

文章目录 一、安装gin包和热加载包二、路由简单场景总结 一、安装gin包和热加载包 首先终端新建一个main.go然后go mod init ‘项目名称’执行以下命令 安装gin包 go get -u github.com/gin-gonic/gin终端安装热加载包 go get github.com/pilu/fresh终端输入fresh 运行 &…

【数据结构篇】链式结构二叉树

目录: 一 二叉链的概念与结构: 1.1 概念: 1.2 结构: 二 二叉链的实现: 2.1 二叉树的构建: 2.2 二叉树的遍历: 2.2.1 前序遍历: 2.2.2 中序遍历: 2.2.3 后序遍历…

【MySQL】02.数据库基础

1. 数据库的引入 之前存储数据用文件就可以了,为什么还要弄个数据库? 文件存储存在安全性问题,文件不利于数据查询和管理,文件不利于存储海量数据,文件在程序中控制不方便。而为了解决上述问题,专家们设计出更加利于…

什么是 Langchain 以及其核心组件

LangChain 官方文档:LangChain 一、什么是Langchain LangChain 是一个用于构建基于LLM的应用框架,它提供了对 LLM API 的封装和扩展,使开发者能够更方便地构建复杂的应用。 个人理解:用类比的方法来说,LangChain类似…

博客系统功能测试

博客系统网址:http://8.137.19.140:9090/blog_list.html 主要测试内容 功能测试、界面测试、性能测试、易用性测试、安全测试、兼容性测试、弱网测试、安装卸载测试、压力测试… 测试方法及目的 利用selenium和python编写测试脚本,对博客系统进行的相关…

项目制作流程

一、使用 CRA 创建项目 npx create-react-app name 二、按照业务规范整理项目目录 (重点src目录) 三、安装插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基础路由 Router 1. 安装路由包 react-router-dom …

ngx_http_random_index_module 模块概述

一、使用场景 随机内容分发 当同一目录下存放多份等价内容(如多张轮播图、不同版本静态页面等)时,可通过随机索引实现负载均衡或流量分散。A/B 测试 通过目录请求自动随机分配用户到不同测试组,无需后端逻辑参与。动态“首页”选…

智能权限守护者:基于Python描述符的动态角色控制实现

智能权限守护者:基于Python描述符的动态角色控制实现 引言:当描述符遇见权限管理 在Python的魔法方法体系中,描述符(Descriptor)以其优雅的属性访问控制机制著称。当我们将描述符与RBAC(基于角色的访问控制)模型结合,就能创造出既灵活又安全的动态权限管理系统。本文…

Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器

目录 1. 回显服务器 -- echo server 1.1 相关函数介绍 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服务端的封装 -- UdpServer.hpp 1.3 服务端代码 -- UdpServer.cc 1.4 客户端代码 -- UdpClient.…

Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函数解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 内核中用于将进程以独占方式加入等待队列的关键函数,其主要功能包括: 标记独占等待:通过设置 WQ_FLAG_EXCLUSIVE 标志,表明此等待条目是独占的。 安全入队:在自旋锁保护下,将条…

【Android构建系统】了解Soong构建系统

背景介绍 在Android7.0之前,Android使用GNU Make描述和执行build规则。Android7.0引入了Soong构建系统,弥补Make构建系统在Android层面变慢、容易出错、无法扩展且难以测试等缺点。 Soong利用Kati GNU Make克隆工具和Ninja构建系统组件来加速Android的…

信息学奥赛一本通 1539:简单题 | 洛谷 P5057 [CQOI2006] 简单题

【题目链接】 ybt 1539:简单题 洛谷 P5057 [CQOI2006] 简单题 【题目考点】 1. 树状数组 模板题及讲解:洛谷 P3374 【模板】树状数组 【解题思路】 解法1:树状数组 该有01构成数组初值都为0。 某位置的元素被修改奇数次后值为1&#x…

仓颉开发语言入门教程:搭建开发环境

仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…

玉米籽粒发育

成熟玉米籽粒的结构 玉米籽粒的组成 成熟的玉米籽粒主要由以下三部分组成: 母体组织:包括种皮、胎座和花梗。种皮由珠被发育而来,起到保护种子的作用,并在种子的休眠和萌发中发挥重要作用。胚:包含根分生组织、茎分…

sherpa-ncnn:音频处理跟不上采集速度 -- 语音转文本大模型

目录 1. 问题报错2. 解决方法 1. 问题报错 报错: An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…