JPEG有损图像压缩编码器(附源码)

概述

一个基本由自己实现的JPEG有损图像压缩编码器,基于JFIF(JPEG文件交换格式)标准:

  • 色彩空间转换(RGB to YUV)
  • 色度抽样(采样因子4:2:0)
  • MCU分块(16x16的最小编码单元,以Y1 Y2 Y3 Y4 U V的顺序写入比特流)
  • DCT离散余弦变换
  • 量化(基于50%压缩质量的亮度/色度量化表)
  • 熵编码
    • 游程编码(RLE编码)
    • 可变长整数编码(VLI编码)
    • 范式霍夫曼编码(基于JPEG官方推荐的四张范式霍夫曼表)
  • JPEG文件头构建及比特输出流写入

要注意的是,该项目并未完全实现JPEG编码器的全部功能,在这个项目中:

  • 文件的读入和RGB色彩空间的读取仍然是基于ImageIO库来实现的
  • 由范式霍夫曼表构建霍夫曼树参照了该项目目录下thirdparty/JpegEncoder.java的代码

此外:

  • 本项目仅实现了JFIF标准要求的基本压缩算法,JPEG还支持许多其他的压缩算法(如熵编码部分还可以采用算术编码等)
  • 本项目是基于SOF0(baseline基线式JPEG)的,此外还有一种SOF2(progressive渐进式JPEG)的编解码方式

详述

写完这个项目,感觉最难写的反而是熵编码部分,色彩空间转换、离散余弦变换、量化这三步在中文互联网上已经有足够详细的介绍了,也有现成的公式可以套用,但是分块(MCU)这一点很多资料都没有提及到,这直接关系到最后写入比特流时的编码顺序问题,而熵编码部分同样有大量细节没有阐述,这一步骤三种编码方式结合在一起而且压缩后的数据流过于抽象难以调试纠错。

看到中文互联网上的JPEG编码教程大多漏过了许多细节,打算写一篇尽可能详细的文章来帮助后人避免踩同样的坑。

JPEG编码过程详解

展示

原图(knowledge.bmp)

在这里插入图片描述

输出图(out.jpg)

在这里插入图片描述

压缩比

在这里插入图片描述

黑历史

一些在熵编码步骤遇到的各种神必输出图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

多模态第2篇:MMGCN代码配置

一、Windows环境 1.创建并激活虚拟环境 #创建虚拟环境命名为mmgcn,指定python版本为3.8 conda create -n mmgcn python3.8 #激活虚拟环境 conda activate mmgcn2.安装pytorch #torch2.0.0 cu118 pip install torch2.0.0cu118 torchvision0.15.1cu118 torchaudio…

PACS系统源码:支持三维重建功能、集成放射科管理RIS系统、图文报告编辑、打印、多级审核机制

PACS系统源码 PACS系统是以最新的IT技术为基础,遵循医疗卫生行业IHE/DICOM3.0和HL7标准,开发的多功能服务器和阅片系统。通过简单高性能的阅片功能,支持繁忙时的影像诊断业务,拥有保存影像的院内Web传输及离线影像等功能&#xf…

【雕爷学编程】MicroPython动手做(11)——搭建掌控板IDE开发环境四种

为了能够打好基础,系统学习MicroPython,特地入手了二块掌控板 知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通…

【Docker 学习笔记】Docker架构及三要素

文章目录 一、Docker 简介二、Docker 架构1. Docker 客户端和服务器2. Docker 架构图3. Docker 运行流程图 三、Docker 三要素1. 镜像(Image)2. 容器(Container)3. 仓库(Repository) 一、Docker 简介 Dock…

2.4 传统经验光照模型详解

一、光照模型 光照模型(illumination model),也称为明暗模型,用于计算物体某点处的光强(颜色值)。从算法理论基础而言,光照模型分为两类:一种是基于物理理论的,另一种是…

【MATLAB第61期】基于MATLAB的GMM高斯混合模型回归数据预测

【MATLAB第61期】基于MATLAB的GMM高斯混合模型回归数据预测 高斯混合模型GMM广泛应用于数据挖掘、模式识别、机器学习和统计分析。其中,它们的参数通常由最大似然和EM算法确定。关键思想是使用高斯混合模型对数据(包括输入和输出)的联合概率…

