如何计算点云密度

 

1.前言

在创建模型或处理点云之前,我们来先了解一下数据集中点密度的含义。点云密度是数据分辨率的指标:较高的密度意味着更多的信息(高分辨率),而较低的密度意味着较少的信息(低分辨率)。了解点云密度很重要,因为这可能会影响基于点云(例如创建DEM)的其他项目的质量或准确性,向作为利益相关者的客户呈现这些信息也同样重要。

为了快速获取点云密度信息并以栅格形式显示,我们创建了一个自定义转换器,PointCloudDensityCalculator。您只需将其连接到您的点云数据集,就可以获得计算结果。下面我们将描述该转换器的内部工作原理,以帮助您准确地了解正在执行哪种类型的处理和分析,在此将以有以一个工作空间为示例,该工作空间描述了如何给输出的点云密度栅格添加颜色,从而为数据赋予更多含义和定义。

2. PointCloudDensityCalculator

2.1 下载方式

下列步骤将描述自定义转化器PointCloudDensityCalculator的每个部分及其建立方式。在需使用该自定义转换器时,您无需重新创建它,只需下载并安装它即可使用,但是如果您对它的内部工作方式感兴趣,或者想了解如何制作该自定义转换器,那么以下这些步骤将对您非常有用。如果您想在安装后打开该转换器的工作空间,则可以右键单击该文件,然后选择在FME Workbench中编辑该文件即可,亦或者,如果您已经安装了该转换器,则可以将其直接添加到工作区中,右键单击它,然后选择编辑即可。

2.2 自定义转换器

在开始创建自定义转换器之前,请先在FME Workbench中的菜单栏中单击转换器,然后选择创建自定义转换器。这时将提示您在新窗口中输入有关转换器的信息,当您输入信息之后,转换器输入和输出便会添加到工作区中。在此,您需要将输入的名称更改为“ POINT_CLOUD”,将输出的名称更改为“ RASTER”


在添加任何转换器之前,我们需要先创建一个新的用户参数。右键单击导航器窗口中用户参数下的已发布参数,然后选择创建用户参数…”即可创建。

接下来在添加/编辑用户参数窗口中,输入“ PIXELSIZE”作为名称,输入“ Density Raster Pixel Size作为提示,输入25作为默认值,并取消勾选“可选”。

ParameterFetcher添加到工作空间,并连接到读模块,将目标属性设置为_PIXELSIZE,参数名称设置为刚刚创建的“ PIXELSIZE”用户参数。该步骤将获取用户输入“ Density Raster Pixel Size的值,并将其用于下一个转换器的计算中。



 

接下来,添加并连接BoundsExtractor,用于标识最小和最大XYZ属性。

之后,添加ExpressionEvaluator转换器,基于BoundsExtractor提取到的属性值和PIXELSIZE用户参数值来计算命名为“ _big_tile_size”的新属性的值。用于执行此操作的表达式如下:

 

下面,添加并连接Tiler转换器用于平铺点云。在此,我们将使用两个Tiler以减少处理内存的使用。第一个Tiler将用于计算较大的图块,然后将其缩小到指定的像素大小值,该步骤将基于刚刚创建的属性“ _big_tile_size”完成,我们需要在参数中将“ _big_tile_size”设置为图块“宽度”和“高度”。

之后,我们使用第二个Tiler来创建用户指定大小的图块。具体操作为,将参数中的图块宽度和高度设置为用户参数“ PIXELSIZE”。

下图显示了,仅使用基于“ PIXELSIZE”参数的Tiler转换器和同时使用基于“ PIXELSIZE”参数的Tiler以及基于“ _big_tile_size”参数的Tiler之间处理内存的区别。尽管仅使用一个Tiler时处理时间更快,但使用两个Tiler可以使处理内存使用量减少72%,所以如果用户定义的像素大小非常小且点云的面积很大,使用两个Tiler转换器则更为合适。

使用两个像素大小为25Tiler


 

使用一个像素大小为25Tiler

⑨ 现在连接PointCloudPropertyExtractor以计算每个图块中有多少点,该转换器将自动创建一个名为“ _num_points”的新属性,以记录点数。

接下来,使用BoundingBoxReplacer转换器将图块替换为一个框。

下面,添加一个3Dforcer转换器并连接到“ Box”输出,通过图块中的点数(_num_points)来提高图块的高程,即具有更多点(更高密度的点)的图块将高于具有更少点的图块。

