一种建筑物的三维点云异常点删除方法转让专利

申请号 : CN202110787877.X

文献号 : CN113506228B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 许骏潘欣付浩海张敬天

申请人 : 长春工程学院

摘要 :

本发明提供一种建筑物的三维点云异常点删除方法,建立了尺度内最近点列表算子和空间差异矢量关系描述算子,对一个点与其邻近点在一定尺度内的空间关系进行了描述,并基于该描述实现了对建筑物的三维点云异常点删除。可以在一定尺度范围内,发现一个空间点与其邻域点在空间关系上,并选择寻找在空间关系上的异常情况,基于该异常实现异常点的发现和删除;克服了传统利用统计上的均值、聚类对调整异常点坐标进行删除等方法存在的缺欠,避免了降低异常点对后期模型的影响,降低建筑部边界的空间信息量,引起建筑物边角位置出现圆润化、建筑物表面出现波浪状起伏的状况,使得模型细节效果明显下降。

权利要求 :

1.一种建筑物的三维点云异常点删除方法,包括以下步骤:S1, 输入建筑物点云数据列表PtList,输入最小识别尺度Scale;计算PtList中点的个数PtNum,计算PtList中最大x坐标MaxX,最小x坐标MinX, 最大y坐标MaxY,最小y坐标MinY,最大z坐标MaxZ,最小z坐标MinZ;计算最大稀疏距离Sparseness;

S101, 输入建筑物点云列表PtList;PtList为一个列表结构,列表中每一表项为一个点结构体PtStruct;PtStruct描述了三维空间中的一个点,PtStruct包含三个字段:PX:空间点所处的x坐标的值;

PY:空间点所处的y坐标的值;

PZ:空间点所处的z坐标的值;

S102,输入最小识别尺度Scale;

S103,PtNum=PtList中表项的个数;

S104,MaxX=PtList中所有表项中PX的最大值,MinX=PtList中所有表项中PX的最小值;

S105, MaxY=PtList中所有表项中PY的最大值,MinY=PtList中所有表项中PY的最小值;

S106,MaxZ=PtList中所有表项中PZ的最大值,MinZ=PtList中所有表项中PZ的最小值;

S107,Sparseness=((MaxX‑MinX)/Scale+(MaxY‑MinY)/Scale+(MaxZ‑MinZ)/Scale)/

3;

S2,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos,返回结果为最近点列表PtArray;

S201,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos;

S202,最近点列表算子计数器NeighborOptCounter=1;

S203,建立最近点列表PtArray为一个空的列表;

S204,如果NeighborOptCounter=PtPos则转到S211;

S205,x方向距离DX=PtList[PtPos].PX‑PtList[NeighborOptCounter].PX;

S206,y方向距离DY=PtList[PtPos].PY‑PtList[NeighborOptCounter].PY;

S207,z方向距离DZ=PtList[PtPos].PZ‑PtList[NeighborOptCounter].PZ;

S208,最近点列表算子暂存变量NeighborOptTemp=(abs(DX)+abs(DY)+abs(DZ))/3; 其中abs()为计算绝对值;

S209,如果NeighborOptTemp>Sparseness则转到S211,否则转到S210;

S210,将NeighborOptCounter加入到PtArray之中;

S211,NeighborOptCounter=NeighborOptCounter+1;

S212,如果NeighborOptCounter>PtNum则转到S213,否则转到S204;

S213,将PtArray作为NeighborOpt算子的结果返回;

S3,基于PtList,通过NeighborOpt建立稀疏距离邻居列表NeighborList;

S301,建立NeighborList为一个空列表;

S302,稀疏距离邻居计数器NeighborListCounter=1;

S303,建立一个稀疏距离邻居结构体NeighborStruct,该结构体包含以下字段内容:PtArray:最近点列表,为列表由整型元素构成,在结构体初始化时PtArray为空列表;

PtArrayNum:最近点列表中表项的个数;结构体初始化时PtArrayNum值为0;

PtSpacDesc:空间差异矢量关系描述数组,为一个12个元素的数组,结构体初始化时该数组的所有元素值全为0;

S304,设定NeighborStruct.PtArray=利用NeighborOpt进行计算,算子的PtPos=NeighborListCounter,并获得对应结果;

S305,如果NeighborStruct.PtArray的值不是空列表,则设定NeighborStruct.PtArrayNum=NeighborStruct.PtArray中表项的个数;

S306,将NeighborStruct加入到NeighborList之中;

S307,NeighborListCounter=NeighborListCounter+1;

S308,如果NeighborListCounter>PtNum则转到S309,否则转到S303;

S309,第S3步骤处理结束;

S4,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2,返回结果为单一空间差异矢量关系描述数组SingleDesc;

S401,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2;

S402, 建立单一空间差异矢量关系描述数组SingleDesc,SingleDesc为一个12个元素的数组,数组内的所有元素值为0;

S403,空间矢量关系描述算子第一个点变量Pt1=PtList[SpacDescPos1];空间矢量关系描述算子第二个点变量Pt2=PtList[SpacDescPos2];

