本发明涉及一种激光雷达单木分块识别方法。
背景技术:
激光雷达能够直接测量地物的三维空间结构,按照一定频率发射激光脉冲,记录来自地面和来自森林冠层的返回信号能量分布或离散点云(回波),发射能量和返回能量具有波形特征,通过波形分解可以得到离散点云。
通过分层分类处理,将离散点云被分为地面点和非地面点,非地面点再分为植被点和非植被点,离散地面点内插生成数字高程模型(DEM)栅格,离散植被点内插生成数字表面模型(DSM)栅格,由DSM减去DEM得到数字冠层模型(CHM)栅格,高空间分辨率的CHM能够精细反映森林冠层上表面的空间分布,用于提取单木特征因子。
通过CHM识别单木的方法分为两类,第一类方法是先通过局部最大值算法识别潜在树冠顶点作为种子点,然后通过多项式拟合树冠主方向边界或区域生长识别树冠边界,这类方法依赖于树冠约束规则;第二类方法是先通过图像分割算法将CHM分割为不同斑块,斑块边界作为树冠边界,然后提取斑块内最大值作为树冠顶点,这类方法容易将树冠之间的空隙分割为树冠的一部分。
单木树冠一般表现为中间高边缘低特征,由于树冠内枝叶分布的非均匀性,树冠上表面存在一些低值凹陷区,这些区域容易造成树冠边缘判别规则提前终止,造成误判树冠边界,需要对树冠边缘内的低值凹陷区进行平滑,常规平滑算法会对全部树冠点进行平滑,使得树冠上较高点的高度变小,树冠上较低点的高度变大,即树冠上表面点之间高度差异整体上变小。为了仅对低值凹陷区进行平滑处理,需要对平滑算法进行约束。
单木树冠顶点一般为局部最大值,由于存在测量误差,并非所有局部最大值均为树冠顶点,需要对局部最大值进行约束。
对于单个树冠,从树冠顶点到树冠边缘,树冠点高度应当连续变化,由于存在低值凹陷区,相邻树冠点高度容易出现急剧变化,导致误判树冠边界,需要对树冠边界判别规则进行约束。
对于成片生长的连续树冠,树冠之间的凹陷区可以看作是树冠边界,由于树冠形状的不规则性,树冠内部的凹陷区可能被误判为树冠边界,需要对树冠边界判别规则进行约束。
对于大区域CHM来说,由于计算机性能限制,需要对CHM进行分块处理,考虑到树冠可能位于不同的块内,需要对块进行缓冲处理,另外,CHM四角块和四边块的缓冲区不同于CHM内部块的缓冲区,需要针对CHM不同位置块进行特殊缓冲处理。
技术实现要素:
本发明要解决的技术问题是克服现有技术中之不足,提供一种实现能够对大数据量激光雷达CHM进行处理,高效识别单木树冠边界,用于单木因子提取和林分因子提取的激光雷达单木分块识别方法。
为解决上述问题,本发明采用如下技术方案:
一种激光雷达单木分块识别方法,包括CHM分块、CHM低值凹陷区平滑、CHM树冠顶点识别和CHM树冠边界识别;
CHM分块:
按照一定的块尺寸和缓冲区尺寸将CHM分为若干个块,在块边界约束范围内识别树冠顶点,在块和缓冲区约束范围内识别树冠边界;
CHM分块约束条件:
a.块尺寸要大于单个树冠范围,分块识别算法内存消耗要小于计算机可用内存;
b.缓冲区要大于单个树冠范围,小于块尺寸;
CHM低值凹陷区平滑:
比较当前像元高度值与8邻域像元高度值,统计大于当前像元高度值的邻域像元个数N,如果N大于等于5,则表示当前像元位于低值凹陷区,需要进行平滑处理,否则不平滑;
CHM平滑约束条件:
a.CHM平滑仅使用树冠上点;
b.CHM树冠点高度高于指定阈值;
CHM树冠顶点识别:
CHM树冠顶点高度大于其它树冠点高度,通过局部最大值算法可以搜索潜在树冠顶点,搜索窗口尺寸采用固定值;
搜索窗口尺寸约束条件:
a.搜索窗口尺寸大于等于最小冠幅;
b.搜索窗口尺寸小于等于树高;
CHM树冠边界识别:
CHM树冠边界是树冠上最外围的点,树冠顶点与树冠边界之间还存在其它树冠点;
判断树冠边界的约束条件:
a.树冠半径小于树高;
b.树冠边界点高度大于指定阈值;
c.树冠边界点高度小于树冠顶点高度;
d.树冠边界点高度与树冠顶点高度之比大于指定阈值;
e.树冠边界点张角小于指定阈值。
进一步的,CHM分块:
若CHM栅格尺寸为XRastSize和YRastSize,块索引为XTileIndex和YTileIndex,块尺寸为XTileSize和YTileSize,缓冲区尺寸为BuffSize,将块和缓冲区合并在一起的区域称为扩展块,针对不同位置的块和扩展块,定义其在栅格中的偏移量和有效尺寸;
对于不同位置的块,其在栅格中的偏移量和有效尺寸定义如下:第一行块中左上角块在栅格中偏移量和有效尺寸为:
XOffset=0
YOffset=0
XValidSize=XTileSize
YValidSize=YTileSize
第一行块中位于左上角块和右上角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=0
XValidSize=XTileSize
YValidSize=YTileSize
第一行块中右上角块在栅格中偏移量和尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=0
XValidSize=XRastSize-(XTileIndex*XTileSize)
YValidSize=YTileSize
第一列块中位于左上角块和左下角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=0
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YTileSize
最后一列块中位于右上角块和右下角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XRastSize-(XTileIndex*XTileSize)
YValidSize=YTileSize
最后一行块中左下角块在栅格中偏移量和有效尺寸为:
XOffset=0
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YRastSize-(YTileIndex*YTileSize)
最后一行块中位于左下角块和右下角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YRastSize-(YTileIndex*YTileSize)
最后一行块中右下角块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XRastSize-(XTileIndex*XTileSize)
YValidSize=YRastSize-(YTileIndex*YTileSize)
中间块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YTileSize
对于不同位置的扩展块,其在栅格中的偏移量和有效尺寸定义如下:
第一行块中左上角扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=0
YOffsetEx=0
XValidSizeEx=XTileSize+BuffSize
YValidSizeEx=YTileSize+BuffSize
第一行块中位于左上角块和右上角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=0
XValidSizeEx=XTileSize+2*BuffSize
YValidSizeEx=YTileSize+BuffSize
第一行块中右上角扩展块在栅格中偏移量和尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=0
XValidSizeEx=XRastSize-(XTileIndex*XTileSize-BuffSize)
YValidSizeEx=YTileSize+BuffSize
第一列块中位于左上角块和左下角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=0
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+BuffSize
YValidSizeEx=YTileSize+2*BuffSize
最后一列块中位于右上角块和右下角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XRastSize-(XTileIndex*XTileSize-BuffSize)
YValidSizeEx=YTileSize+2*BuffSize
最后一行块中左下角扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=0
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+BuffSize
YValidSizeEx=YRastSize-(YTileIndex*YTileSize-BuffSize)
最后一行块中位于左下角块和右下角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+2*BuffSize
YValidSizeEx=YRastSize-(YTileIndex*YTileSize-BuffSize)
最后一行块中右下角扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XRastSize-(XTileIndex*XTileSize-BuffSize)
YValidSizeEx=YRastSize-(YTileIndex*YTileSize-BuffSize)
中间扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+2*BuffSize
YValidSizeEx=YTileSize+2*BuffSize。
进一步的,CHM树冠顶点识别:
若当前块在栅格中偏移量为XOffset和YOffset,有效尺寸为XValidSize和YValidSize,搜索窗口半径为SearchRadius,针对不同位置的块,定义树冠顶点搜索区域在栅格中的位置;
第一行块中左上角块搜索区域在栅格中的位置为:
XSearchBeg=SearchRadius
YSearchBeg=SearchRadius
XSearchEnd=XValidSize
YSearchEnd=YValidSize
第一行块中位于左上角块和右上角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=XOffset
YSearchBeg=SearchRadius
XSearchEnd=XValidSize
YSearchEnd=YValidSize
第一行块中右上角块搜索区域在栅格中的位置为:
XSearchBeg=XOffset
YSearchBeg=SearchRadius
XSearchEnd=XValidSize-SearchRadius
YSearchEnd=YValidSize
第一列块中位于左上角块和左下角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=SearchRadius
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize
最后一列块中位于右上角块和右下角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=XOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize-SearchRadius
YSearchEnd=YValidSize
最后一行块中左下角块搜索区域在栅格中的位置为:
XSearchBeg=SearchRadius
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize-SearchRadius
最后一行块中位于左下角块和右下角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=YOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize-SearchRadius
最后一行块中右下角块搜索区域在栅格中的位置为:
XSearchBeg=YOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize-SearehRadius
YSearchEnd=YValidSize-SearchRadius
中间块搜索区域在栅格中的位置为:
XSearchBeg=YOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize
考虑到树冠尺寸与树高之间的关系,局部最大值算法的约束条件为:
树高应大于指定阈值。
如果当前像元的位置偏移量为i,j,当前像元值记为Vi,j,搜索窗口半径为r,搜索窗口内其它像元记为Vi+k,j+k,如果当前像元高度大于搜索窗口内其它像元高度,则当前像元为潜在树冠顶点。
进一步的,CHM树冠边界识别:
树冠边界点张角定义为树冠边界点相对于树冠边界点投影位置与树冠顶点投影位置之间的张角,若树冠边界点与树冠顶点之间的水平距离为D,树冠边界点高度为H,则树冠边界点张角为D与H之比的反正切角:
若相邻树冠有重叠,判断相邻树冠边界的约束条件为:
按照树高与树冠半径呈比例关系确定重叠树冠点所属树冠;
若树冠1的顶点高度为h1,树冠1的顶点位置为x1和y1,树冠2的顶点高度为h2,树冠2的顶点位置为x2和y2,重叠区树冠点位置为xc和yc,重叠区树冠点与树冠1顶点位置之间的距离为D1,重叠区树冠点与树冠2顶点位置之间的距离为D2,若D1与h1之比小于D2与h2之比,则重叠区树冠点属于树冠1,否则属于树冠2;若D1与h1之比等于D2与h2之比,且h1小于h2,则重叠区树冠点属于树冠1,否则属于树冠2;
根据扩展块创建不相交集森林集合,依次处理每个树冠顶点相关的树冠区域,更新不相交集森林集合;处理完所有树冠区域之后,根据不相交集森林集合对扩展块进行树冠区域编码,每个树冠区域采用唯一编码;依次遍历每个树冠顶点,对于每个树冠边界,按顺时针方向查找树冠边界点,从扩展块编码中矢量化树冠边界;
1)创建不相交集森林集合
不相交集森林集合的元素个数为:XValidSize*YValidSize
不相交集森林集合的每个元素索引等于像元索引,等级(Rank)初始化为0,尺寸(Size)初始化为1,父结点(Parent)初始化为像元索引;
2)识别单个树冠区域
从当前树冠顶点的位置开始向左移动,根据单个树冠约束规则判断左侧像元是否为树冠点,若不是树冠点则终止左侧像元判断,否则根据不相交集森林集合判断左侧像元是否已标记为其它树冠,若已标记为其它树冠,则根据连续树冠约束规则判断左侧像元是属于当前树冠还是其它树冠,若属于其它树冠则终止左侧像元判断,若不属于其它树冠,则在不相交集森林集合中将左侧像元的父结点标记为当前树冠;
若左侧像元属于当前树冠,则继续向左移动,按照单个树冠和连续树冠约束规则,判断下一个左侧像元是否属于当前树冠,若属于当前树冠,则更新不相交集森林集合,直到左侧像元不属于当前树冠,终止向左移动;
从当前树冠顶点的位置开始右侧移动,按照单个树冠和连续树冠约束规则,判别右侧像元是否属于当前树冠,若属于当前树冠,则更新不相交集森林集合,直到右侧像元不属于当前树冠,终止向右移动;
从当前树冠顶点的位置开始向上移动,按照单个树冠和连续树冠约束规则,判断上方像元是否属于当前树冠,若上方像元属于当前树冠,则更新不相交集森林集合;然后从上方像元连续向左侧移动,直至被判断像元不属于当前树冠;然后从上方像元连续向右移动,直至被判断像元不属于当前树冠;当判断完上方像元的左侧像元和右侧像元之后,继续向上移动,判断下一个上方像元,直至判断完上方像元,终止向上移动;
从当前树冠顶点的位置开始向下移动,按照单个树冠和连续树冠约束规则,判断下方像元是否属于当前树冠,若下方像元属于当前树冠,则更新不相交集森林集合;然后从下方像元连续向左侧移动,直至被判断像元不属于当前树冠;然后从下方像元连续向右移动,直至被判断像元不属于当前树冠;当判断完下方像元的左侧像元和右侧像元之后,继续向下移动,判断下一个下方像元,直至判断完下方像元,终止向下移动;
3)识别全部树冠区域
遍历树冠顶点,采用识别单个树冠区域的过程,识别全部树冠区域;
4)扩展块树冠编码
根据不相交集森林集合,查找每个元素的根结点,由根结点对扩展块的每个像元进行编码;
若干不相交集森林集合中元素的尺寸(Size)大于1,则扩展块的对应像元标记为根结点值,否则扩展块的对应像元标记为0;
5)矢量化单个树冠边界
从当前树冠顶点所在像元向上移动,找到最上面的树冠边界像元作为树冠边界矢量化的开始像元,将开始像元左上角坐标保存为树冠边界开始点;
按顺时针方向查找下一个边界点,分为4个方向迭代判别下一个边界点,首先迭代判别右侧像元边界点,自动迭代其它方向像元边界点;
迭代判别右侧像元边界点,将当前像元右上角坐标保存为下一个树冠边界点,如果右侧像元不属于当前树冠,则迭代判别下方像元边界点;如果右侧像元属于当前树冠,则继续判断右侧像元的上方像元是否属于当前树冠,如果右侧像元的上方像元属于当前树冠,则迭代判别右侧像元的上方像元边界点;如果右侧像元的上方像元不属于当前树冠,则迭代判别右侧像元的右侧像元边界点;
迭代判别下方像元边界点,将当前像元右下角坐标保存为下一个树冠边界点,如果下方像元不属于当前树冠,则迭代判别左侧像元边界点;如果下方像元属于当前树冠,则继续判断下方像元的右侧像元是否属于当前树冠,如果下方像元的右侧像元属于当前树冠,则迭代判别下方像元的右侧像元边界点;如果下方像元的右侧像元不属于当前树冠,则迭代判别下方像元的下方像元边界点;
迭代判别左侧像元边界点,将当前像元左下角坐标保存为下一个树冠边界点,如果左侧像元不属于当前树冠,则迭代判别上方像元边界点;如果左侧像元属于当前树冠,则继续判断左侧像元的下方像元是否属于当前树冠,如果左侧像元的下方像元属于当前树冠,则迭代判别左侧像元的下方像元边界点;如果左侧像元的下方像元不属于当前树冠,则迭代判别左侧像元的左侧像元边界点;
迭代判别上方像元边界点,将当前像元左上角坐标保存为下一个树冠边界点,如果上方像元不属于当前树冠,则迭代判别右侧像元边界点;如果上方像元属于当前树冠,则继续判断上方像元的左侧像元是否属于当前树冠,如果上方像元的左侧像元属于当前树冠,则迭代判别上方像元的左侧像元边界点;如果上方像元的左侧像元不属于当前树冠,则迭代判别上方像元的上方像元边界点;
如果当前像元的位置等于开始像元的位置,表示完成单个树冠边界矢量化;
6)矢量化全部树冠边界
遍历树冠顶点,采用矢量化单个树冠边界的过程,矢量化全部树冠边界。
本发明的有益效果为:由于设置有CHM分块、CHM低值凹陷区平滑、CHM树冠顶点识别和CHM树冠边界识别,能够对大数据量激光雷达CHM进行处理,高效识别单木树冠边界,用于单木因子提取和林分因子提取。
附图说明
图1为本发明一种激光雷达单木分块识别装置的结构框图。
具体实施方式
如图1所示,一种激光雷达单木分块识别方法,包括CHM分块、CHM低值凹陷区平滑、CHM树冠顶点识别和CHM树冠边界识别;
CHM分块:
按照一定的块尺寸和缓冲区尺寸将CHM分为若干个块,在块边界约束范围内识别树冠顶点,在块和缓冲区约束范围内识别树冠边界;
CHM分块约束条件:
a.块尺寸要大于单个树冠范围,分块识别算法内存消耗要小于计算机可用内存;
b.缓冲区要大于单个树冠范围,小于块尺寸;
CHM低值凹陷区平滑:
比较当前像元高度值与8邻域像元高度值,统计大于当前像元高度值的邻域像元个数N,如果N大于等于5,则表示当前像元位于低值凹陷区,需要进行平滑处理,否则不平滑:
CHM平滑约束条件:
a.CHM平滑仅使用树冠上点;
b.CHM树冠点高度高于指定阈值;
CHM树冠顶点识别:
CHM树冠顶点高度大于其它树冠点高度,通过局部最大值算法可以搜索潜在树冠顶点,搜索窗口尺寸采用固定值;
搜索窗口尺寸约束条件:
a.搜索窗口尺寸大于等于最小冠幅;
b.搜索窗口尺寸小于等于树高;
CHM树冠边界识别:
CHM树冠边界是树冠上最外围的点,树冠顶点与树冠边界之间还存在其它树冠点;
判断树冠边界的约束条件:
a.树冠半径小于树高;
b.树冠边界点高度大于指定阈值;
c.树冠边界点高度小于树冠顶点高度;
d.树冠边界点高度与树冠顶点高度之比大于指定阈值;
e.树冠边界点张角小于指定阈值。
进一步的,CHM分块:
若CHM栅格尺寸为XRastSize和YRastSize,块索引为XTileIndex和YTileIndex,块尺寸为XTileSize和YTileSize,缓冲区尺寸为BuffSize,将块和缓冲区合并在一起的区域称为扩展块,针对不同位置的块和扩展块,定义其在栅格中的偏移量和有效尺寸;
对于不同位置的块,其在栅格中的偏移量和有效尺寸定义如下:第一行块中左上角块在栅格中偏移量和有效尺寸为:
XOffset=0
YOffset=0
XValidSize=XTileSize
YValidSize=YTileSize
第一行块中位于左上角块和右上角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=0
XValidSize=XTileSize
YValidSize=YTileSize
第一行块中右上角块在栅格中偏移量和尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=0
XValidSize=XRastSize-(XTileIndex*XTileSize)
YValidSize=YTileSize
第一列块中位于左上角块和左下角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=0
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YTileSize
最后一列块中位于右上角块和右下角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XRastSize-(XTileIndex*XTileSize)
YValidSize=YTileSize
最后一行块中左下角块在栅格中偏移量和有效尺寸为:
XOffset=0
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YRastSize-(YTileIndex*YTileSize)
最后一行块中位于左下角块和右下角块之间的块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YRastSize-(YTileIndex*YTileSize)
最后一行块中右下角块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XRastSize-(XTileIndex*XTileSize)
YValidSize=YRastSize-(YTileIndex*YTileSize)
中间块在栅格中偏移量和有效尺寸为:
XOffset=XTileIndex*XTileSize
YOffset=YTileIndex*YTileSize
XValidSize=XTileSize
YValidSize=YTileSize
对于不同位置的扩展块,其在栅格中的偏移量和有效尺寸定义如下:
第一行块中左上角扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=0
YOffsetEx=0
XValidSizeEx=XTileSize+BuffSize
YValidSizeEx=YTileSize+BuffSize
第一行块中位于左上角块和右上角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=0
XValidSizeEx=XTileSize+2*BuffSize
YValidSizeEx=YTileSize+BuffSize
第一行块中右上角扩展块在栅格中偏移量和尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=0
XValidSizeEx=XRastSize-(XTileIndex*XTileSize-BuffSize)
YValidSizeEx=YTileSize+BuffSize
第一列块中位于左上角块和左下角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=0
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+BuffSize
YValidSizeEx=YTileSize+2*BuffSize
最后一列块中位于右上角块和右下角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XRastSize-(XTileIndex*XTileSize-BuffSize)
YValidSizeEx=YTileSize+2*BuffSize
最后一行块中左下角扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=0
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+BuffSize
YValidSizeEx=YRastSize-(YTileIndex*YTileSize-BuffSize)
最后一行块中位于左下角块和右下角块之间的扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+2*BuffSize
YValidSizeEx=YRastSize-(YTileIndex*YTileSize-BuffSize)
最后一行块中右下角扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XRastSize-(XTileIndex*XTileSize-BuffSize)
YValidSizeEx=YRastSize-(YTileIndex*YTileSize-BuffSize)
中间扩展块在栅格中偏移量和有效尺寸为:
XOffsetEx=XTileIndex*XTileSize-BuffSize
YOffsetEx=YTileIndex*YTileSize-BuffSize
XValidSizeEx=XTileSize+2*BuffSize
YValidSizeEx=YTileSize+2*BuffSize。
进一步的,CHM树冠顶点识别:
若当前块在栅格中偏移量为XOffset和YOffset,有效尺寸为XValidSize和YValidSize,搜索窗口半径为SearchRadius,针对不同位置的块,定义树冠顶点搜索区域在栅格中的位置;
第一行块中左上角块搜索区域在栅格中的位置为:
XSearchBeg=SearchRadius
YSearchBeg=SearchRadius
XSearchEnd=XValidSize
YSearchEnd=YValidSize
第一行块中位于左上角块和右上角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=XOffset
YSearchBeg=SearchRadius
XSearchEnd=XValidSize
YSearchEnd=YValidSize
第一行块中右上角块搜索区域在栅格中的位置为:
XSearchBeg=XOffset
YSearchBeg=SearchRadius
XSearchEnd=XValidSize-SearchRadius
YSearchEnd=YValidSize
第一列块中位于左上角块和左下角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=SearchRadius
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize
最后一列块中位于右上角块和右下角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=XOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize-SearchRadius
YSearchEnd=YValidSize
最后一行块中左下角块搜索区域在栅格中的位置为:
XSearchBeg=SearchRadius
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize-SearchRadius
最后一行块中位于左下角块和右下角块之间的块搜索区域在栅格中的位置为:
XSearchBeg=YOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize-SearchRadius
最后一行块中右下角块搜索区域在栅格中的位置为:
XSearchBeg=YOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize-SearchRadius
YSearchEnd=YValidSize-SearchRadius
中间块搜索区域在栅格中的位置为:
XSearchBeg=YOffset
YSearchBeg=YOffset
XSearchEnd=XValidSize
YSearchEnd=YValidSize
考虑到树冠尺寸与树高之间的关系,局部最大值算法的约束条件为:
树高应大于指定阈值。
如果当前像元的位置偏移量为i,j,当前像元值记为Vi,j,搜索窗口半径为r,搜索窗口内其它像元记为Vi+k,j+k,如果当前像元高度大于搜索窗口内其它像元高度,则当前像元为潜在树冠顶点。
进一步的,CHM树冠边界识别:
树冠边界点张角定义为树冠边界点相对于树冠边界点投影位置与树冠顶点投影位置之间的张角,若树冠边界点与树冠顶点之间的水平距离为D,树冠边界点高度为H,则树冠边界点张角为D与H之比的反正切角:
若相邻树冠有重叠,判断相邻树冠边界的约束条件为:
按照树高与树冠半径呈比例关系确定重叠树冠点所属树冠;
若树冠1的顶点高度为h1,树冠1的顶点位置为x1和y1,树冠2的顶点高度为h2,树冠2的顶点位置为x2和y2,重叠区树冠点位置为xc和yc,重叠区树冠点与树冠1顶点位置之间的距离为D1,重叠区树冠点与树冠2顶点位置之间的距离为D2,若D1与h1之比小于D2与h2之比,则重叠区树冠点属于树冠1,否则属于树冠2;若D1与h1之比等于D2与h2之比,且h1小于h2,则重叠区树冠点属于树冠1,否则属于树冠2;
根据扩展块创建不相交集森林集合,依次处理每个树冠顶点相关的树冠区域,更新不相交集森林集合;处理完所有树冠区域之后,根据不相交集森林集合对扩展块进行树冠区域编码,每个树冠区域采用唯一编码;依次遍历每个树冠顶点,对于每个树冠边界,按顺时针方向查找树冠边界点,从扩展块编码中矢量化树冠边界;
1)创建不相交集森林集合
不相交集森林集合的元素个数为:XValidSize*YValidSize
不相交集森林集合的每个元素索引等于像元索引,等级(Rank)初始化为0,尺寸(Size)初始化为1,父结点(Parent)初始化为像元索引;
2)识别单个树冠区域
从当前树冠顶点的位置开始向左移动,根据单个树冠约束规则判断左侧像元是否为树冠点,若不是树冠点则终止左侧像元判断,否则根据不相交集森林集合判断左侧像元是否已标记为其它树冠,若已标记为其它树冠,则根据连续树冠约束规则判断左侧像元是属于当前树冠还是其它树冠,若属于其它树冠则终止左侧像元判断,若不属于其它树冠,则在不相交集森林集合中将左侧像元的父结点标记为当前树冠;
若左侧像元属于当前树冠,则继续向左移动,按照单个树冠和连续树冠约束规则,判断下一个左侧像元是否属于当前树冠,若属于当前树冠,则更新不相交集森林集合,直到左侧像元不属于当前树冠,终止向左移动;
从当前树冠顶点的位置开始右侧移动,按照单个树冠和连续树冠约束规则,判别右侧像元是否属于当前树冠,若属于当前树冠,则更新不相交集森林集合,直到右侧像元不属于当前树冠,终止向右移动;
从当前树冠顶点的位置开始向上移动,按照单个树冠和连续树冠约束规则,判断上方像元是否属于当前树冠,若上方像元属于当前树冠,则更新不相交集森林集合;然后从上方像元连续向左侧移动,直至被判断像元不属于当前树冠;然后从上方像元连续向右移动,直至被判断像元不属于当前树冠;当判断完上方像元的左侧像元和右侧像元之后,继续向上移动,判断下一个上方像元,直至判断完上方像元,终止向上移动;
从当前树冠顶点的位置开始向下移动,按照单个树冠和连续树冠约束规则,判断下方像元是否属于当前树冠,若下方像元属于当前树冠,则更新不相交集森林集合;然后从下方像元连续向左侧移动,直至被判断像元不属于当前树冠;然后从下方像元连续向右移动,直至被判断像元不属于当前树冠;当判断完下方像元的左侧像元和右侧像元之后,继续向下移动,判断下一个下方像元,直至判断完下方像元,终止向下移动;
3)识别全部树冠区域
遍历树冠顶点,采用识别单个树冠区域的过程,识别全部树冠区域;
4)扩展块树冠编码
根据不相交集森林集合,查找每个元素的根结点,由根结点对扩展块的每个像元进行编码;
若干不相交集森林集合中元素的尺寸(Size)大于1,则扩展块的对应像元标记为根结点值,否则扩展块的对应像元标记为0;
5)矢量化单个树冠边界
从当前树冠顶点所在像元向上移动,找到最上面的树冠边界像元作为树冠边界矢量化的开始像元,将开始像元左上角坐标保存为树冠边界开始点;
按顺时针方向查找下一个边界点,分为4个方向迭代判别下一个边界点,首先迭代判别右侧像元边界点,自动迭代其它方向像元边界点;
迭代判别右侧像元边界点,将当前像元右上角坐标保存为下一个树冠边界点,如果右侧像元不属于当前树冠,则迭代判别下方像元边界点;如果右侧像元属于当前树冠,则继续判断右侧像元的上方像元是否属于当前树冠,如果右侧像元的上方像元属于当前树冠,则迭代判别右侧像元的上方像元边界点;如果右侧像元的上方像元不属于当前树冠,则迭代判别右侧像元的右侧像元边界点;
迭代判别下方像元边界点,将当前像元右下角坐标保存为下一个树冠边界点,如果下方像元不属于当前树冠,则迭代判别左侧像元边界点;如果下方像元属于当前树冠,则继续判断下方像元的右侧像元是否属于当前树冠,如果下方像元的右侧像元属于当前树冠,则迭代判别下方像元的右侧像元边界点;如果下方像元的右侧像元不属于当前树冠,则迭代判别下方像元的下方像元边界点;
迭代判别左侧像元边界点,将当前像元左下角坐标保存为下一个树冠边界点,如果左侧像元不属于当前树冠,则迭代判别上方像元边界点;如果左侧像元属于当前树冠,则继续判断左侧像元的下方像元是否属于当前树冠,如果左侧像元的下方像元属于当前树冠,则迭代判别左侧像元的下方像元边界点;如果左侧像元的下方像元不属于当前树冠,则迭代判别左侧像元的左侧像元边界点;
迭代判别上方像元边界点,将当前像元左上角坐标保存为下一个树冠边界点,如果上方像元不属于当前树冠,则迭代判别右侧像元边界点;如果上方像元属于当前树冠,则继续判断上方像元的左侧像元是否属于当前树冠,如果上方像元的左侧像元属于当前树冠,则迭代判别上方像元的左侧像元边界点;如果上方像元的左侧像元不属于当前树冠,则迭代判别上方像元的上方像元边界点;
如果当前像元的位置等于开始像元的位置,表示完成单个树冠边界矢量化;
6)矢量化全部树冠边界
遍历树冠顶点,采用矢量化单个树冠边界的过程,矢量化全部树冠边界。
本发明的有益效果为:由于设置有CHM分块、CHM低值凹陷区平滑、CHM树冠顶点识别和CHM树冠边界识别,能够对大数据量激光雷达CHM进行处理,高效识别单木树冠边界,用于单木因子提取和林分因子提取。
本发明的有益效果为:本发明的有益效果为:由于设置有CHM分块、CHM低值凹陷区平滑、CHM树冠顶点识别和CHM树冠边界识别,能够对大数据量激光雷达CHM进行处理,高效识别单木树冠边界,用于单木因子提取和林分因子提取。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何不经过创造性劳动想到的变化或替换,都应涵盖在本发明的保护范围之内。