由于存储空间的限制,还有存储器带宽的限制,我们不得不在数字相机上应用图象压缩技术。好在低压缩率的JPEG效果还过得去。现在的相机上大都有分辨率选择功能,比如“Super Fine”、“Fine”等等,但你知道他们使用的压缩率吗?方法之一比较文件大小,比如一部300万像素的机器,8bit x 3 RGB,应该大约是9M的数据,你得到的jpg文件大小是1.8M,那么压缩率就是5:1左右。还有另一方法:Exif信息。Exif实际上是一些放置在jpg文件头部的记录,有一个日文软件“Exif Viewer”可以读出这些数据,用ACDSee也可以:看文件属性的时候有一项叫做“元数据”(Meta Data)的,里面列出了相机记录在图片上的信息,比如机型、时间、光圈快门等等。注意看一项名为“压缩的BPP”(Compressed BPP),它表明每像素所用的bit数。因为8bit、3通道需要24bit表示一个像素,那么用24除以该数就是压缩率了。eg. BPP=5,压缩率=24/5=4.8。一般而言,数字相机大多设置BPP=5作为最高质量,3或者2作为普通质量。
在我关于理想数字相机”的那篇帖子里,我提到了新的JPEG2000压缩算法(下简称jp2),那时我希望10:1的jp2能强过5:1的JPEG(下简称jpg)后来做了些实验,证明在低压缩率(5:1)下jpg与jp2两者在伯仲之间,jp2略微胜出;中等压缩率(10:1)下jp2好;高压缩率(>20:1)时jp2远远好于jpg。下面描述一下我所做的对比实验。
低压缩比的实验比较难做,其原因是难找到细节足够多的原始图片。后来我想了一个方法:在photoshop里先把背景充满噪声(选Filter->Noise->Add Noise),这样的噪声图象包含有丰富的高频分量,不信你用LZW无损压缩的TIFF格式存储一下就知道,它根本无法压缩。基于任何有损压缩都会导致信噪比下降的原理,为了做对比,我们得弄点“信号”上去,用字符工具以纯黑色写一行大字,我用的是字型较复杂的行楷,72点阵的,注意Font Aliasing(反锯齿)要设置为“None”,否则Photoshop会把字型边缘模糊掉,这会影响我们的观察。把此图片存成24bit bmp格式作为我们的原始数据(注意!这只是一种近似的方法,可能不正确!)。然后,用jp2演示软件按5:1、10:1、20:1和50:1分别压缩,再用jpg以同样比率压缩(我用的是ACDSee)。注意保持两者大小尽量相近且jpg文件不小于对应的jp2文件。
对比的时候,请注意观察汉字笔画里有没有杂色点,理想的情况应该是纯黑色并且边缘绝对清楚。在10:1的条件下,jp2和jpg的对比就比较明显了:jp2生成的图片上没有浅色的噪声点,而jpg的图片上的浅色点开始大量出现。5:1时两者看来都没什么浅色点。至于背景上的噪声点的变化比较有意思,jpg的结果似乎比jp2更逼真!前者看起来还是一个个的噪声点,后者则象是局部融化了一样。why?其实我们看到的是在噪声上叠加噪声的情形,jpg的噪声看起来虽然还是噪声,但已经不是原先的信号了,jp2则是严格地砍除高频噪声,这导致其结果比较类似“融化”的效果。在这里我们应该只比较汉字的还原情形。
认真想了一想,我觉得该实验存在一个缺陷。汉字是从TTF字型产生的,也就是通过有限的矢量生成的,那么汉字轮廓本身的高频信息恐怕也很有限。我们这里比较的只是噪声背景在不同压缩算法处理下对图象的影响而已。
至于真实图象的对比,我手头上只有一些5:1的jpg照片,于是只能做10:1以上的实验了。jpg生成的结果在20:1以前还可接受,超过50:1之后就出现大量的色斑;jp2则从10:1到100:1都不会出现大块色斑,只是感觉图象在“漫漫融化”一样。观察可见,低压缩率下jpg似乎比jp2更锐利一些,但当把jp2的结果在Photoshop里适度锐化后便同样锐利,但细节要稍多一些。在超过50:1的高压缩率下jpg所呈现出的色斑会让眼睛感到明显的不舒服,即便远离屏幕眯起眼睛也是如此,jp2看起来则要舒服得多。
在这里我不禁联想起了坛子里旷日持久的德头日头风格之争,这jpg有点象日头,jp2则象德头——人眼所看察觉到的“清晰度”并不代表图象的细节是否丰富,清晰的感觉实际上更依赖物体边缘的对比度。现在电视机里有所谓“勾边电路”,它的作用就是增强物体的边缘对比度的,本质上这是一种失真,因此勾边的处理一般不在电视台一方进行。我又想起了音响发烧里所谓的“胆石之争”,电子管产生的谐波失真多为偶次谐波,晶体管则产生较多的奇次谐波,同样是失真,但人耳对前者感觉比较迟钝而对后者就比较敏感了。也许可以说jp2是胆jpg是石?呵呵,扯太远了。但图象文件作为一种媒体,我觉得讲究细节的保留比讲究清晰度来的重要。你总是可以在最终输出的时候再做锐化处理,但想把损失的细节弥补回来那就门都没有了。
下面从jpg和jp2的工作原理上试图解释一下。jpg的基础是※※※点阵上的DCT,即所谓“离散余弦变换”,我已离开大学多年,关于DCT早已忘记是怎么回事了,有兴趣的可以找找《多媒体编码技术》之类的书翻一下。但大致上jpg是在※※※像素的小块上做的压缩,这可以解释为什么压缩比一高就出现色斑了。至于jp2,他是基于Wavelet压缩,wavelet就是“小波”了,我没学过《小波分析》这门课,但记得wavelet压缩大致上是对整个二维图象进行处理,丢掉高频细节从而实现压缩的,这可以解释为什么jp2引起的失真看起来更像焦外成像的原因。由于传统小波压缩的工作方式需要缓冲整个图象,比较消耗内存,因此JPEG工作组在最终的JPEG2000方案里把它修改为渐进(progressive/scan line based)的方式,我用的演示软件一次只缓冲5行即可,不晓得多缓冲一点会否进一步优化低压缩比的表现。
结论:虽然低压缩比时jp2对jpg优势不明显,但它作为一种替代jpg的算法还是能胜任的。
说了这么多关于压缩的,这里再说说还原。这里的还原不是指jpg的解压缩,我说的是通过打印机还原,就是如何把像素有限的图片放大输出的问题。现在人们普遍认为,300万像素(大约2048x1536)的数字图片打印在A4纸上的结果基本可以接受,再大一些就不行了,也就是说,2048个点分布在长边为297mm的A4纸上的线密度大约是7l/mm即3.5lp/mm,175dpi。而较高精度的印刷品要超过300dpi,因此其结果仅仅是“可接受”而已。与此同时,一篇报告(http://www_luminous- landscape_com/d30_vs_film.htm)指出,9MB的D30数据(300万像素)比扫描Provia 100F胶片得到的34MB数据产生的结果更好,这的确是个疑问。文中作者提到,他在打印输出之前用一个名为Genuine Fractals Pro 的软件把9M图片插值放大到了34M以匹配胶片数据的大小,我怀疑这就是原因所在了:一个聪明的放大程序能“欺骗”人的眼睛,让结果看起来更逼真。我不了解这个软件的机密所在,但猜一猜无妨:
1,在插值放大之后再锐化比先锐化再插值要好。这一点是毫无疑问的。锐化本身就是引进失真,前面也已提到。但如果我们先锐化,等放大以后,这本应让我们感觉到更清晰的锐化边缘也一同被放大变“软”了(在相同观察距离下)。
2,PhotoShop和很多打印机驱动程序的插值放大算法也不过bicubic(双向立方?)而已,这主要是出于速度方面的考虑。假如能扩大取样点的范围,甚至使用人工智能来做模式匹配,其结果将更能满足人眼的视觉特征,那将是一个质的飞跃。我们在传统放大的时候非常注重放大镜头的素质,怎么到了数字领域反而不那么讲究了?
作为本文的结尾,我想说当把数字技术应用到人的感官刺激方面时,比如声音和图象,数学上的精确与人的感觉始终是两回事。在保存固定的信息量的前提下也许能适当偷机取巧让结果更能取悦人类感官?在声音领域,杜比降噪器有点象图象去杂点的滤镜;劲度加强器类同图象边缘的锐化;MP3则相当于JPEG2000,可见耳朵和眼睛的相通之处还是满多的。