图像压缩
正如由机器人完成的任务生成的数据非常宝贵,需要返回这些数据的通信带宽也是非常宝贵的。对于较小的图像,比如那些通过子图定位或者抽样操作,图片大小已经减少了,因此直接执行“下行”操作而不做压缩处理是可行的。更大的图像,比如全尺寸大小的SSI图像,“下行”操作会消耗很多带宽,因此在这种情况下,通常采用压缩方法来解决。
ICS采用像素映射和扩展,提供了两种压缩和减少图像大小的方式。对于某个特定的图片,采用哪种压缩或减少图像大小方式,主要依赖于图像需要达到的保真程度,高保真被认为是图像的一个必要方面。在一些情况下,每个像素8位就足够了;而在其他一些情况下,JPEG压缩本身造成的图像保真损失是可以接受的;而对于一些情况,图像需要保持尽可能高的保真,则可以采用无损压缩的方式。
在ICS内部,一台JPEG压缩器采用所有的整数算术计算和就地操作,提供所谓的“有损”压缩方式。JPEG被认为是有损的,因为其压缩过程丢失了部分图像数据。JPEG可以通过命令,对图像数据实现不同程度的压缩。最终代码是松散式地基于Mars'98使命的JPEG压缩器;虽然凤凰号火星着陆探测器的ICS的实现只采用了其部分原始代码。原始的JPEG压缩器使用的是浮点数乘以全尺寸大小的图像数组作为缓存,并采用动态内存分配方式。对于这种方式如何在飞行软件上正常工作,我仍然感到很困惑,不过它确实能够正常工作。在压缩代码中使用浮点数来表示像素数据,这也意味着对于每个图像,比起16位整数的原始图像表示方式,浮点数占用了其四倍的内存空间。
第二种压缩方式,也称为Rice无损压缩(Rce Lossless)或者Rice压缩,采用了由Jet Propulsion实验室的Robert Rice开发的一种算法。该Rice算法可以对图像数据实现几乎2:1的压缩效果,且没有数据损失。而JPEG算法在压缩过程中丢失了部分数据。Rice压缩方法也是在图像槽中就地对图像进行压缩。
两种无压缩的缩小图像大小技术或者采用查询表,把12位的像素值映射到8位的像素值,或者采用位缩小技术,对像素数据向右移动4位,生成一个每个像素8位的图像。JPEG和Rice压缩函数都接受12位或者8位的图像数据。
是否采用有损的JPEG压缩方式,通常需要对各种因素进行权衡,比如数据需要达到的精确度、可用的带宽大小、太空飞行器的主机有多少可用的“下行”存储空间、有多少时间可用于执行压缩(之前提过,RAD6000的最高速度是20MHz,因此压缩1M像素的图像数据可能需要超过1秒钟)。
当使用JPEG压缩方式时,采用的压缩比率是通过命令行参数决定,该命令行参数指定结果数据在最差情况下的压缩比率。换句话说,ICS不是指定一个“质量”因子(该因子通常表示JPEG压缩方法需要达到的压缩级别),而是使用一个可扩展因子,自动计算得出需要的压缩级别。这是基于全局“图像熵”(iage entropy)的“快查”(qick-look)分析。图像熵是图像“繁忙”程度的估计值,熵值越高的图像(在亮度上有很多细节和变化,如有很多鹅卵石的地面,阴影对比分明)将需要更高的压缩设置来满足最终的目标图像大小限制。对于熵值低的图像,比如飘着一些云彩的Martian天空,没有太多的细节和变化,因而只要较少的压缩量就能满足目标图像大小限制。
JPEG压缩算法扩展因子也用于把原始图像划分成不同的分段。这些分段一次一个地传给JPEG压缩器,其输出被写回到图像的槽。在执行“下行”操作之前,图像槽的最终结果是一组小的、自包含的JPEG图像,这些图像的全部大小不大于由命令行指定压缩比率的原始图像大小。
Rice压缩器包含它自己的嵌入式分段方法,而且其“下行”操作是简单地通过读出压缩数据,这些压缩数据通过小的分包方式,分包大小适合太空飞行器主机的闪存大小。查询表和减少位的方法的输出也是简单地读出闪存大小的包,用于“下行”操作。