5.2 图像滚动显示、漫游显示和放大显示
一个球在地上滚动,我们从一个角度去观察,就可以看到球在滚动方向上的各个部分,图像滚动显示也是这样。图像滚动是图像显示的一种功能,就滚动的方向而言,有上滚、下滚、左滚、右滚,也有任意方向的滚动,上滚、下滚为Y方向的滚动,左滚、右滚为X方向的滚动,任意方向的滚动为XY方向的滚动;而就滚动显示的图像内容而言,有限定屏幕内容的滚动,也有大于屏幕内容的滚动,限定屏幕内容的滚动是指滚动前和滚动后的图像在显示时其内容并没有丢失,只在相对位置上发生了变化;从滚动的速度而言,有实时滚动和非实时滚动。在实现上,限定屏幕内容的左滚、上滚和左上方滚动相对容易一些。限定屏幕内容左滚、上滚和左上方滚动的示例如图5.2.1所示。
图5.2.1 限定屏幕内容的滚动示例
在图5.2.1(a)中,图像在X方向向左滚动了ΔX的距离,因为是限定屏幕内容上的滚动,滚动前处于屏幕最左端的图像(左图),滚动后则到了屏幕的最右边(右图)。可以看出,原来屏幕上的内容依然存在,只不过是图像在屏幕上的位置发生了变化,顺序地向左移动了一段距离。在图5.2.1(b)中,图像在Y方向向上滚动了ΔY的距离。同样,因为是限定屏幕内容上的滚动,滚动前处于屏幕最上端的图像(左图),滚动后则到了屏幕下面(右图)。向左和向上的滚动都是单方向的,图5.2.1(c)则是在两个方向上同时发生了滚动,向左滚动了ΔX的距离,向上滚动了ΔY的距离。在这些限定屏幕内容的滚动的示例里,屏幕上的图像数据并没有发生变化,变化的仅仅是这些图像数据显示的顺序,也就是说显示的地址发生了变化。各个图像处理系统的帧存结构有所不同,具体实现这三种滚动功能的方法也不同,比较起来,用VRAM芯片构成图像帧存,在实现这些滚动功能方面则相对简单一些。我们曾在第2章图像数字化中讲到两套地址的问题:一套地址是扫描地址,扫描地址最大的特点就是地址和屏幕一一对应;另一套地址是存储地址,这是数字化图像存入存储体的地址。类似地,在图像显示中,也采用这两套地址。正常显示时,读操作送入存储体的存储地址就是扫描地址;滚动显示时,送入的存储地址不是显示地址,而是变换地址。用VRAM芯片构成图像帧存时,图像显示是由帧存的读传输和串出功能实现的,正如第4章介绍的那样,把存储芯片里DRAM内的一行图像通过读传输操作送到存储芯片里的SAM内,然后通过串出操作把图像一点一点地读出来。在读传输操作时,送出列方向的首址,在一般显示状态下,列方向的首址为零,如果要求在X方向向左滚动ΔX的距离,则在读传输操作时,送出列方向的首址为ΔX,这样就实现了向左滚动ΔX的距离的功能。实现限定屏幕内容向上滚动的方法比实现限定屏幕内容向左滚动的方法要复杂一些,向上滚动时送给存储体的列地址不需另加处理,而要对行地址进行相应的处理。图5.2.2给出了一种实现限定屏幕内容的上滚功能的行地址产生电路框图,这是一个512×512点阵的例子,行地址为9位。首先由主机给出滚动的数值,把这个数值送入偏移量寄存器,RCK为锁存脉冲,CD0~CD7为计算机数据,偏移量寄存器的输出端连到可预置的行计数器作为预置数据;在可预置的行计数器中,HCK为计数脉冲,/HPE为预置控制脉冲,/VB为场消隐脉冲,作为该计数器的计数允许脉冲,而计数器的输出DY1~DY8则是显示时的高8位行地址,最低位地址DY0是奇偶场信号,直接由图像处理系统给出。由于这个电路是用在隔行扫描的显示地址的形成上,所以送到偏移量寄存器的数值则为ΔY的1/2。制作时偏移量寄存器可以由74LS374芯片构成,该计数器可以由两个74LS161芯片构成,图5.2.3给出了图5.2.2所示的上滚时行地址产生电路的时序,我们可以用GAL等芯片具体来实现这些时序,其逻辑表达式为
图5.2.2 上滚时行地址产生电路框
图5.2.3 上滚时行地址产生电路的时序
/HPE1=/VB; /HPE=/HPE1; HCK=HPE&/VB + /VB&HS;
从波形图可以看出,/HPE只是/VB的延迟,在/VB的上升沿时,把上滚的偏移量数值预置到可预置的行计数器里,以此形成每一场图像上滚的行地址首址。限定屏幕内容的左上方滚动同时结合了上滚和左滚的特点,这里就不再赘述。图5.2.1给出的限定屏幕内容滚动示例只给出了上滚、左滚和左上方滚动,而下滚、右滚和右下方滚动在实现的方法上与上滚、左滚和左上方滚动的实现方法是一样的。
在实际应用中,大量应用的还是采用大于屏幕内容的滚动方式,要想观察一幅大范围的遥感图像,就要逐行地或逐列地进行大于屏幕内容的滚动显示;在电子地图中采用大于屏幕内容的滚动技术,这样一位汽车司机使用车上的电子地图,随着汽车的行驶路线,在电子地图上显示当前的城市交通地图;在线阵B超里,常常使用这种大于屏幕内容的上滚技术,而且还同时使用硬件放大技术,来观看不同深度的超声图像。
如果一幅图像显示的分辨率为512×512,而要显示大于此图像点阵的图像,这时就要采用大于屏幕内容的滚动方式了。仿照前面的示例,这里也来讨论大于屏幕内容的上滚、左滚和左上方滚动。首先来看上滚,先确定每次上滚的行数ΔY,如果以512×512逐行方式来讨论,当进行滚动操作时,把ΔY行的图像内容显示在第0行,把(ΔY+1)行的图像内容显示在第1行,把(ΔY+2)行的图像内容显示在第2行……把511行的图像内容显示在第(511-ΔY)行,最下面的ΔY行则要补充新的图像数据。如何补充新的图像数据呢?显然有两种做法,一种做法是设计一个大于显示分辨率的图像存储体,如显示分辨率为512×512,而图像存储体的容量为512(列)×1024(行),预先把图像存入512×1024的图像存储体,这样在图像上滚时就可以把511行以上的图像数据补充进来;另一种做法是把511行的图像内容显示在第(511-ΔY)行后,再由主机补充新的数据。显然,这两种方法都可以实现上滚,由于帧存的容量很有限,采用主机补充新数据的方法可以显示更大尺寸的图像,但是二者在补充新数据的速度上有很大的差异,前者可以达到实时滚动,后者一般做不到实时,而实时滚动在有的要求里则是必需的。
大于屏幕内容的左滚,其方法也因帧存的结构不同而有所区别。在使用VRAM芯片组成的帧存里,如果帧存的容量为1024(列)×512(行),则可以很方便地实现实时的大于屏幕内容的左滚。具体实现的方法和限定屏幕内容的左滚类似,也是在读传输操作时,送出列方向的首址,而这个列址一般也是由计算机预先置入的。
大于屏幕内容的左上方滚动是同时完成大于屏幕内容的左滚和上滚这两个方面的功能,在实现上则常常是设计一个在X、Y两个方向上都大于图像显示分辨率的图像帧存。
我们常说的图像漫游,就是指在一个从X、Y两个方向上都大于图像显示分辨率的图像区域中,任意显示一个标准显示分辨率的图像,例如,在一个1024×1024图像帧存储体里作512×512点阵的图像漫游。显然,图像漫游就是采用了在X、Y两个方向上的图像滚动技术。在图像漫游中,要给出图像滚动的ΔX、ΔY数值,可以采用移动鼠标器(或跟踪球)的方法给出具体数值;在模拟训练器里,可采用移动操纵杆的方法给出具体数值;有的时候,还可以按照某种运动规律用软件编程来给出具体数值。为了避免出现显示上的紊乱,计算机置数的时间最好选择在场逆程的时间,而要实现这种只在场逆程时间里置数的操作,该系统就必须具有计算机能够读出场消隐信号的能力。
在图像处理中,有时要把一个区域的图像放大,这样便于观看图像的细节,便于进行图像编辑,还可以达到类似电影特技的效果。不论用硬件还是用软件实现图像放大,在灰度插值上,都可分为重读插值放大(简称为重读放大)和线性插值放大(简称为线性放大);在放大区域上,可分为规则区域和任意区域的图像放大;在图像放大的倍数上,有整倍数图像放大和无级图像放大。由此组合起来,还可形成一些类别的图像放大。重读放大是指在原相邻点之间插入新像素的灰度值等于前一点的灰度值,而线性放大是指在原相邻点之间插入新像素的灰度值是原相邻点灰度确定的线性渐变的灰度值。规则区域放大是指矩形或圆、椭圆区域的图像放大,而任意区域的图像放大则包含了规则区域和非规则区域的图像放大,这个任意区域可以是由鼠标器(或跟踪球)随意画出的一个封闭区域。在整倍数的图像放大中,硬件常采用2的整次幂的放大倍数,如2、4、8倍,而软件常采用无级放大,如1.1、1.2倍的图像放大。值得指出的是,一般放大是指X、Y两方向的放大倍数相同,即在两方向上都做相同倍数的放大,其放大倍数就是标定的放大倍数值,这个放大倍数绝不是指总的图像区域的放大倍数,显然总的图像区域的放大倍数应是X、Y两方向的放大倍数的乘积(在有的应用中,也需要进行单独X方向、Y方向的图像放大,有时X、Y两方向的放大倍数也不一样)。总的来看,软件实现放大的形式比较灵活,由相应的算法实现,硬件则大多采用矩形区域重读放大。为了硬件便于实现,许多系统还只能做到有限几种的矩形区域重读放大。在线阵B超中,常常使用1.5倍、2倍的矩形区域重读放大;在常规图像处理系统中,常采用2倍的矩形区域重读放大,例如标准显示分辨率的图像是512×512的点阵图像,把这幅图像分成4个象限,每个象限的图像都是256×256点阵的图像,在放大中,任一个象限的图像都可以放大成512×512的点阵图像加以显示。下面我们来讨论这个例子的放大功能的具体实现。
考虑图像放大时的出发点还是要考虑扫描地址和存储地址之间的关系,这种扫描地址是屏幕地址,存储地址则是图像放大时所取像素处于存储体中的实际地址。512×512的点阵图像的扫描地址为18位,X、Y方向各9位,扫描地址中X方向的地址是X0~X8、Y方向的地址是Y0~Y8,放大时图像区域在X方向的存储地址为X0'~X8'、在Y方向的存储地址为Y0'~Y8',X方向的和Y方向的最高位地址X8'和Y8'由计算机给出,以确定被放大图像的具体象限数,存储地址低8位X0'~X7'由X0~X8右移一位形成,即X0'等于X1,X1'等于X2,…,X7'等于X8,Y方向也是一样,存储地址低8位Y0'~Y7'由Y0~Y8右移一位形成,即Y0'等于Y1,Y1'等于Y2,…,Y7'等于Y8。由于各个图像处理系统的帧存有所不同,其实现放大的方法也有所不同,Y方向的地址可以用地址选择器来选择,常规显示时选择Y0~Y8,放大显示时选择Y0'~Y8'。X方向地址的处理则有所不同,在用DRAM存储芯片构成的帧存中,X方向的地址也可以用地址选择器来选择,常规显示时为X0~X8,放大显示时为X0'~X8'。在用VRAM存储芯片构成的帧存中,X方向的地址用地址选择器来选择,常规显示时为X0~X8,放大显示时X方向的最高位地址为X8',低8位地址则全为0。此时VRAM存储芯片的串出脉冲SC的频率则降低一半。
通过上面所介绍的方法可以很方便地用硬件来实现矩形区域的2倍图像放大。实现矩形区域的放大还是比较容易的,但要用硬件来实现一个任意区域的图像放大则比较难,可能只在一些特殊的情况下才需要这种功能。首先需要勾画出要放大的一个任意区域,计算出这个区域的4个端点:Y地址的最小点、最大点,X地址的最小点、最大点,由此得到由这4个端点所确定的矩形区域,在硬件上实现这个矩形区域图像的重读放大,这时所放大的图像既包含了该任意区域的放大图像(这正是我们需要的放大图像),同时还包含了一些处于该任意区域以外部分的放大图像(这是我们不需要的放大图像)。现在遇到的问题是怎样把这部分不需要的放大图像删除。这里我们提出一种屏蔽的办法或称为抠像的办法来去除区域外的多余图像:设立一个字符存储体(一般的图像处理系统都设有这种字符存储体),其地址容量等于图像显示分辨率所要求的存储容量,每一个地址的字长可以是1bit,还可以是多bit,通过软件计算,可以准确地得到该任意区域放大以后所具有的图像区域,这里我们称其为正确的放大区域,通过计算机把字符存储体属于此区域的部分写为“1”,其余部分写为“0”;与此相配合,再设置一个数据选择器,当字符存储体的数据为“1”时选择放大后的图像数据,当字符存储体的数据为“0”时选择“0”数据,这样就能准确地显示所需要的任意区域的放大图像,而区域外的部分则显示为黑。
最后还应当说明,硬件图像放大只是在显示上进行加工处理,而并没有破坏图像帧存里的存储数据,因此这种放大是非破坏性的。