S404,空间矢量关系描述算子的暂存位置变量SpacDescOptTemp=0;

S405,在X轴方向上的空间距离DescX=(Pt1.PX‑Pt2.PX)/(Sparseness/4);

S406,如果DescX>0则SpacDescOptTemp=1,否则SpacDescOptTemp=3;

S407,如果abs(DescX)>1则SpacDescOptTemp=SpacDescOptTemp+1;其中abs()为计算绝对值;

S408,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;

S409,在Y轴方向上的空间距离DescY=(Pt1.PY‑Pt2.PY)/(Sparseness/4);

S410,如果DescY>0则SpacDescOptTemp=5,否则SpacDescOptTemp=7;

S411,如果abs(DescY)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;

S412,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;

S413,在Z轴方向上的空间距离DescZ=(Pt1.PZ‑Pt2.PZ)/(Sparseness/4);

S414,如果DescZ>0则SpacDescOptTemp=9,否则SpacDescOptTemp=11;

S415,如果abs(DescZ)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;

S416,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;

S417,将SingleDesc作为SpacDescOpt算子的结果返回;

S5,利用SpacDescOpt对NeighborList中的空间差异矢量关系进行计算;

S501,邻近暂存计数器NTempCounter=1;

S502,建立空间差异矢量关系暂存数组NeighborTempArray=建立一个12个元素的数组,数组内的所有元素值为0;

S503,邻近暂存内部计数器NInnerCounter=1;参照位置CountingPos=1;

S504,如果NeighborList[NTempCounter].PtArrayNum=0则转到S510,否则转到S505;

S505,CountingPos=NeighborList[NTempCounter].PtArray[NInnerCounter];

S506,算子结果暂存变量OptTempArray=利用SpacDescOpt进行计算,SpacDescPos1=NTempCounter,SpacDescPos2=CountingPos;

S507,NeighborTempArray=NeighborTempArray+OptTempArray;

S508,NInnerCounter=NInnerCounter+1;

S509,如果NInnerCounter>NeighborList[NTempCounter].PtArrayNum则转到S510,否则转到S504;

S510, NeighborList[NTempCounter].PtSpacDesc=NeighborTempArray;

S511,NTempCounter=NTempCounter+1;

S512, 如果NTempCounter>PtNum这转到S513,否则转到S502;

S513,第S5步骤处理结束;

S6,利用NeighborList对发现异常点并进行删除;

S601,用于删除的计数器DCounter=PtNum;

S602, 如果NeighborList[DCounter].PtArrayNum=0则转到S613;否则转到S603;

S603,邻近空间关系差异数组DiffArray=建立一个12个元素的数组,数组内的所有元素值为0;

S604,第一暂存空间关系SpacTem1=NeighborList[DCounter].PtSpacDesc;

S605,用于删除的内部循环计数器DInner=1;

S606,内部循环参照位置DInnerPos=NeighborList[DCounter].PtArray[DInner];

S607,第二暂存空间关系SpacTem2=NeighborList[DInnerPos].PtSpacDesc;

S608,DiffArray=DiffArray +abs(SpacTem1‑SpacTem2); 其中abs()为计算绝对值;

S609,DInner=DInner+1;

S610,如果DInner>NeighborList[DCounter].PtArrayNum则转到S611,否则转到S606;

S611,最终差异FinalDiff=sum(DiffArray)/(12×NeighborList[DCounter].PtArrayNum); 其中sum为计算一个数组所有元素的和;

S612,如果FinalDiff>1则转到S613,否则转到S614;

S613,在PtList中第DCounter个元素被方法判定为异常点,在PtList中删除第DCounter个元素;

S614,DCounter=DCounter‑1;

S615,如果DCounter<1则转到S616,否则转到S602;

S616,输出删除异常点之后的PtList,整个方法结束。

说明书 :

一种建筑物的三维点云异常点删除方法

技术领域

[0001] 本发明提供一种建筑物的三维点云异常点删除方法,属于大型的地面建筑三维点云数据获取重建和处理方法技术领域。

背景技术

[0002] 对于一些大型的地面建筑对象,可以利用激光雷达、无人机影像三维重建技术快速和低成本的获得其对应的三维点云数据,这些数据可以直接用于电影后期制作、虚拟现实环境构建以及应急演练模拟等领域,具有巨大的经济价值和实用价值。
[0003] 然而现实获取数据的环境会受到风速、大气湿度、光照、尘埃等多种因素影响,进而引起通过激光雷达等设备获得的三维点云中出现较多的异常点;基于这些点产生的三维模型会使得建筑物表面出现错切、不规则的突起等问题。因此,非常有必要删除建筑物的三维点云中的异常点。
[0004] 要删除异常点主要目前采用两种手段:第一种是直接人工目视观察数据,并手动的逐个删除;这种方式需要耗费较多的人力成本,在数据量较大的条件下,删除工作通常难以如期完成。第二种是利用统计上的均值、聚类等方法调整异常点的坐标来实现异常信息的删除,这种方法一定程度上会降低异常点对后期模型的影响,但是也会降低建筑部边界的空间信息量,引起建筑物边角位置出现圆润化、建筑物表面出现波浪状起伏的状况,使得模型细节效果明显下降。

