一种超大图片的切分方法

2021-11-01 08:53徐文文王文青柴旭超朱飞鸿
现代计算机 2021年26期
关键词:小图图章表达式

徐文文,王文青,柴旭超,朱飞鸿

(中国地震局第二监测中心,西安 710054)

0 引言

20世纪50年代,为了迅速发展中国的地震科学事业,国家开始建设地震观测系统[1]。经过了多年的努力,国家建成了全国基本地震台网和区域地震台网,各个观测台站上有很多观测仪器[2],随之产生了很多观测图纸[3]。因为观测仪器各异,产生的图纸规格也比较多,尺寸大小不一:小到几个小时记录一张,大到1个月记录一张。其中由石英伸缩仪和浮子水管仪所产生的图纸就是一个月记录一张。经过调研,这些图纸大都产生于二三十年前,纸张又比较薄,由于各种历史和现实原因,图纸的保存环境又不太好,目前图纸颜色已泛黄,图纸的边角有不同程度的破损。这些宝贵的图纸资料濒临破损,亟需抢救。于是模拟地震资料抢救项目组的任务是把纸质的地震历史资料以某种标准进行扫描,以图片的形式把图纸永久保存[4]。该类型的图纸规格是长×宽:23.16 m×0.267 m。在本研究中,我们约定长度超过20 m的纸质图纸为超大图纸。我们把超大图纸的长定义为Loriginal,宽是Woriginal,单位为m,基于上述表述可得到表达式(1)和(2):

模拟地震资料抢救项目组开展工作本着对纸质图纸进行抢救保护的原则,扫描的原则是不能对纸质图纸进行破坏,不能因为图纸太长对图纸裁剪破坏,扫描的图片应该清晰分辨率高,所以规定这些纸质图纸的扫描要求是PNG24位,600 DPI的PNG图片,这个可以参考《模拟地球物理图纸扫描技术规程2020(磁照图)》[5]上面的技术要求实施的。根据这个要求,扫描一张超大图纸所需内存是10 GB左右。在本研究中我们定义:超大图纸按照600 DPI,24位的扫描要求得到的PNG图片为超大图片。现在市面上存在的图片阅读器和编辑器都打不开超大图片。现在存在一个问题:科研人员可能不方便借阅纸质图纸,想通过图片研究波形信息,但是超大图片无法用现有的图片阅读器或者编辑器打开。于是在本研究中,我们把每月一张的超大图片切分成以天为单位的正常大小的图片。在此定义切分得到的以天为单位的正常大小的图片为小图。小图是可以用市面上现有的图片阅读器和编辑器打开。并且小图的规格仍旧是PNG24位,600 DPI,内存300 MB左右。

1 切图的前期准备

1.1 原始图纸的特性

由于原图太长,纸质图纸是卷起来存放的,如图1和图2(a)所示。打开图纸可以看到图纸的两端各盖有一模一样的图章,一个图章在下纸时间空白处的正面,如图1所示。备注信息在正面图章处。另一个图章在上纸时间的背面,如图2(b)所示。

图1 形变图-石英伸缩仪

图2 石英伸缩仪

如图3所示,纸质图纸上面是网格,1小格可以记录20分钟的波形,如图3中红色矩形框所示,1大格由6小格组成,图3中的标号1—6小格组成了1大格,如图3中绿色矩形框所示。

图3 石英伸缩仪局部图

经过测量,1小格的长度是1 cm,那么1大格(6 cm)可以记录2小时波形信号,可以得到如表达式(3)、(4)所示:

其中,L20min为记录20分钟波形信息的一小格的长度;L2h为记录2小时波形信息的1大格(6小格)所需纸质图纸的长度。

综上可知,一天24小时的波形信号可以用72 cm长的纸记录完整,如表达式(5)所示:

其中,L24h为记录24小时(1天)波形信息所需纸质图纸的长度。定义Lmonth为记录1个月波形信息所需纸质图纸的长度,Nday为这个月(某一年的1月—12月中的一个月)的天数,一般的,Nday可以取的值为28,29,30,31。在本研究中,我们假设Nday=31(其他天数同理可得),如表达式(6)所示:

定义Lmargin为超长图纸上纸和下纸处空白处无波形信息的长度,有如下表达式(7)所示:

从表达式(7)可以推出Nday取值为30天,29天,28天的情况下,Lmargin值就更大了。即使Lmargin值有四种可能情况,但是经过对图纸的调研,发现一般图纸会在上纸时间处留下大约12大格(0.72 m)的固定长度,我们定义上纸处的留白长度为Lmargin_head;定义下纸处的留白长度为Lmargin_tail,可得如下表达式(8)和(9)所示:

1.2 PNG图片的特性

前面提到过,现有的图片阅读器和图片编辑器无法打开超大图片。用LIBPNG库函数在WINDOWS10系统中也不能读取超大图片的信息,原因是WINDOWS系统内存调用机制使得内存不足。经过尝试,在LINUX系统下调用LIBPNG库函数对超大图片进行解析可以得到其相关头信息为:该超大图片为红绿蓝(RGB)三通道记录,即每一个像素存储的是RGB三个颜色的16进制数。定义超大图片宽度的测量值为Worig_mesure,高度的测量值为Horig_mesure,通过C++代码调用LIBPNG库函数可得到如下表达式(10)和(11)所示:

该超大图纸的宽(0.267 m)是正常宽度,因此对应的超大图片不需要竖着切图;超大图纸长度(23.16 m)过长,所以对应的超大图片需要横着切,以天为单位,一天切一份。所以下面仅研究超大图纸的长度方向上和超大图片的高度方向上的等价关系。

1.3 超大图纸和超大图片尺寸换算

经过测量和分析,得出长度为1 cm(即1小格)的图纸等价为图片的高度为236行,于是可得如下表达式(12)所示:

其中,H20min为图纸记录20分钟等价的图片高度。经简单推导可以得到如下表达式(13)—(17)所示:

其中:H2h为图纸记录2小时等价的图片高度;H24h为图纸记录24小时等价的图片高度;Hmargin_head为理论的上纸留白,Horig_theory为超大图片高度的理论值;Hdelt为超大图片的理论值和测量值之间的差值。定义Ldelt为超大图纸的实际测量值和理论计算值之间的误差。Ldelt的值如下表达式(18)所示:

从上述表达式可知,超大图纸的实际测量值和理论计算值之间的误差为0.27 cm,这样的误差是可以接受的,其合理性如下:每张图纸头和尾是个三角形或者梯形,卷在木管子里,难免有摩擦和破损,更何况,这个图纸是几十多年前产生的图纸,历史较长,难免在边角上有破损,还有手动测量得到的23.16 m长的图纸可以有0.27 cm(0.0027 m)的误差。综上所述,超大图纸的实际测量值和理论计算值是等价的,我们就随机选一个,以LIBPNG库函数读出来的测量值为准。

2 超大图片的切分思路

综上所述,我们得到了超大图片的参数和高度换算关系,接下来我们对图片进行切分,定义Nsmall_pic为超大图片切分成小图的份数,定义nsmall_pic为第n张小图,那么nsmall_pic∈{1,2,3,Nsmall_pic},我们有如下表达式(19)和(20)所示:

需求一:当nsmall_pic=1时,即第一张小图的高度由Hmargin_head决定。当2≤nsmall_pic≤Nsmall_pic-1时,即第2张到第Nsmall_pic-1张小图的高度由H24h来决定。当nsmall_pic=Nsmall_pic时,即最后一张小图的高度由Hmargin_tail决定。需求二:考虑到纸质图纸人工标注时间可能有两个小时左右的误差和上纸时间也有1~2个小时的误差,我们做了如下规定:当nsmall_pic=1时,允许第一张小图尾部与第二张小图的头部有重复,当2≤nsmall_pic≤Nsmall_pic-1时,允许这些小图的头与上张小图的尾有重复,每张小图的尾跟下张小图的头有重复;当nsmall_pic=Nsmall_pic时,最后一张小图只有头部与倒数第二张小图的尾部有重复。定义Hhead_repeat为第nsmall_pic张小图(2≤nsmall_pic≤Nsmall_pic)与上张小图尾部的重复高度,定义Htail_repeat为第nsmall_pic张小图(1≤nsmall_pic≤Nsmall_pic-1)与下张小图头部的重复高度。为简单起见,我们假定Hhead_repeat和Htail_repeat的高度为图纸记录2小时等价的图片高度,那么有如下表达式(21)所示:

需求三:超大图片上只有下纸处有图章信息,如果切分成小图的话,需要把该图章信息加在小图的前面以方便研究人员快速获取小图信息,又因为每份小图的图章信息是后来添加的,为了区分,在图章信息和本身切出来的小图之间加上灰色的分割线。通过研究图章的尺寸,发现超大图纸的图章和备注信息在一起,长度不超过12 cm。那么,我们定义图章信息的高度为Hseal,基于之前的换算关系,我们有如下表达式(22)所示:

假设灰色的分割线高度为Hdivider,我们有如下表达式(23)所示:

综上所述,我们把所有的需求都满足了,接下来我们重新定义一下小图的高度,小图的高度定义为Hsmall_png。分为3种情况,下面分别来讨论,如表达式(24)—(26)所示:

情况1:当nsmall_pic=1时,

情况2:当2≤nsmall_pic≤Nsmall_pic-1时,

情况3:当nsmall_pic=Nsmall_pic时,

由于超大图片不能竖着切,因此小图的宽度即是超大图片的宽度,定义为Wsmall_png,我们有如下表达式(27)所示:

综上所述,我们把每张小图的高度Hsmall_png和宽度Wsmall_png都确定了,接下来进行展示切图成果。

3 切图成果

实现上述切图方案,开发工具为LINUX系统和LIBPNG库函数版本为libpng-1.6.37和zlib-1.2.11,配置好环境后使用,编程语言用C++。本次切图超大图纸来源于张家口台1988年4月1日到5月1日的浮子水管仪,该纸质图纸长×宽为23.16 m×0.267 m,我们可以看到其图章信息如图4所示,把该纸质图纸扫描成600 DPI,24位的PNG图片的超大图片的规格属性如图5所示,由于其占用空间9.94 GB,用目前所能得到的看图软件都打不开,图6是把该超大图纸通过上述切图算法用C++在Linux系统下切分成32份小图,由前述分析可知,32份小图的个数是合理的。图7(a)为图6中的第1幅图,图7(b)为图6中的第2幅图,图7(c)为图6中的第32幅图,这3幅图的长度不一样,即高度不一样,第2幅到第31幅图的规格是一样的。故选择这3幅就可以代表切图生成的所有小图的类型了。由于石英伸缩仪和浮子水管仪的规格是一样的,该程序也适用于石英伸缩仪超大图纸的切分。再者,如果是其他的图纸宽度正常,不需要切分,长度比较长,都可以进行图纸的切分,只需要把切分的高度参数调整一下,思路是一样的,所以说,只要是要求横着切图,本研究都可以适用。

图4 图纸正面图章信息

图5 原始扫描件的属性

图6 原始图片切割成的小图集

图7 三种规格的小图

4 结语

本文为模拟地震资料抢救过程中抢救出的超大图片提供了一种图片切分方法,通过这种图片切分,解决了抢救图纸打不开的问题,科研人员可以使用电脑自带的或者市面上已有的图片阅读器或者图片编辑器打开切割好的小图进行研究。

猜你喜欢
小图图章表达式
光荣图章
灵活选用二次函数表达式
智趣
拼图
图章
图章
寻找勾股数组的历程
议C语言中循环语句
他们各需要什么
怎样确定一次函数表达式