风景是如何一步步变成jpeg图像的?

作为一个摄影爱好者,我们经常用相机记录生活中的美好,现在数码照片已经随处可见,但是你有没有想过,大自然中的风景,是如何一步一步变成我们电脑里存储的jpeg图像的呢?

Step1:从景物到像

我们之所以能够看见物体,是由于物体在我们的视网膜上成了像,我们的眼睛就像一个凸透镜,让物体成像:


凸透镜成像原理

初中我们学过这个凸透镜的光路图:

如果焦距以 f 表示,那么:

  • 当物距u满足u>2f,像距v满足f<v<2f的时候,物体会成一个倒立缩小的实像(实像可以用光屏接收)。人眼以及照相机就是应用了这个原理。

我们看到的东西之所以不是倒立的,是由于我们强大的大脑,但是为什么我倒立的时候看到的东西是倒立的(而不可以像iphone那样重力感应呢)?这估计需要进大脑的设置,调整一下。

照相机也是应用了这个原理:

Step 2:从像到相机sd卡里的图片

要将物体成的像记录下来,这就需要一个类似光屏的东西,在数码相机中,这个光屏就是CCD或者CMOS,其实他们就是一种传感器,当有像成在他们上时,他们相当于受到一刺激,接着敏感元件就会做出反应,转换元件将这一信号转换为数字信号,最终将数字信息存储在相机的sd卡里。


像素

要理解像是如何被CCD或CMOS接收的,就需要了解像素。

像素是衡量数码相机的最重要指标。像素指的是数码相机的分辨率。它是由相机里的光电传感器上的光敏元件数目所决定的,一个光敏元件就对应一个像素。因此像素越大,意味着光敏元件越多,相应的成本就越大。

我们可以简单理解一个光敏元件可以将一个很小区域的图像映射为0-255的一个数值。光敏元件越多,像素越大,假设现在有6*6=36个光敏元件,那么它的实际像素就是36。

但是这样的一个映射只能描述一张灰度图,怎么才能记录一张彩色图呢?

我们知道,红黄蓝三原色的组合可以构成整个色彩空间(就像笛卡尔坐标系中的基矢量):

于是很自然想到,我们把图像分为R,G,B三层,每一层对应一幅灰度图,三层叠加起来就是一幅彩色图:

现在问题来了,以前的相机只有一张CCD或CMOS(现在的有些相机有3层CCD或CMOS,分别接收R,G,B的光线),怎么才能接收3种颜色的光线呢?

最简单的办法就是,一些光敏元件接收R的信息,另一些接收G的信息,还有一些接收B的信息:

由于人眼对绿色光比较敏感,所以RGB的光敏元件数量比一般是1:2:1。

这时我们再来看看此时的像素,实际上的像素应该不再是6*6,但是相机中有插值的功能,中间缺失的那些值,相机可以通过好的插值模拟出来。

硬件(光敏元件数量)决定了照片的真实像素,软件(插值算法)决定了照片能达到的最大像素,iphone照片之所以好看,不是由于它的硬件有更多的光敏元件,而是由于它的插值算法比其他家的牛逼。

Step3 :从raw格式到jpeg格式

一般相机里存储的是raw格式的照片,而在网络上我们经常见到的确是jpeg格式的照片,那么raw格式是怎么变成jpeg格式的呢?

在电脑中,jpeg是一种针对照片视频而广泛使用的一种有损压缩标准方法,它的目的当然就是在尽量少的减小图像清晰度的前提下,尽量减少图像的存储大小。

那么我们该怎样减少呢?从前面的介绍可以看出,现在的图像是三张灰度图的叠加,而每张灰度图就是每个元素都是0-255的一个矩阵,就像这样:

想要将他的存储空间减小,其实就是将上面矩阵中的值都减小,甚至让其等于零。但是显然不能直接除以一个系数,这样对图像的影响太大,那又该怎么做呢?

色彩空间转换

首先,图像需由RGB(红绿蓝)转换为一种称为YUV的不同的色彩空间。其中:

  • Y成分表示一个像素的亮度

  • U成分表示一个像素的色调

  • V成分表示一个像素的饱和度

