数字图像处理(1):JPEG分析 & 实践(C语言)

在这里插入图片描述
生命短暂而信息无穷……缩写是无法避免的灾难,而缩写创造者的任务就是要尽力做好工作。尽管缩写有害,但总比什么都不做强。 ——阿道斯· 赫胥黎

1. JPEG格式

JPEG是Joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为".jpg"或".jpeg",是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。

但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。而且 JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。


2. JPEG原理&压缩流程

原理可简单理解为:把数据分为“重要部分”和“不重要部分”,滤掉不重要的部分。

2.1 步骤一:图像分割

JPEG算法的第一步,图像被分割成大小为8X8的小块,这些小块在整个压缩过程中都是单独被处理的。

2.2 步骤二:颜色空间转换RGB->YCbCr

Y表示亮度(Luminance),Cb和Cr分别表示绿色和红色的“色差值”。 有损压缩首先要做的事情就是“把重要的信息和不重要的信息分开”,YCbCr恰好能做到这一点。对于人眼来说,图像中明暗的变化更容易被感知到,这是由于人眼的构造引起的。

2.3 步骤三:离散余弦变换

数据经过DCT变化后,被明显分成了直流分量和交流分量两部分,为后面的进一步压缩起到了充分的铺垫作用,可以说是整个JPEG中最重要的一步。

2.4 步骤四:数据量化

JPEG提供的量子化算法如下:
在这里插入图片描述
量化后的二维矩阵转变成一个一维数组。

2.5 步骤五:哈弗曼编码

根据数据中元素的使用频率,调整元素的编码长度,以得到更高的压缩比。


3. 下载实现代码并调通运行

3.1 测试平台

在这里插入图片描述
平台:VS2015 语言:C++

3.2 测试图片

在这里插入图片描述
图片信息:
weiminglake.bmp
34.8 MB
(36,578,360 字节)
分辨率:4032*3024
位深度:24

3.3 压缩后输出图片

在这里插入图片描述
图片信息:
out.jpg
1.48 MB
(1,558,067 字节)
分辨率:4032*3024
位深度:24

4. 压缩率

1,558,067 / 36,578,360 * 100% = 4.26%

附:代码

mian.c

#include <stdio.h>
#include "jpeg_encoder.h"

int main(int argc, char* argv[])
{
    const char* inputFileName = "weiminglake.bmp";
    JpegEncoder encoder;
    if(!encoder.readFromBMP(inputFileName))
        return 1;
    if(!encoder.encodeToJPG("out.jpg", 50))
        return 1;
    return 0;
}

代码来源:https://thecodeway.com/blog/?p=69


本工程源码已更新至github,欢迎star,欢迎PR:)

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值