李翰洋
(蘭州市勘察測(cè)繪研究院,甘肅 蘭州 730000)
在遙感影像分割結(jié)果的綜合過(guò)程中,需要提取影像分割結(jié)果中各個(gè)地物對(duì)象的邊界,然后依據(jù)此邊界信息對(duì)分割的結(jié)果進(jìn)行空間信息的轉(zhuǎn)化與合成,形成最終的分割圖。在該過(guò)程中,需要頻繁更新對(duì)象邊界。如果能夠?qū)⒂跋穹指畹慕Y(jié)果以矢量數(shù)據(jù)的形式進(jìn)行組織管理,然后在該矢量數(shù)據(jù)的基礎(chǔ)上對(duì)影像分割結(jié)果進(jìn)行轉(zhuǎn)化與合成,無(wú)疑會(huì)對(duì)面向?qū)ο蟮倪b感影像分類提供良好的數(shù)據(jù)支撐。鑒于此,本文針對(duì)遙感影像分割后的邊界數(shù)據(jù),采用VC6.0開(kāi)發(fā)平臺(tái)及Win7 操作系統(tǒng),設(shè)計(jì)相應(yīng)的數(shù)據(jù)結(jié)構(gòu)和算法,構(gòu)建了面向?qū)ο蟮倪b感影像矢量編輯系統(tǒng),并將該系列算法封裝成為組件,以API 的形式供其他遙感影像分類系統(tǒng)使用。
為了提高所設(shè)計(jì)的編輯系統(tǒng)的可移植性和可擴(kuò)展性,本文在設(shè)計(jì)該編輯系統(tǒng)時(shí),采用了面向?qū)ο笠约敖M件的方式來(lái)進(jìn)行實(shí)現(xiàn)。將該矢量編輯系統(tǒng)打包為動(dòng)態(tài)鏈接庫(kù)(DLL),并提供相應(yīng)的接口,可在其他應(yīng)用系統(tǒng)中直接使用。
2)將主界面類設(shè)計(jì)為導(dǎo)出類(__declspec(dllexport)),以DLL 的形式導(dǎo)出。由于DLL 本身所具備的特性,本文在更新主界面類時(shí)不需要重新進(jìn)行編譯,只需要更新動(dòng)態(tài)鏈接庫(kù)即可。這種方法一致性好,便于維護(hù)。
在矢量編輯系統(tǒng)中,不僅要對(duì)點(diǎn)、線、面數(shù)據(jù)進(jìn)行顯示,而且要對(duì)其進(jìn)行選中、刪除等操作。
1)點(diǎn)類。在該矢量系統(tǒng)中,點(diǎn)存在兩種狀態(tài):選中和未選中;存在一個(gè)判斷方法:在指定的限差內(nèi)是否能被選中。主要代碼如下:
2)弧段類。在該矢量系統(tǒng)中,弧段存在兩種狀態(tài):選中和未選中;存在兩個(gè)判斷方法:在指定的限差內(nèi)是否能被選中以及在當(dāng)前窗口范圍內(nèi)是否可見(jiàn)(在提高顯示速率時(shí)需要該方法)。主要代碼如下:
3)多邊形類。在該矢量系統(tǒng)中,多邊形存在兩種狀態(tài):選中和未選中;存在一個(gè)判斷方法:鼠標(biāo)點(diǎn)擊的位置是否在多邊形內(nèi)。主要代碼如下:
在矢量編輯系統(tǒng)的具體實(shí)現(xiàn)過(guò)程中,需要充分考慮到系統(tǒng)的效率、用戶操作的友好性等問(wèn)題,本文針對(duì)這些問(wèn)題給出了相應(yīng)的解決方案。
遙感影像數(shù)據(jù)量一般較大,特別是分割之后,包含大量的點(diǎn)、線和面信息。在進(jìn)行數(shù)據(jù)顯示時(shí),必須采用一定的優(yōu)化方法,以快速顯示矢量數(shù)據(jù),減少矢量數(shù)據(jù)刷新時(shí)的屏幕閃爍,提高用戶交互操作時(shí)的響應(yīng)速度,包括點(diǎn)、線、面的捕捉等。本文采用了三種技術(shù)來(lái)優(yōu)化處理,以提高顯示的速率,方便用戶操作。下面依次對(duì)這三種技術(shù)進(jìn)行說(shuō)明。
1)對(duì)矢量數(shù)據(jù)進(jìn)行分塊處理。由于矢量數(shù)據(jù)量較大,當(dāng)鼠標(biāo)在屏幕內(nèi)移動(dòng)時(shí),如果計(jì)算鼠標(biāo)和整幅矢量數(shù)據(jù)之間的關(guān)系,以判斷哪些點(diǎn)、線或面可以選中,效率將會(huì)非常低。為此,本文將整體數(shù)據(jù)分塊,分別統(tǒng)計(jì)各個(gè)塊中所包含的點(diǎn)、線、面信息。當(dāng)鼠標(biāo)在進(jìn)行移動(dòng)時(shí),首先計(jì)算鼠標(biāo)的位置,以獲得其所處的區(qū)塊,然后提取出該區(qū)塊中的點(diǎn)、線、面數(shù)據(jù),與鼠標(biāo)的位置進(jìn)行判斷,以獲得它們之間的相對(duì)關(guān)系。如圖1 所示,將一幅遙感影像分成50 像素*50 像素的多個(gè)矩形塊。
排除標(biāo)準(zhǔn):患者病例資料不完整;接受手術(shù)的結(jié)腸癌患者為急診患者;患者有腹部手術(shù)史;患者具有家族性多發(fā)性息肉;患者合并有腸梗阻;患者具有潰瘍性結(jié)腸炎;患者合并有其它惡性疾??;患者具有克羅恩病史;對(duì)本手術(shù)藥物過(guò)敏或者屬于過(guò)敏體質(zhì)的患者。
在統(tǒng)計(jì)了各個(gè)區(qū)塊的點(diǎn)、線、面信息之后,以此數(shù)據(jù)為基礎(chǔ)來(lái)提高用戶操作時(shí)的效率。具體實(shí)現(xiàn)如下:
圖1 影像分塊示意圖
第一、獲取鼠標(biāo)所在的位置,并判斷該位置屬于第多少個(gè)區(qū)塊;
第二、提取該區(qū)塊,并獲得該區(qū)塊中所包含的點(diǎn)、線、面信息;
第三、根據(jù)給定的閾值,判斷鼠標(biāo)附近是否有節(jié)點(diǎn)可以捕捉,如果有,選擇距離最近的結(jié)點(diǎn),給出結(jié)點(diǎn)捕捉標(biāo)志;否則,判斷是否有弧段可以捕捉,如果有,選擇距離最近的弧段,給出弧段捕捉標(biāo)志;如果點(diǎn)、線都無(wú)法捕捉,則捕捉相應(yīng)的多邊形。該方法可以大大減少鼠標(biāo)移動(dòng)時(shí)所進(jìn)行的捕捉判斷,減少用戶操作的響應(yīng)時(shí)間,提高捕捉效率。
另一方面,通過(guò)將矢量數(shù)據(jù)進(jìn)行分塊保存,可以提高顯示效率。通常情況下,在顯示矢量數(shù)據(jù)時(shí),為了提高顯示效率,需要判斷哪些點(diǎn)、線、面元素是落在可見(jiàn)窗口之內(nèi)的,通過(guò)只顯示這些可見(jiàn)元素,能有效提高顯示效率。在顯示矢量數(shù)據(jù)時(shí),如果對(duì)所有的點(diǎn)、線、面元素均判斷其可見(jiàn)性,無(wú)疑將會(huì)效率低下。通過(guò)分塊統(tǒng)計(jì)的方法,在顯示矢量數(shù)據(jù)時(shí),首先計(jì)算哪些區(qū)塊落在當(dāng)前可見(jiàn)窗口之中,然后只繪制處于這些區(qū)塊當(dāng)中的弧段,將會(huì)大大降低不必要的判斷過(guò)程,有效提高顯示效率。
2)只顯示落在當(dāng)前可見(jiàn)窗口之中的像素。在進(jìn)行矢量編輯的過(guò)程中,需要將柵格數(shù)據(jù)和矢量數(shù)據(jù)疊加顯示,便于用戶對(duì)比操作。然而,由于遙感影像數(shù)據(jù)量較大,在顯示柵格數(shù)據(jù)時(shí),如果一直顯示整幅柵格圖像,必然會(huì)影像到整個(gè)系統(tǒng)的顯示效率。因此在顯示柵格數(shù)據(jù)時(shí)需要進(jìn)行相應(yīng)的處理,以提高顯示的速度。本文在具體實(shí)現(xiàn)時(shí),計(jì)算只屬于可見(jiàn)窗口之中的像素,然后進(jìn)行顯示。
3)采用雙緩沖機(jī)制進(jìn)行顯示。在進(jìn)行矢量數(shù)據(jù)的平移和縮放等操作時(shí),不可避免的需要對(duì)矢量數(shù)據(jù)進(jìn)行刷新。而通常情況下,矢量數(shù)據(jù)的數(shù)據(jù)量比較大,刷新一次需要耗費(fèi)比較多的CPU 時(shí)鐘,從而產(chǎn)生閃爍現(xiàn)象,因此也會(huì)影響到顯示的效果。針對(duì)這個(gè)問(wèn)題,本文采用了雙緩沖機(jī)制來(lái)實(shí)現(xiàn)矢量圖形的顯示。實(shí)現(xiàn)思路如下:首先創(chuàng)建一個(gè)和當(dāng)前可見(jiàn)窗口同樣大小的畫(huà)布,在需要刷新窗口時(shí),計(jì)算刷新之后新的狀態(tài)下的顯示畫(huà)面,然后將此畫(huà)面繪制到該畫(huà)布上,最后將該畫(huà)布整個(gè)貼在屏幕上,從而達(dá)到刷新窗口的目的。在使用該機(jī)制對(duì)窗口進(jìn)行刷新的過(guò)程中,用戶看到的只是整體畫(huà)布的一次性更換,速度很快,從而減小了閃爍,提高了顯示的效率。
一個(gè)比較人性化的軟件系統(tǒng)應(yīng)該能提供比較好的撤銷與重做功能,以便用戶能及時(shí)對(duì)操作錯(cuò)誤的步驟進(jìn)行更改,對(duì)于編輯系統(tǒng)更是如此。在該矢量編輯系統(tǒng)中,本文實(shí)現(xiàn)了撤銷與重做的功能。
矢量編輯系統(tǒng)不同于其他的軟件系統(tǒng),該系統(tǒng)中的操作基本都是可逆的。例如分割一個(gè)多邊形,其可逆操作為合并分割后的兩個(gè)多邊形;移動(dòng)一個(gè)節(jié)點(diǎn),其可逆操作為將該節(jié)點(diǎn)平移回來(lái)。針對(duì)這一特性,本文采用了面向?qū)ο蠛投鄳B(tài)的方法來(lái)實(shí)現(xiàn)撤銷與重做功能。其基本思想為:對(duì)于每一步操作,生成一個(gè)Undo 對(duì)象,同時(shí)計(jì)算該操作所對(duì)應(yīng)的可逆操作的參數(shù),將這些參數(shù)賦值給Undo 對(duì)象,并將該Undo 對(duì)象壓入到撤銷堆棧之中;同時(shí)生成一個(gè)Redo 對(duì)象,與該Undo 對(duì)象相反,壓入到重做堆棧之中。其中,Undo 對(duì)象和Redo 對(duì)象的行為采用多態(tài)的方式來(lái)實(shí)現(xiàn)。以節(jié)點(diǎn)移動(dòng)為例,進(jìn)行簡(jiǎn)單說(shuō)明。
1)在移動(dòng)節(jié)點(diǎn)完成時(shí),派生一個(gè)繼承于CUndoBase 的類CUndoMove,在該類的Undo()函數(shù)中添加對(duì)本次操作的逆處理,在逆處理完成之后向重做堆棧中添加與之相關(guān)聯(lián)的CRedoBase 對(duì)象,并設(shè)置與之相關(guān)聯(lián)的CRedoBase 對(duì)象為空。
2)派生一個(gè)繼承于CRedoBase 的類CRedo-Move,在該類的Redo()函數(shù)中添加對(duì)本次操作的重復(fù)處理,在重復(fù)處理完成之后向撤銷堆棧中添加與之相關(guān)聯(lián)的CUndoBase 對(duì)象,并設(shè)置與之相關(guān)聯(lián)的CUndoBase 對(duì)象為空。
3)生成一個(gè)CUndoMove 對(duì)象pUndo,生成一個(gè)CRedoMove 對(duì)象pRedo,設(shè)置pUndo 指向pRedo,設(shè)置pRedo 指向pUndo,并分別將這兩個(gè)對(duì)象壓入到撤銷和重做棧中。
4)在撤銷和重做的過(guò)程中,分別從撤銷和重做棧中取出棧首對(duì)象,調(diào)用相應(yīng)的方法即可。
通過(guò)上述方法,可以一致地完成矢量編輯系統(tǒng)的撤銷與重做功能。該方法的優(yōu)點(diǎn)是對(duì)于所有的操作,當(dāng)進(jìn)行撤銷或重做時(shí)只需要調(diào)用相同的方法即可:對(duì)于撤銷調(diào)用Undo()函數(shù),對(duì)于重做調(diào)用Redo()函數(shù),簡(jiǎn)單方便;其缺點(diǎn)是對(duì)于每種類型的操作,都需要派生一個(gè)繼承CUndoBase 或CRedoBase 的類,并定制其行為,代碼實(shí)現(xiàn)比較復(fù)雜。
通過(guò)對(duì)遙感影像進(jìn)行分割,其最終目的是服務(wù)于遙感影像分類。因此,提供一些針對(duì)于遙感影像分類的工具,有助于分割后的工作。
1)對(duì)遺漏區(qū)域的處理。對(duì)遙感影像進(jìn)行分類之后一個(gè)很重要的工作是評(píng)價(jià)其分類的精度,為此,必須建立一個(gè)地物類型庫(kù),以對(duì)比分類后的結(jié)果。地物類型庫(kù)通常是以手工勾繪的方式進(jìn)行的,在建立的過(guò)程中,勾繪出比較典型的地物,賦予屬性,對(duì)于不感興趣或不清楚其類型的地塊,往往不對(duì)其進(jìn)行處理,因此,地物類型庫(kù)中的地塊對(duì)象中通常會(huì)存在遺漏的區(qū)域。在評(píng)價(jià)分類精度時(shí),根據(jù)實(shí)際需要可能會(huì)要求對(duì)遺漏的區(qū)域進(jìn)行補(bǔ)繪,賦予其屬性,更新原有的地物類型庫(kù)數(shù)據(jù),因此,如果能提供添加遺漏區(qū)域的工具,將方便用戶工作的進(jìn)行。為此,本文在矢量編輯系統(tǒng)中添加了用戶手動(dòng)勾繪遺漏區(qū)域的工具,并提供了三種方式以方便用戶的操作:完全隨意勾繪、節(jié)點(diǎn)捕捉勾繪和弧段捕捉勾繪。
2)分類樣本采集工具。在進(jìn)行分類的過(guò)程中,需要獲得比較典型的地物樣本,以這些樣本的特征來(lái)指導(dǎo)分割后數(shù)據(jù)的分類。由于矢量數(shù)據(jù)已經(jīng)獲得了典型地物的邊界,因此,如果能夠通過(guò)矢量數(shù)據(jù)來(lái)提取典型地物樣本,將比通過(guò)柵格數(shù)據(jù)來(lái)進(jìn)行要方便得多。為此,本文在矢量編輯系統(tǒng)中提供了樣本采集的工具,并以特定的格式將采集的樣本進(jìn)行保存,方便用戶的使用。
3)對(duì)象等級(jí)網(wǎng)絡(luò)的建立。在進(jìn)行分類的過(guò)程中,根據(jù)不同的應(yīng)用目的可能需要在不同的等級(jí)上對(duì)分割數(shù)據(jù)進(jìn)行處理。為此,本文利用分割地塊的類別信息將地塊由小到大建立了一個(gè)對(duì)象等級(jí)網(wǎng)絡(luò),即在較粗糙等級(jí)上的地塊對(duì)象是由多個(gè)較精細(xì)的地塊對(duì)象所組成的,而這些較精細(xì)的地塊對(duì)象則是由多個(gè)更精細(xì)的地塊對(duì)象所組成的。效果如圖2 所示。
圖2 不同等級(jí)地物分類示意圖
通過(guò)該矢量編輯系統(tǒng),對(duì)原始的分割影像進(jìn)行編輯之后結(jié)果如下圖所示,其中圖3 為原始分割結(jié)果,圖4 為編輯后結(jié)果。通過(guò)對(duì)比可以看出,該對(duì)象編輯系統(tǒng)能方便地更新對(duì)象的邊界,形成良好的分割結(jié)果,以用于遙感影像分類。
圖3 影像原始分割圖
圖4 分割影像編輯結(jié)果圖
本文設(shè)計(jì)了一個(gè)小型的對(duì)象編輯系統(tǒng),該系統(tǒng)采用面向?qū)ο蠛徒M件的方式進(jìn)行實(shí)現(xiàn),可重用性強(qiáng)。在實(shí)現(xiàn)該系統(tǒng)的過(guò)程中,采用多種技術(shù)解決了大數(shù)據(jù)量柵格、矢量數(shù)據(jù)顯示及捕捉時(shí)效率低下的問(wèn)題,并實(shí)現(xiàn)了撤銷與重做功能。另外,為了滿足分類過(guò)程中采集樣本、獲取數(shù)據(jù)、評(píng)價(jià)分類結(jié)果的需求,本文設(shè)計(jì)實(shí)現(xiàn)了一系列的輔助工具,包括樣本采集、分類結(jié)果比較、地物等級(jí)網(wǎng)絡(luò)建立等,操作簡(jiǎn)單方便,效果良好。
一個(gè)完善的矢量對(duì)象編輯系統(tǒng)的編輯方式應(yīng)該多樣化。本文所實(shí)現(xiàn)的編輯系統(tǒng)只實(shí)現(xiàn)了點(diǎn)、線、面元素的選擇、基元多邊形的合并與拆分、節(jié)點(diǎn)移動(dòng)以及生成等級(jí)網(wǎng)絡(luò)等功能,這些功能還不能完全滿足對(duì)象編輯的需要。本矢量對(duì)象編輯系統(tǒng)有待進(jìn)一步擴(kuò)充完善。