FME中的栅格数据操作之十——如何避免黑边的产生

时间:2024-03-30 19:22:12

原文发布时间:2010-04-30

作者:毛毛虫

栅格重投影是很常用的操作,但是在栅格重投影后,我们会看到沿着栅格边界产生黑边。

如图,原始图像

FME中的栅格数据操作之十——如何避免黑边的产生

经过重投影后,转换为:

FME中的栅格数据操作之十——如何避免黑边的产生

重投影根据源和目的数据的投影,破坏了初始栅格。栅格可能被拉伸、移位和/或倾斜,但是栅格的性质又要求必须是个矩形。为了保持栅格矩形,FME沿着栅格边界增加了一些像素,这些增加的像素就是出现黑边的原因。

对于多幅影像,镶嵌成一张再转换,可以减少黑边,但是不能彻底消除。而且FME处理影像的大小是有限制的,不可能无限制的镶嵌为一张。如何去除黑边?

下面几种方法可以参考:

1、最简单的方法就是通过Clipper裁去黑边。

这里,我先提取转换前的栅格矩形框的四个顶点,然后求重投影后这四个顶点的最小的x、y生成的矩形,用这个矩形裁剪转换后的影像,得到没有黑边的数据。具体说明如下:

如图:先提取转换之前栅格的范围,生成一个矩形(图中红色边框),这个矩形的四个角从左下角顺时针依次记作(x1,y1)、(x2,y2) 、(x3,y3) 、(x4,y4)。

FME中的栅格数据操作之十——如何避免黑边的产生

 重投影之后,影像与矩形都发生了变形。

影像的变形如图所示,产生黑边。矩形的变形就是影像出去黑边的部分。现在我们要提取的裁剪矩形是:(x1,y1)、(x2,y2)做比较,找出较大的x值作为矩形的xmin;(x3,y3) 、(x4,y4)作比较,找出较小的x值作为矩形的xmax;(x1,y1)、 (x4,y4)作比较,找出较大的y作为矩形的ymin; (x2,y2) 、(x3,y3)作比较找出矩形的ymax。

                FME中的栅格数据操作之十——如何避免黑边的产生

这样,根据这四个值,就可以生成一个裁剪所需的矩形。

然后使用clipper转换器,根据投影后的影像与生成矩形进行裁剪,去除黑边。

使用到的主要转换器为:2DBoxReplacer、Tester、AttributeCreator、RasterPropertiesExtractor、Reprojector、Clipper。

当然,如果有多幅影像,可以用批量处理的方式进行操作(注意对于相邻的影像,要有重叠部分,不然用这种方法裁剪后可能中间会有空隙)。

2、使用NODATA值。

在重投影前设置NODATA值,也就是像素有RGB值(0, 0, 0)表达NODATA值,使用转换器RasterBandNodataSetter,进行重投影即可。如图:

FME中的栅格数据操作之十——如何避免黑边的产生

 生成的影像没有黑边。不过仔细观察后会发现,栅格数据中有很多白点,放大后如图:

FME中的栅格数据操作之十——如何避免黑边的产生

图中红色标记部分的单元格属性为:

FME中的栅格数据操作之十——如何避免黑边的产生

也就是说,这种方法不仅设置了黑边部分的nodata值,也修改了栅格内部值为(0, 0, 0)的值为nodata值。当然,如果通过RasterBandMinMaxExtractor转换器,找到数据中没有值为255的单元格,我们可以设置nodata值为255。

3、使用alpha波段。

我们把初始栅格说明从RGB24转换到RGBA32。也就是说,添加一个alpha波段,控制像素的透明度。重投影之后,生成新的像素(黑边部分),得到alpha值等于0,这也是它们的透明度。重投影后,在RasterInterpretationCoercer转换器中要设置RGBA to RGB为“Apply the alpha band”,即转换的时候要应用alpha波段。

FME中的栅格数据操作之十——如何避免黑边的产生

当我们影像使用alpha波段,我们能设置"Composite Using Alpha Band"为"yes"——这将告诉FME根据他们的alpha波段值来融合栅格,。这样就得到了没有黑边的RGB影像。

FME中的栅格数据操作之十——如何避免黑边的产生