发明内容

[0005] 针对现有技术存在的问题,本发明提供一种建筑物的三维点云异常点删除方法,该方法建立了尺度内最近点列表算子和空间差异矢量关系描述算子,对一个点与其邻近点在一定尺度内的空间关系进行了描述,并基于该描述实现了对建筑物的三维点云异常点删除。
[0006] 本发明提供的一种建筑物的三维点云异常点删除方法,技术解决方案如下:
[0007] S1, 输入建筑物点云数据列表PtList,输入最小识别尺度Scale;计算PtList中点的个数PtNum,计算PtList中最大x坐标MaxX,最小x坐标MinX, 最大y坐标MaxY,最小y坐标MinY,最大z坐标MaxZ,最小z坐标MinZ;计算最大稀疏距离Sparseness;
[0008] S101, 输入建筑物点云列表PtList;PtList为一个列表结构,列表中每一表项为一个点结构体PtStruct;PtStruct描述了三维空间中的一个点,PtStruct包含三个字段:
[0009] PX:空间点所处的x坐标的值;
[0010] PY:空间点所处的y坐标的值;
[0011] PZ:空间点所处的z坐标的值;
[0012] S102,输入最小识别尺度Scale;
[0013] S103,PtNum=PtList中表项的个数;
[0014] S104,MaxX=PtList中所有表项中PX的最大值,MinX=PtList中所有表项中PX的最小值;
[0015] S105, MaxY=PtList中所有表项中PY的最大值,MinY=PtList中所有表项中PY的最小值;
[0016] S106,MaxZ=PtList中所有表项中PZ的最大值,MinZ=PtList中所有表项中PZ的最小值;
[0017] S107,Sparseness=((MaxX‑MinX)/Scale+(MaxY‑MinY)/Scale+(MaxZ‑MinZ)/Scale)/3;
[0018] S2,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos,返回结果为最近点列表PtArray;
[0019] S201,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos;
[0020] S202,最近点列表算子计数器NeighborOptCounter=1;
[0021] S203,建立最近点列表PtArray为一个空的列表;
[0022] S204,如果NeighborOptCounter=PtPos则转到S211;
[0023] S205,x方向距离DX=PtList[PtPos].PX‑PtList[NeighborOptCounter].PX;
[0024] S206,y方向距离DY=PtList[PtPos].PY‑PtList[NeighborOptCounter].PY;
[0025] S207,z方向距离DZ=PtList[PtPos].PZ‑PtList[NeighborOptCounter].PZ;
[0026] S208,最近点列表算子暂存变量NeighborOptTemp=(abs(DX)+abs(DY)+abs(DZ))/3; 其中abs()为计算绝对值;
[0027] S209,如果NeighborOptTemp>Sparseness则转到S211,否则转到S210;
[0028] S210,将NeighborOptCounter加入到PtArray之中;
[0029] S211,NeighborOptCounter=NeighborOptCounter+1;
[0030] S212,如果NeighborOptCounter>PtNum则转到S213,否则转到S204;
[0031] S213,将PtArray作为NeighborOpt算子的结果返回;
[0032] S3,基于PtList,通过NeighborOpt建立稀疏距离邻居列表NeighborList;
[0033] S301,建立NeighborList为一个空列表;
[0034] S302,稀疏距离邻居计数器NeighborListCounter=1;
[0035] S303,建立一个稀疏距离邻居结构体NeighborStruct,该结构体包含以下字段内容:
[0036] PtArray:最近点列表,为列表由整型元素构成,在结构体初始化时PtArray为空列表;
[0037] PtArrayNum:最近点列表中表项的个数;结构体初始化时PtArrayNum值为0;
[0038] PtSpacDesc:空间差异矢量关系描述数组,为一个12个元素的数组,结构体初始化时该数组的所有元素值全为0;
[0039] S304,设定NeighborStruct.PtArray=利用NeighborOpt进行计算,算子的PtPos=NeighborListCounter,并获得对应结果;
[0040] S305,如果NeighborStruct.PtArray的值不是空列表,
[0041] 则设定NeighborStruct.PtArrayNum=NeighborStruct.PtArray中表项的个数;
[0042] S306,将NeighborStruct加入到NeighborList之中;
[0043] S307,NeighborListCounter=NeighborListCounter+1;
[0044] S308,如果NeighborListCounter>PtNum则转到S309,否则转到S303;
[0045] S309,第S3步骤处理结束;
[0046] S4,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2,返回结果为单一空间差异矢量关系描述数组SingleDesc;
[0047] S401,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2;
[0048] S402, 建立单一空间差异矢量关系描述数组SingleDesc,SingleDesc为一个12个元素的数组,数组内的所有元素值为0;
[0049] S403,空间矢量关系描述算子第一个点变量Pt1=PtList[SpacDescPos1];空间矢量关系描述算子第二个点变量Pt2=PtList[SpacDescPos2];
[0050] S404,空间矢量关系描述算子的暂存位置变量SpacDescOptTemp=0;
[0051] S405,在X轴方向上的空间距离DescX=(Pt1.PX‑Pt2.PX)/(Sparseness/4);
[0052] S406,如果DescX>0则SpacDescOptTemp=1,否则SpacDescOptTemp=3;
[0053] S407,如果abs(DescX)>1则SpacDescOptTemp=SpacDescOptTemp+1;其中abs()为计算绝对值;
[0054] S408,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0055] S409,在Y轴方向上的空间距离DescY=(Pt1.PY‑Pt2.PY)/(Sparseness/4);
[0056] S410,如果DescY>0则SpacDescOptTemp=5,否则SpacDescOptTemp=7;
[0057] S411,如果abs(DescY)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;
[0058] S412,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0059] S413,在Z轴方向上的空间距离DescZ=(Pt1.PZ‑Pt2.PZ)/(Sparseness/4);
[0060] S414,如果DescZ>0则SpacDescOptTemp=9,否则SpacDescOptTemp=11;
[0061] S415,如果abs(DescZ)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;
[0062] S416,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0063] S417,将SingleDesc作为SpacDescOpt算子的结果返回;
[0064] S5,利用SpacDescOpt对NeighborList中的空间差异矢量关系进行计算;
[0065] S501,邻近暂存计数器NTempCounter=1;
[0066] S502,建立空间差异矢量关系暂存数组NeighborTempArray=建立一个12个元素的数组,数组内的所有元素值为0;
[0067] S503,邻近暂存内部计数器NInnerCounter=1;参照位置CountingPos=1;
[0068] S504,如果NeighborList[NTempCounter].PtArrayNum=0则转到S510,否则转到S505;
[0069] S505,CountingPos=NeighborList[NTempCounter].PtArray[NInnerCounter];
[0070] S506,算子结果暂存变量OptTempArray=利用SpacDescOpt进行计算,SpacDescPos1=NTempCounter,SpacDescPos2=CountingPos;
[0071] S507,NeighborTempArray=NeighborTempArray+OptTempArray;
[0072] S508,NInnerCounter=NInnerCounter+1;
[0073] S509,如果NInnerCounter>NeighborList[NTempCounter].PtArrayNum则转到S510,否则转到S504;
[0074] S510, NeighborList[NTempCounter].PtSpacDesc=NeighborTempArray;
[0075] S511,NTempCounter=NTempCounter+1;
[0076] S512, 如果NTempCounter>PtNum这转到S513,否则转到S502;
[0077] S513,第S5步骤处理结束;
[0078] S6,利用NeighborList对发现异常点并进行删除;
[0079] S601,用于删除的计数器DCounter=PtNum;
[0080] S602, 如果NeighborList[DCounter].PtArrayNum=0则转到S613;否则转到S603;
[0081] S603,邻近空间关系差异数组DiffArray=建立一个12个元素的数组,数组内的所有元素值为0;
[0082] S604,第一暂存空间关系SpacTem1=NeighborList[DCounter].PtSpacDesc;
[0083] S605,用于删除的内部循环计数器DInner=1;
[0084] S606,内部循环参照位置DInnerPos=NeighborList[DCounter].PtArray[DInner];
[0085] S607,第二暂存空间关系SpacTem2=NeighborList[DInnerPos].PtSpacDesc;
[0086] S608,DiffArray=DiffArray +abs(SpacTem1‑SpacTem2); 其中abs()为计算绝对值;
[0087] S609,DInner=DInner+1;
[0088] S610,如果DInner>NeighborList[DCounter].PtArrayNum则转到S611,否则转到S606;
[0089] S611,最终差异FinalDiff=sum(DiffArray)/(12×NeighborList[DCounter].PtArrayNum);
[0090] 其中sum为计算一个数组所有元素的和;
[0091] S612,如果FinalDiff>1则转到S613,否则转到S614;
[0092] S613,在PtList中第DCounter个元素被方法判定为异常点,在PtList中删除第DCounter个元素;
[0093] S614,DCounter=DCounter‑1;
[0094] S615,如果DCounter<1则转到S616,否则转到S602;
[0095] S616,输出删除异常点之后的PtList,整个方法结束。
[0096] 本发明的有益效果是:
[0097] 建立了尺度内最近点列表算子和空间差异矢量关系描述算子,对一个点与其邻近点在一定尺度内的空间关系进行了描述,并基于该描述实现了对建筑物的三维点云异常点删除。利用本发明专利,可以在一定尺度范围内,发现一个空间点与其邻域点在空间关系上,并选择寻找在空间关系上的异常情况,基于该异常实现异常点的发现和删除;克服了传统利用统计上的均值、聚类对调整异常点坐标进行删除等方法存在的缺欠,避免了降低异常点对后期模型的影响,降低建筑部边界的空间信息量,引起建筑物边角位置出现圆润化、建筑物表面出现波浪状起伏的状况,使得模型细节效果明显下降。