色彩空间的转换就像是坐标变换,从RGB这三个基矢量变到了YUV这三个基矢量,那么为什么要进行转换呢?

这是因为人类的眼睛对于亮度差异的敏感度高于色彩变化。变换后的Y成分包含了大量图像信息,而U成分和V成分却不这么重要,我们就可以适当减小U和V成分。

离散余弦变换(Discrete cosine transform)

还记得傅里叶变换吗?

在时域中杂乱无章的曲线(红色),在频域中可能就是间歇的几个值,所以换个角度看问题,可能可以看到不同的风景。

同样的,既然在这一大堆数值中看不出什么门道,那就做变换,这个变换就是DCT变换(离散余弦变换)

为什么要做DCT变换?这是由于离散余弦变换具有很强的'能量集中'特性:大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分。

实际操作时,我们将Y,U和V分量的灰度矩阵划为8*8的一个个子区域:

对于每个8*8子区域,假设这个区域为:

接着推移128,使其范围变为 -128~127,得到结果为:

且接着使用离散余弦变换,和舍位取最接近的整数,得到结果为:

左上角之相当大的数值称为DC系数(直流系数);其他63个值称为AC系数(交流系数)。

经过DCT变换后,低频部分集中在每个8*8块的左上角,高频部分在右下角,所谓JPEG的有损压缩,损的是量化过程中的高频部分。为什么呢?因为有这样一个前提:低频部分比高频部分要重要得多,romove 50%的高频信息可能对于编码信息只损失了5%。

量化

人类眼睛在一个相对大范围区域,辨别亮度上细微差异是相当的好,但是在一个高频率亮度变动之确切强度的分辨上,却不是如此地好。这个事实让我们能在高频率成分上极佳地降低信息的数量。简单地把频率领域上每个成分,除以一个对于该成分的常数就可完成,且接着舍位取最接近的整数。这是整个过程中的主要有损运算。以这个结果而言,经常会把很多更高频率的成分舍位成为接近0,且剩下很多会变成小的正或负数。

所谓量化就是用DCT变换后的矩阵元素值除以量化表对应值所得的结果。由于量化表左上角的值较小,右下角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。

假设现在的量化矩阵为:

使用这个量化矩阵与前面所得到的DCT系数矩阵,得到结果为:

举个例子,使用−415(DC系数)且舍位得到最接近的整数:

现在,只需存储3个(分别对应YUV通道)这种矩阵(里面有大量元素为0),就能存储和原图像非常近似的图像,但是大小却比原图像小了很多。

解码

现在,如果需要显示出图像,那就需要经历以上所有过程的逆过程:
我们取刚才最后得到的DCT系数矩阵

现在,将他乘以前面的量化矩阵,得到:

再对这个矩阵使用反向DCT变换,得到:

最后,再将每个元素加128,得到:

现在,你可以将这个矩阵和我们的原始矩阵比较,如果将每个元素和原始矩阵中对应元素相减,得到误差值:

每个像素大约是5的平均绝对误差,也就是说:

数值差异看着不够直观?现在,我们来看看这两个8*8矩阵到底有多不同

原始图像:

解码后图像:

可以看出:误差在左下角显而易见,左下方的像素变得比它邻近右方的像素还更暗。不过这对有损压缩来说已经很不错了。

总结

风景映入视网膜,留在了我们眼里,同样的道理(凸透镜成像),风景映入光敏元件,再经过插值,成了sd卡里的RGB色彩空间里的三个矩阵。为了将图像压缩,我们将RGB色彩空间变换为YUV色彩空间,再经过离散余弦变换将图像的高低频信号分开,再用量化矩阵(相当于低通滤波器)肆意的略去高频信号,就得到最终的jpeg图像啦。

参考文献

傅里叶分析之掐死教程
傅里叶变换
RGB color model
JPEG
凸透镜
数码相机
JPEG压缩原理

以上文章观点仅代表文章作者,仅供参考,以抛砖引玉!

END

(0)

相关推荐