<Doc>Windows常见的doc命令

一:管理员身份运行cmd命令: 方式一:搜索框输入cmd,回车,点击:以管理员身份运行 出现如图所示: 方式二:快捷键运行方式: 1.按winr,在运行窗口中输入cmd。 …

JavaSE类和对象(重点:this引用、构造方法)

目录 一、类的定义方式以及实例化 1.面向对象 Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在Java的世界里一切皆为对象。 2.类的定义和使用 1.在java中定义类时需要用到class关键字 3.类的实例化 4.类实例化的使用 二、this引用 …

Java API指南:掌握常用工具类与字符串操作

文章目录 1. API简介2. Java API的使用2.1 创建和使用Java API工具类2.2 使用String类进行字符串操作 结语 导语: Java作为一门功能强大的编程语言,其成功之处不仅在于语法结构的简洁明了,更因为其丰富的API(Application Programm…

中药配方煎药-亿发智能中药汤剂煎煮系统,智慧中药房的数字化升级

随着中药的普及,在治病、养生等方面都发挥这积极作用,但中药煎煮过程繁琐,如果有所差错将会影响药品的药性。为了满足当今用户对中药的需求,增强生产效率和业务水平,亿发中药煎配智能管理系统应运而生,为用…

【JMeter】JMeter添加插件

目录 一、前言 二、插件管理器 三、推荐插件 1.Custom Thread Groups (1)Ultmate Thread Group (2)Stepping Thread Group 2.3 Basic Graph 资料获取方法 一、前言 ​ 在我们的工作中,我们可以利用一些插件来帮…

github gitlab 多用户多平台切换

一、背景 我需要用账号1 来登录并管理github 账号 我需要用账号2 来登录并管理gitlab 账号 二、设置账号 邮箱 设置账号1用户名与邮箱 git config --global user.name "miaojiang" git config --global user.email "187133163.com" 三、生成本地密钥…

中小企业如何低成本实施MES管理系统

中小企业在市场竞争中需要有高效的管理体系来支持其运营和发展。中小企业MES管理系统是一种先进的管理系统,可以提升工厂智能化水平,提高生产效率,是中小企业必须采取的有效管理工具。然而,由于资金和技术的限制,中小企…

反转链表(JS)

反转链表 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3&…

MySQL初探

Background 通过阅读小林coding,大致了解了mysql数据库的种种特点,与之前学的数据库实现大体思路相同,感觉学习不能停留在理论层面,要调研生产级别的中间件实现。 一条代码运行在mysql上的流程 1. 连接的过程需要先经过 TCP 三次…

php://filter绕过死亡exit

文章目录 php://filter绕过死亡exit前言[EIS 2019]EzPOP绕过exit 参考 php://filter绕过死亡exit 前言 最近写了一道反序列化的题,其中有一个需要通过php://filter去绕过死亡exit()的小trick,这里通过一道题目来讲解 [EIS 2019]EzPOP 题目源码&#…

C语言每日一题:9.《数据结构》链表的中间节点+链表的倒数第k个节点。

第一题: 题目链接: >思路一: 1.第一遍遍历链表,直到找到尾结束第一次遍历,遍历的过程中记录链表长度。定义长度为k。 2.确定中间是第几个节点,计算是k/21根据题目要求。 3.再一次去遍历我们的数组&…

实战!聊聊工作中使用了哪些设计模式

实战!聊聊工作中使用了哪些设计模式 策略模式 业务场景 假设有这样的业务场景,大数据系统把文件推送过来,根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码: if(type"A"){//按照A格式解析}else if(t…

Electron逆向调试

复杂程序处理方式: 复杂方式通过 调用窗口 添加命令行参数 启动允许调用,就可以实现调试发布环境的electron程序。 断点调试分析程序的走向,程序基本上会有混淆代码处理, 需要调整代码格式,处理程序。

基于 Docker 的深度学习环境:Windows 篇

本篇文章,我们聊聊如何在 Windows 环境下使用 Docker 作为深度学习环境,以及快速运行 SDXL 1.0 正式版,可能是目前网上比较简单的 Docker、WSL2 配置教程啦。 写在前面 早些时候,写过一篇《基于 Docker 的深度学习环境&#xff…