附图说明

[0098] 图1为实施例2 PtList对应点云描述的立方体所有点渲染图;
[0099] 图2为实施例2删除了异常点的渲染效果图。

具体实施方式

[0100] 通过以下实施例进一步举例描述本发明,并不以任何方式限制本发明,在不背离本发明的技术解决方案的前提下,对本发明所作的本领域普通技术人员容易实现的任何改动或改变都将落入本发明的权利要求范围之内。
[0101] 实施例1
[0102] S1, 输入建筑物点云数据列表PtList,输入最小识别尺度Scale;计算PtList中点的个数PtNum,计算PtList中最大x坐标MaxX,最小x坐标MinX, 最大y坐标MaxY,最小y坐标MinY,最大z坐标MaxZ,最小z坐标MinZ;计算最大稀疏距离Sparseness;
[0103] S101, 输入建筑物点云列表PtList;PtList为一个列表结构,列表中每一表项为一个点结构体PtStruct;PtStruct描述了三维空间中的一个点,PtStruct包含三个字段:
[0104] PX:空间点所处的x坐标的值;
[0105] PY:空间点所处的y坐标的值;
[0106] PZ:空间点所处的z坐标的值;
[0107] S102,输入最小识别尺度Scale;
[0108] S103,PtNum=PtList中表项的个数;
[0109] S104,MaxX=PtList中所有表项中PX的最大值,MinX=PtList中所有表项中PX的最小值;
[0110] S105, MaxY=PtList中所有表项中PY的最大值,MinY=PtList中所有表项中PY的最小值;
[0111] S106,MaxZ=PtList中所有表项中PZ的最大值,MinZ=PtList中所有表项中PZ的最小值;
[0112] S107,Sparseness=((MaxX‑MinX)/Scale+(MaxY‑MinY)/Scale+(MaxZ‑MinZ)/Scale)/3;
[0113] S2,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos,返回结果为最近点列表PtArray;
[0114] S201,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos;
[0115] S202,最近点列表算子计数器NeighborOptCounter=1;
[0116] S203,建立最近点列表PtArray为一个空的列表;
[0117] S204,如果NeighborOptCounter=PtPos则转到S211;
[0118] S205,x方向距离DX=PtList[PtPos].PX‑PtList[NeighborOptCounter].PX;
[0119] S206,y方向距离DY=PtList[PtPos].PY‑PtList[NeighborOptCounter].PY;
[0120] S207,z方向距离DZ=PtList[PtPos].PZ‑PtList[NeighborOptCounter].PZ;
[0121] S208,最近点列表算子暂存变量NeighborOptTemp=(abs(DX)+abs(DY)+abs(DZ))/3; 其中abs()为计算绝对值;
[0122] S209,如果NeighborOptTemp>Sparseness则转到S211,否则转到S210;
[0123] S210,将NeighborOptCounter加入到PtArray之中;
[0124] S211,NeighborOptCounter=NeighborOptCounter+1;
[0125] S212,如果NeighborOptCounter>PtNum则转到S213,否则转到S204;
[0126] S213,将PtArray作为NeighborOpt算子的结果返回;
[0127] S3,基于PtList,通过NeighborOpt建立稀疏距离邻居列表NeighborList;
[0128] S301,建立NeighborList为一个空列表;
[0129] S302,稀疏距离邻居计数器NeighborListCounter=1;
[0130] S303,建立一个稀疏距离邻居结构体NeighborStruct,该结构体包含以下字段内容:
[0131] PtArray:最近点列表,为列表由整型元素构成,在结构体初始化时PtArray为空列表;
[0132] PtArrayNum:最近点列表中表项的个数;结构体初始化时PtArrayNum值为0;
[0133] PtSpacDesc:空间差异矢量关系描述数组,为一个12个元素的数组,结构体初始化时该数组的所有元素值全为0;
[0134] S304,设定NeighborStruct.PtArray=利用NeighborOpt进行计算,算子的PtPos=NeighborListCounter,并获得对应结果;
[0135] S305,如果NeighborStruct.PtArray的值不是空列表,
[0136] 则设定NeighborStruct.PtArrayNum=NeighborStruct.PtArray中表项的个数;
[0137] S306,将NeighborStruct加入到NeighborList之中;
[0138] S307,NeighborListCounter=NeighborListCounter+1;
[0139] S308,如果NeighborListCounter>PtNum则转到S309,否则转到S303;
[0140] S309,第S3步骤处理结束;
[0141] S4,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2,返回结果为单一空间差异矢量关系描述数组SingleDesc;
[0142] S401,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2;
[0143] S402, 建立单一空间差异矢量关系描述数组SingleDesc,SingleDesc为一个12个元素的数组,数组内的所有元素值为0;
[0144] S403,空间矢量关系描述算子第一个点变量Pt1=PtList[SpacDescPos1];空间矢量关系描述算子第二个点变量Pt2=PtList[SpacDescPos2];
[0145] S404,空间矢量关系描述算子的暂存位置变量SpacDescOptTemp=0;
[0146] S405,在X轴方向上的空间距离DescX=(Pt1.PX‑Pt2.PX)/(Sparseness/4);
[0147] S406,如果DescX>0则SpacDescOptTemp=1,否则SpacDescOptTemp=3;
[0148] S407,如果abs(DescX)>1则SpacDescOptTemp=SpacDescOptTemp+1;其中abs()为计算绝对值;
[0149] S408,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0150] S409,在Y轴方向上的空间距离DescY=(Pt1.PY‑Pt2.PY)/(Sparseness/4);
[0151] S410,如果DescY>0则SpacDescOptTemp=5,否则SpacDescOptTemp=7;
[0152] S411,如果abs(DescY)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;
[0153] S412,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0154] S413,在Z轴方向上的空间距离DescZ=(Pt1.PZ‑Pt2.PZ)/(Sparseness/4);
[0155] S414,如果DescZ>0则SpacDescOptTemp=9,否则SpacDescOptTemp=11;
[0156] S415,如果abs(DescZ)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;
[0157] S416,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0158] S417,将SingleDesc作为SpacDescOpt算子的结果返回;
[0159] S5,利用SpacDescOpt对NeighborList中的空间差异矢量关系进行计算;
[0160] S501,邻近暂存计数器NTempCounter=1;
[0161] S502,建立空间差异矢量关系暂存数组NeighborTempArray=建立一个12个元素的数组,数组内的所有元素值为0;
[0162] S503,邻近暂存内部计数器NInnerCounter=1;参照位置CountingPos=1;
[0163] S504,如果NeighborList[NTempCounter].PtArrayNum=0则转到S510,否则转到S505;
[0164] S505,CountingPos=NeighborList[NTempCounter].PtArray[NInnerCounter];
[0165] S506,算子结果暂存变量OptTempArray=利用SpacDescOpt进行计算,SpacDescPos1=NTempCounter,SpacDescPos2=CountingPos;
[0166] S507,NeighborTempArray=NeighborTempArray+OptTempArray;
[0167] S508,NInnerCounter=NInnerCounter+1;
[0168] S509,如果NInnerCounter>NeighborList[NTempCounter].PtArrayNum则转到S510,否则转到S504;
[0169] S510, NeighborList[NTempCounter].PtSpacDesc=NeighborTempArray;
[0170] S511,NTempCounter=NTempCounter+1;
[0171] S512, 如果NTempCounter>PtNum这转到S513,否则转到S502;
[0172] S513,第S5步骤处理结束;
[0173] S6,利用NeighborList对发现异常点并进行删除;
[0174] S601,用于删除的计数器DCounter=PtNum;
[0175] S602, 如果NeighborList[DCounter].PtArrayNum=0则转到S613;否则转到S603;
[0176] S603,邻近空间关系差异数组DiffArray=建立一个12个元素的数组,数组内的所有元素值为0;
[0177] S604,第一暂存空间关系SpacTem1=NeighborList[DCounter].PtSpacDesc;
[0178] S605,用于删除的内部循环计数器DInner=1;
[0179] S606,内部循环参照位置DInnerPos=NeighborList[DCounter].PtArray[DInner];
[0180] S607,第二暂存空间关系SpacTem2=NeighborList[DInnerPos].PtSpacDesc;
[0181] S608,DiffArray=DiffArray +abs(SpacTem1‑SpacTem2); 其中abs()为计算绝对值;
[0182] S609,DInner=DInner+1;
[0183] S610,如果DInner>NeighborList[DCounter].PtArrayNum则转到S611,否则转到S606;
[0184] S611,最终差异FinalDiff=sum(DiffArray)/(12×NeighborList[DCounter].PtArrayNum); 其中sum为计算一个数组所有元素的和;
[0185] S612,如果FinalDiff>1则转到S613,否则转到S614;
[0186] S613,在PtList中第DCounter个元素被方法判定为异常点,在PtList中删除第DCounter个元素;
[0187] S614,DCounter=DCounter‑1;
[0188] S615,如果DCounter<1则转到S616,否则转到S602;
[0189] S616,输出删除异常点之后的PtList,整个方法结束。
[0190] 实施例2
[0191] S1, 输入建筑物点云数据列表PtList,输入最小识别尺度Scale;计算PtList中点的个数PtNum,计算PtList中最大x坐标MaxX,最小x坐标MinX, 最大y坐标MaxY,最小y坐标MinY,最大z坐标MaxZ,最小z坐标MinZ;计算最大稀疏距离Sparseness;
[0192] S101, 输入建筑物点云列表PtList;PtList为一个列表结构,列表中每一表项为一个点结构体PtStruct;PtStruct描述了三维空间中的一个点,PtStruct包含三个字段:
[0193] PX:空间点所处的x坐标的值;
[0194] PY:空间点所处的y坐标的值;
[0195] PZ:空间点所处的z坐标的值;
[0196] S102,输入最小识别尺度Scale;
[0197] S103,PtNum=PtList中表项的个数;
[0198] S104,MaxX=PtList中所有表项中PX的最大值,MinX=PtList中所有表项中PX的最小值;
[0199] S105, MaxY=PtList中所有表项中PY的最大值,MinY=PtList中所有表项中PY的最小值;
[0200] S106,MaxZ=PtList中所有表项中PZ的最大值,MinZ=PtList中所有表项中PZ的最小值;
[0201] S107,Sparseness=((MaxX‑MinX)/Scale+(MaxY‑MinY)/Scale+(MaxZ‑MinZ)/Scale)/3;
[0202] 输入PtList,PtList对应点云描述了一个立方体,该立方体所有点渲染之后如图1所示:输入Scale=5;
[0203] 计算PtList中点的个数PtNum=2310,计算PtList中最大x坐标MaxX=100,最小x坐标MinX=0, 最大y坐标MaxY=100,最小y坐标MinY=0,最大z坐标MaxZ=100,最小z坐标MinZ=0;计算最大稀疏距离Sparseness=20。
[0204] S2,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos,返回结果为最近点列表PtArray;
[0205] S201,建立尺度内最近点列表算子NeighborOpt,NeighborOpt输入为点列表索引位置变量PtPos;
[0206] S202,最近点列表算子计数器NeighborOptCounter=1;
[0207] S203,建立最近点列表PtArray为一个空的列表;
[0208] S204,如果NeighborOptCounter=PtPos则转到S211;
[0209] S205,x方向距离DX=PtList[PtPos].PX‑PtList[NeighborOptCounter].PX;
[0210] S206,y方向距离DY=PtList[PtPos].PY‑PtList[NeighborOptCounter].PY;
[0211] S207,z方向距离DZ=PtList[PtPos].PZ‑PtList[NeighborOptCounter].PZ;
[0212] S208,最近点列表算子暂存变量NeighborOptTemp=(abs(DX)+abs(DY)+abs(DZ))/3; 其中abs()为计算绝对值;
[0213] S209,如果NeighborOptTemp>Sparseness则转到S211,否则转到S210;
[0214] S210,将NeighborOptCounter加入到PtArray之中;
[0215] S211,NeighborOptCounter=NeighborOptCounter+1;
[0216] S212,如果NeighborOptCounter>PtNum则转到S213,否则转到S204;
[0217] S213,将PtArray作为NeighborOpt算子的结果返回。
[0218] S3,基于PtList,通过NeighborOpt建立稀疏距离邻居列表NeighborList;
[0219] S301,建立NeighborList为一个空列表;
[0220] S302,稀疏距离邻居计数器NeighborListCounter=1;
[0221] S303,建立一个稀疏距离邻居结构体NeighborStruct,该结构体包含以下字段内容:
[0222] PtArray:最近点列表,为列表由整型元素构成,在结构体初始化时PtArray为空列表;
[0223] PtArrayNum:最近点列表中表项的个数;结构体初始化时PtArrayNum值为0;
[0224] PtSpacDesc: 空间差异矢量关系描述数组,为一个12个元素的数组,结构体初始化时该数组的所有元素值全为0;
[0225] S304,设定NeighborStruct.PtArray =利用NeighborOpt进行计算,算子的PtPos=NeighborListCounter,并获得对应结果;
[0226] S305,如果NeighborStruct.PtArray的值不是空列表,则设定NeighborStruct.PtArrayNum=NeighborStruct.PtArray中表项的个数;
[0227] S306,将NeighborStruct加入到NeighborList之中;
[0228] S307,NeighborListCounter=NeighborListCounter+1;
[0229] S308,如果NeighborListCounter>PtNum则转到S309,否则转到S303;
[0230] S309,第S3步骤处理结束。
[0231] S4,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2,返回结果为单一空间差异矢量关系描述数组SingleDesc;
[0232] S401,建立空间差异矢量关系描述算子SpacDescOpt, SpacDescOpt输入为第一待计算索引SpacDescPos1和第二待计算索引SpacDescPos2;
[0233] S402, 建立单一空间差异矢量关系描述数组SingleDesc,SingleDesc为一个12个元素的数组,数组内的所有元素值为0;
[0234] S403,空间矢量关系描述算子第一个点变量Pt1=PtList[SpacDescPos1];空间矢量关系描述算子第二个点变量Pt2=PtList[SpacDescPos2];
[0235] S404,空间矢量关系描述算子的暂存位置变量SpacDescOptTemp=0;
[0236] S405,在X轴方向上的空间距离DescX=(Pt1.PX‑Pt2.PX)/(Sparseness/4);
[0237] S406,如果DescX>0则SpacDescOptTemp=1,否则SpacDescOptTemp=3;
[0238] S407,如果abs(DescX)>1则SpacDescOptTemp=SpacDescOptTemp+1;其中abs()为计算绝对值;
[0239] S408,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0240] S409,在Y轴方向上的空间距离DescY=(Pt1.PY‑Pt2.PY)/(Sparseness/4);
[0241] S410,如果DescY>0则SpacDescOptTemp=5,否则SpacDescOptTemp=7;
[0242] S411,如果abs(DescY)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;
[0243] S412,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0244] S413,在Z轴方向上的空间距离DescZ=(Pt1.PZ‑Pt2.PZ)/(Sparseness/4);
[0245] S414,如果DescZ>0则SpacDescOptTemp=9,否则SpacDescOptTemp=11;
[0246] S415,如果abs(DescZ)>1则SpacDescOptTemp=SpacDescOptTemp+1; 其中abs()为计算绝对值;
[0247] S416,SingleDesc[SpacDescOptTemp]=SingleDesc[SpacDescOptTemp]+1;
[0248] S417,将SingleDesc作为SpacDescOpt算子的结果返回。
[0249] S5,利用SpacDescOpt对NeighborList中的空间差异矢量关系进行计算;
[0250] S501,邻近暂存计数器NTempCounter=1;
[0251] S502,建立空间差异矢量关系暂存数组NeighborTempArray=建立一个12个元素的数组,数组内的所有元素值为0;
[0252] S503,邻近暂存内部计数器NInnerCounter=1;参照位置CountingPos=1;
[0253] S504,如果NeighborList[NTempCounter].PtArrayNum=0则转到S510,否则转到S505;
[0254] S505,CountingPos=NeighborList[NTempCounter].PtArray[NInnerCounter];
[0255] S506,算子结果暂存变量OptTempArray=利用SpacDescOpt进行计算,SpacDescPos1=NTempCounter,SpacDescPos2=CountingPos;
[0256] S507,NeighborTempArray=NeighborTempArray+OptTempArray;
[0257] S508,NInnerCounter=NInnerCounter+1;
[0258] S509,如果NInnerCounter>NeighborList[NTempCounter].PtArrayNum则转到S510,否则转到S504;
[0259] S510, NeighborList[NTempCounter].PtSpacDesc=NeighborTempArray;
[0260] S511,NTempCounter=NTempCounter+1;
[0261] S512, 如果NTempCounter>PtNum这转到S513,否则转到S502。
[0262] S513,第S5步骤处理结束。
[0263] S6,利用NeighborList对发现异常点并进行删除;
[0264] S601,用于删除的计数器DCounter=PtNum;
[0265] S602, 如果NeighborList[DCounter].PtArrayNum=0则转到S613;否则转到S603;
[0266] S603,邻近空间关系差异数组DiffArray=建立一个12个元素的数组,数组内的所有元素值为0;
[0267] S604,第一暂存空间关系SpacTem1=NeighborList[DCounter].PtSpacDesc;
[0268] S605,用于删除的内部循环计数器DInner=1;
[0269] S606,内部循环参照位置DInnerPos=NeighborList[DCounter].PtArray[DInner];
[0270] S607,第二暂存空间关系SpacTem2=NeighborList[DInnerPos].PtSpacDesc;
[0271] S608,DiffArray=DiffArray +abs(SpacTem1‑SpacTem2); 其中abs()为计算绝对值。
[0272] S609,DInner=DInner+1;
[0273] S610,如果DInner>NeighborList[DCounter].PtArrayNum则转到S611,否则转到S606;
[0274] S611,最终差异FinalDiff=sum(DiffArray)/(12×NeighborList[DCounter].PtArrayNum); 其中sum为计算一个数组所有元素的和。
[0275] S612,如果FinalDiff>1则转到S613,否则转到S614
[0276] S613,在PtList中第DCounter个元素被方法判定为异常点,在PtList中删除第DCounter个元素;
[0277] S614,DCounter=DCounter‑1;
[0278] S615,如果DCounter<1则转到S616,否则转到S602;
[0279] S616,输出删除异常点之后的PtList,整个方法结束。
[0280] 输出的PtList删除了异常点,这些点的渲染效果如图2所示:
[0281] 可以看到,本专利提供的方法成功删除了在PtList中在空间关系上的异常点,并能够保持原有的平面与边角关系,达到了很好地异常点删除效果。
[0282] 实施例3
[0283] 引入100个典型的建筑物点云模型,并每个模型按照已有点云数量的1%在表面上随机添加异常点,本发明提供的方法与K‑Means方法异常检测、EM方法异常检测、决策树方法异常检测进行对比,对比的结果如下:
[0284]  方法 异常点被删除比例 正常点被误删本发明 93.23% 2.7%
K‑Means方法异常检测 75.11%  12.2%
EM方法异常检测 82.65%  7.60%
决策树方法异常检测 81.34%  8.45%
[0285] 结论:从以上表格可以看出,本发明方法可以更准确的找到大多数异常点并删除,对于正常点被误删的比例也明显低于其他方法。