⑫ 现在,添加NumericRasterizer用以创建栅格。在参数设置中,将大小规格设置为“ CellSize”,并将“ X和Y单元格间距”设置为用户参数“ PIXELSIZE”,解译类型设置为UInt32。设置好之后,可将该转换器的“Raster”输出连接到栅格输出转换器。

⑬ 现在自定义转换器就完成了,当前使用转换器的运行输出结果是黑白栅格,其中每个像素都有一个描述点云密度(像素内的点)的栅格值,这些值将根据转换器参数下设置的用户定义的像素大小而变化。使用栅格表示点云密度,可以很容易地查看到点云内您感兴趣的区域是否满足项目或操作的要求,例如,是否有足够的接地点来创建准确的DEM等等。

3 编码点云密度颜色

3.1 点云密度颜色

使用另外一些转换器,我们可以使PointCloudDensityCalculator创建的栅格更具描述性。以瑞典耶夫勒市为我们提供的该城市点云为例,我们能够为该点云创建密度栅格和经由颜色编码的彩色密度栅格,如下图所示:

点云(左),密度栅格(中),彩色栅格(右)

接下来的步骤说明中,我们将展示如何基于点云为温哥华市创建彩色栅格。此处结果显示出与耶夫勒市不同的模式是因为使用了不同类型的扫描系统来收集点。具体操作如下:

首先添加一个ASPRS Reader转换器,以读取温哥华市的LAS数据集。

接下来,连接PointCloudDensityCalculator自定义转换器(可以从FME Hub下载和安装它),经由该转换器输出的是黑白密度栅格。

添加一个RasterBandNoDataRemover并连接到“ RASTER”输出用以删除所有没有数据的像素,这将有助于提升处理速度和效率。

下面,将一个RasterExpressionEvaluator连接到先前的输出(该转换器对于创建代表特定像素密度的颜色至关重要),将“解译”设置为UInt8(仅使用RasterPalletteAdder读取UInt8值,所以该步骤是必需的),最后将表达式设置为:

ifA [0] == 0,0ifA [0] <100,1ifA [0] <150,2ifA [0] <200,3ifA [0 ] <300,4ifA [0] <400,5ifA [0] <500,6,7)))))))))

该表达式基于每个像素的点密度创建并分配07的值,在此表达式中,如果每个像素有0个点,则将值设置为0;如果每个像素少于100个点,则将值设置为1;如果每个像素有少于150个点,则将值设置为2等。如果您尝试使用其他点云进行此练习,则可能需要更改分配给这些值的密度测量值,以更好地匹配您的点云,如果有需要,您也可以使用更多或更少的值(即,对应更多或更少的颜色)。

添加AttributeCreator并连接到RasterExpresionEvaluator“Result”输出端口,该转换器将基于我们先前设置并分配的值来定义颜色。在转换器参数设置里,创建一个名为“ _palette”的新属性,打开该属性对应值的文本编辑器,并输入如下设置内容:
RGB24 
0 255
255255 
1 255
0
2 255
127
3 255
255
4 127 255

5 0
255
6 60
18060 
7 0
100,0 
    属性值文本的第一行表示我们正在进行为_palette属性分配颜色值的操作,之后的数字行表示,如果值为0(0点/像素),则颜色将为255,255,255,即白色(第二行),以此类推,为值分配颜色。

⑥ 将AttributeCreator的输出端口连接到RasterPaletteAdder,调色板属性设置为“ _palette”,该步骤是将颜色分配给像素的最后一步。

现在,可以通过将 Data Inspector 连接到RasterPaletteAdder 输出端口来查看它的输出,结果应如下面最右边的图像所示。

由于所使用的LiDAR扫描系统的类型不同,所以该演示产生的图案与耶夫勒市的图案有所不同,但通过彩色编码的栅格仍能够使我们更清晰地观察与分辨出高点云密度和低点云密度的分布情况。

点云(左),密度栅格(中),彩色栅格(右)

想了解更多有关为栅格编码颜色的信息,请访问有关栅格计算和栅格调色板的文章。

 

数据来源

本文所使用的数据来自不列颠哥伦比亚省温哥华市提供的开放数据,它包含经由“开放政府许可证-温哥华许可的信息。

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/108775589
今日推荐