python实现jpeg压缩(rgb到YCbCr)
1.JPEG编码过程
1.1流程
RGB转YCbCr:因为人眼对亮度比较敏感,而对于色度不那么敏感,所以,我们就先将RGB的数据转换到YCbCr色彩空间,便于下面的处理。
降采样:转到YCbCr色彩空间后,就可以将 Cb 和 Cr 这两个通道进行降采样,这里一般是将 2*2 个像素变为 1*1 个像素,虽然分辨率下降到了四分之一,但对于人眼来说差别是不大的。(这一步是有损的)
分块:顾名思义,将图像分为若干个 8*8 的小块,方便下面的处理。
DCT:这一步的目的和RGB转YCbCr有一些相似之处,都是将人眼较为敏感和不敏感的部分进行分离,然后就可以对减少人眼不敏感的部分的信息量。在这一步中,DCT可以将图像的低频(人眼敏感)和高频(人眼不敏感)部分进行分离。这样得到的结果是每个 8*8 小块得到 8*8 的系数矩阵。
量化:将DCT后得到的每个系数都除以量化矩阵中对应的值,然后进行取整。通常来说频率较高的部分对应的量化参数比较大,这样一来就能够在较好地保留图像的低频部分并去除一些高频部分。这一步下来得到的矩阵中高频部分几乎全部变为0,这也为进一步的操作提供了便利。值得注意的是,JPEG中压缩率的调整是在这一步中,量化参数越大,压缩后的大小就会越小,但信息的损失也就越多,图片的失真也会更严重。(这一步是有损的)
Huffman编码:准确地说是Huffman编码和RLE,将上一步得到的矩阵进行进一步地压缩(这一步是无损的)。量化后得到的矩阵左上角的那个数比其他数来得大得多,所以我们将它单独拿出来进行编码,称之为直流分量(DC),将剩下的称之为交流系数(AC)。这一步会将矩阵按照 zigzag 的顺序摊成一维,这样做的好处是矩阵的高频部分(右下角)会被安排在后面,因为它们基本上全是0,所以在编码中有一个特殊的标记表示这之后的系数全是0,从而减少压缩后的大小。
2.JPEG解码过程
2.1流程
解码过程是编码过程的逆过程。
3.效果图
压缩后图像出现失真现象,失真的主要出现在压缩算法的降采样和量化步骤。
原图
压缩后,解码效果图
4.PSNR计算结果
一般来说,PSNR高于40dB说明图像质量极好(即非常接近原始图像),在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),在20—30dB说明图像质量差。
图像压缩后,psnr计算结果29.634010562060844。
5.压缩效果
压缩前文件大小为769KB,压缩后文件大小为96KB。
附件1:
标准亮度分量量化表:
16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 |
标准色度分量量化表:
17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 |
Zig编码表:
0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 |
Zag编码表:
0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 41, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63 |
python实现jpeg压缩(rgb到YCbCr)相关推荐
- 数字图像处理100问—40 JPEG 压缩——第四步:YCbCr+离散余弦变换+量化
提示:内容整理自:https://github.com/gzr2017/ImageProcessing100Wen CV小白从0开始学数字图像处理 40 JPEG 压缩--第四步:YCbCr+离散余弦 ...
- JPEG压缩的Python实现过程 -- 1图像压缩概念
现如今互联网上绝大部分图片都使用了JPEG压缩技术,也就是大家使用的jpg文件,通常JPEG文件相对于原始图像,能够得到1/8的压缩比,如此高的压缩率是如何做到的呢?图像压缩是指什么呢?JPEG图像时 ...
- JPEG压缩matlab实现
请注意:本文代码参考用MATLAB实现JPEG压缩过程 原作者为新浪博客:dzh_漫漫修行路 文章目录 JPEG原理流程 源代码 JPEG原理流程 1.色彩空间转换及相应预处理 在进行JPEG 压缩之 ...
- 【转】JPEG压缩原理
第一章 图像压缩编码的综述 1.1 图象压缩的目的和方法 图象的数字化表示使得图象信号可以高质量地传输,并便于图像的检索.分析.处理和存储.但是数字图像的表示需要大量的数据,必须进行数据的压缩. ...
- JPEG压缩如何工作?
转译自:https://www.impulseadventure.com/photo/jpeg-compression.html 当试图重新保存数码照片时,人们经常会面临使用"质量设置&qu ...
- 转载的JPeg压缩文档(很好,易懂)
作者:云风 时间: 2006-07-20 文档类型:原创 来自:云风工作室 写在前面 1. 为什么写这个文档? 云风想对 JPEG/MPEG 有一个系统的研究, 但是苦于找到好的资料. 而英文水平又不 ...
- JPEG压缩基本原理
JPEG算法的第一步是将图像分割成8X8的小块. 在计算机中,彩色图像最常见的表示方法是RGB格式,通过R(Red).G(Green)A和(Blue)组合出各种颜色. 除此以外,还有一种表示彩色图像的 ...
- JPEG压缩学习笔记
JPEG压缩学习及其C语言实现笔记 JPEG压缩流程 1.颜色转换(RGB->YUV) 2.DCT变换 (分块8*8进行DCT变换) 3.量化(-996, 19, 0, 2,0, 0, 0, 0 ...
- RGB转YCbCr算法 之Matlab FPGA实现介绍
1.引言 虽然现在RGB是计算机视觉最基本的三原色组成结构,但是YCbCr也有非常重要的角色,甚至却之不可,理由如下: 1)很多机器视觉,图像处理/检测识别算法,不关注色彩,只需要在灰度域处理即可: ...
最新文章
- javadrawstring设置字符大小_LaTex学术写作——编辑文档格式 设置论文标题与摘要...
- 用html5做一个简单的作品,html5 canvas 简单画板实现代码
- 三次握手和四次挥手图解_图解TCP三次握手和四次挥手
- Python 内嵌函数运用(探究模块)
- Linux-重装系统之静态ip配置
- 信息安全系统设计基础第八周学习总结
- hdu 3836 Equivalent Sets
- RedEngine11
- C# TCP服务器和客户端
- react-native环境配置——Android工程搭建
- 我读《DOOM启世录》——成为一个真正厉害的人
- 交通大数据干货总结(1)
- misc 小小小试牛刀
- android调用系统录制视频教程,Android开发之使用MediaRecorder录制视频,android视频录制...
- 钉钉审批流API接口
- Fugiat inventore earum unde officia nihil ratione.Аллея развитый юный сынок угроза голубчик.
- 软件系统等保方案,市政项目,投标项目必须
- HTTP/HTTPS账号密码获取
- 红米4android7.0,红米4能刷android7,0系统吗
- thinkphp5使用容联发送短信验证码