本發明涉及一種激光雷達單木分塊識別方法。
背景技術:
激光雷達能夠直接測量地物的三維空間結構,按照一定頻率發射激光脈沖,記錄來自地面和來自森林冠層的返回信號能量分布或離散點云(回波),發射能量和返回能量具有波形特征,通過波形分解可以得到離散點云。
通過分層分類處理,將離散點云被分為地面點和非地面點,非地面點再分為植被點和非植被點,離散地面點內插生成數字高程模型(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進行處理,高效識別單木樹冠邊界,用于單木因子提取和林分因子提取。
以上所述,僅為本發明的具體實施方式,但本發明的保護范圍并不局限于此,任何不經過創造性勞動想到的變化或替換,都應涵蓋在本發明的保護范圍之內。