本發明涉及河口海岸科學、港口及航道工程等應用領域,具體地說是一種掃描紙質海圖水深點自動矢量化及信息提取的改進方法。
背景技術:
海圖是精確測繪海洋水域和沿岸地物信息的專門地圖形式,主要內容包括:岸線、島嶼、礁石、水深、航標和無線電導航臺等,是航海必不可少的參考數據。同時,也是河口海岸科學研究,海岸工程、港口及航道工程應用獲取基礎數據的重要數據源,在航海、河口海岸及海洋科學研究領域有著廣泛的應用。長期以來,人們只能夠從有關部門購買紙質海圖,再掃描成數字化的圖像通過手工矢量化的方式將其轉變為便于計算機處理的形式加以應用。盡管近些年已經可以直接獲得矢量格式的海圖,但歷史上積存的大量紙質海圖對于認識近岸海洋環境的發展演變是不可替代的數據源,在科研和工程應用中具有重要意義。每張海圖上都有數以千計的點要素、線要素信息及大量的其它信息,常規的手工矢量化方式需要通過不斷重復性的勞動來完成,工作極其枯燥乏味,而且強度大、效率低、易出錯、一致性差,極大地制約了紙質海圖在科研和工程領域的應用。因此,迫切需要提高掃描紙質海圖矢量化的效率。
技術實現要素:
本發明根據海圖制圖規范,提出一種掃描紙質海圖水深點自動矢量化及信息提取的改進方法,實現了海圖水深點要素自動精確定位和矢量化、水深數據自動提取的功能,以提升紙質海圖矢量化的效率,挖掘歷史海圖數據的價值,為科研和工程應用提供便利。
本發明的技術方案是:
一種掃描紙質海圖水深點自動矢量化及信息提取的改進方法,它包括以下步驟:
s1、掃描紙質海圖;
s2、對掃描的海圖圖像文件進行幾何校正(海圖屬于地理數據的一種,而地理數據要與實際空間位置對應起來才有意義,利用掃描儀掃描進電腦之后僅僅是一個普通的圖片,因此在使用之前需要對其進行幾何校正);創建點矢量文件,文件參考坐標系與已校正的掃描海圖圖像文件一致;
s3、框選海圖圖像中任一包含單個或多個水深點的圖像區域,并獲取框選的圖像區域左上角的空間坐標(x,y)及x、y方向的像元大小sx、sy;
s4、讀取框選區域的圖像數據,識別區域中的數字,將識別結果中多個數字序列合并為1個數字序列numstr,該數字序列中有n個數字,m為序列中的數字索引,m=0,...,n-1,獲得數字序列以及數字序列中各數字上邊到框頂邊的頂邊距離top、下邊到框頂邊的底邊距離bottom、左邊到框左邊的左邊距離left、右邊到框左邊的右邊距離right;
s5、聲明字符變量depstr用來存放提取的單個水深點數字序列,并將數字序列numstr中第一個數字即numstr0賦值給depstr,同時獲取其左上角的坐標位置(x,y);(depstr是一個臨時變量,用來存儲通過判斷從數字序列中分離得到的單個水深點讀數,每得到一個完整的水深點讀數,depstr就被轉換為數值型并存入一個用來存儲所選全部水深點讀數的數組變量,然后將被重新賦值用來存儲下一個水深點讀數);
s6、判斷數字序列numstr是否只包含一個數字:
如果是一個數字,則僅有一個水深點且數值為1位整數,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h;
如果包含多于一個數字,則依次將numstrm-1與numstrm的空間位置進行比較,m=1,...,n-1,直到所有數字比較完畢結束,得到所有水深點的正確讀數,獲取其整數數字的寬度w和高度h;
s7、依次計算各個水深點的空間坐標;
s8、根據所獲取的水深點空間坐標在步驟s2創建的點矢量文件中生成點要素并將水深數據寫入屬性表,在圖上顯示獲取的水深讀數和空間位置以便判斷正確與否;
s9、目視判斷所獲取的水深點讀數和空間位置是否正確,若不正確,進行修正,若正確,則重復s2至s9步,完成整幅海圖的矢量化。
進一步地,步驟s2中,采用gis軟件工具進行幾何校正,如arcgis。
進一步地,步驟s4中,采用ocr引擎識別所選圖像區域中的數字。
進一步地,步驟s6中,空間位置比較步驟具體為:
如果numstrm-1與numstrm的左邊距離left滿足下述情況,則進行相應處理:
c1、abs(leftm-leftm-1)<20且abs(topm-topm-1)<5,則numstrm為該水深點的一個整數位數字,將numstrm連接到depstr:(字符串連接,例如,字符串變量str現在=“1”,把一個新的字符串“6”連接到str,則str就變成了“16”;再把一個新的字符串“3”連接到str,則str就變成了“163”。因為選了多個水深點,ocr識別后結果可能比較亂,一個水深點的數可能識別成兩個對象,也可能多個水深點的數字識別成一個對象,所以首先把識別出的所有數字合成為一個水深點序列,然后通過這里的算法來把各個水深點正確分開。這里depstr是用來存放分開后的單個水深點數值的變量。)
進而,判斷numstrm是否為numstr的最后一個數字,即判斷m=n-1是否成立,如果成立,則depstr為該水深點的完整數字序列,且無小數位,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h,比較結束,否則繼續比較;
c2、abs(leftm-leftm-1)<20且5<abs(topm-topm-1)<15,則numstrm為小數位,將numstrm連接到depstr,depstr作為該水深點的完整數字序列,將depstr轉變為數值型并除以10即得到正確的水深點讀數,同時獲取其整數位寬度w和高度h;
判斷m<n-1是否成立,如果成立,則對depstr重新賦值為numstrm+1,并令m=m+1,同時獲取numstrm+1的坐標位置,否則繼續比較;
進而,判斷numstrm是否為numstr的最后一個數字,即判斷m=n-1是否成立,如果成立,則depstr為該水深點的完整數字序列且數值為1位整數,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h,比較結束,否則繼續比較;
c3、如果不滿足c1、c2的兩個初始判斷條件,則depstr為該水深點的完整數字序列,且無小數位,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h,獲取numstrm的坐標位置,對depstr重新賦值為numstrm;
進而,判斷numstrm是否為numstr的最后一個數字,即判斷m=n-1是否成立,如果成立,則depstr為該水深點的完整數字序列,且無小數位,將depstr轉變為數值型即得到正確的水深點讀數,獲取其寬度w和高度h,比較結束,否則繼續比較。
進一步地,獲取寬度w和高度h時,采用下述步驟:
若存在小數位,寬度w通過數字序列中倒數第二個數字的右邊距離right減去第一個數字的左邊距離left得到寬度w,高度h通過排除數字序列最后一個數字之后的全部數字中最大底邊距離bottom減去最小頂邊距離top得到;
若不存在小數位,寬度w通過數字序列中最后一個數字的右邊距離right減去第一個數字的左邊距離left得到,高度h通過數字序列中所有數字中最大底邊距離bottom減去最小頂邊距離top得到。
進一步地,步驟s7具體包括:
s7.1、首先根據數字識別結果獲取數字序列第一個數字左上角在所選圖像區域中的坐標(x,y);
s7.2、采用下述公式計算整數位中心點在整幅海圖中的坐標(cx,cy),即水深點的空間坐標:
cx=x+(x+w/2)×sx
cy=y-(y+h/2)×sy
其中:x,y表示框選的圖像區域左上角的空間坐標;x,y表示數字序列第一個數字左上角在所選圖像區域中的坐標,sx、sy表示x、y方向的像元大小,w表示水深點數值整數位寬度,h表示水深點數值整數位高度。
進一步地,步驟s2中,事先依照幾何校正后的海圖數字格式創建的0至9十個數字模板圖像。
進一步地,步驟s9中,修正步驟為:
s9.1、用戶在地圖窗口中點擊待修正的水深點,獲取用戶點擊位置的空間坐標,比較用戶點擊位置的空間坐標與所有水深點的空間坐標之間的距離,距離最小者為待修正的水深點;
s9.2、操作人員手動錄入水深點正確讀數,根據所錄入數字整數位,從0至9數字模板中讀取相應的數字,若整數位只有1位只需讀取其中一個數字模板圖像,否則需要讀取相應位數的數字模板圖像,并合成為一個圖像,獲取整數位的寬度w和高度h;
s9.3、分別對所選圖像區域和前述步驟獲取的數字模板圖像執行傅里葉變換得到各自的頻譜圖;
s9.4、對兩個頻譜圖執行相關操作(correlation),然后對相關操作(correlation)所得到的圖像執行傅里葉逆變換,在用戶點擊位置附近搜索極大值點(x,y)即為待修正水深點整數位左上角在所選圖像區域中的坐標(x,y);
s9.5、采用下述公式計算整數位中心點在整幅海圖中的坐標(cx,cy),即水深點的空間坐標:
cx=x+(x+w/2)×sx
cy=y-(y+h/2)×sy
其中:x,y表示框選的圖像區域左上角的空間坐標;x,y表示數字序列第一個數字左上角在所選圖像區域中的坐標,sx、sy表示x、y方向的像元大小,w表示水深點數值整數位寬度,h表示水深點數值整數位高度;
s9.6、根據計算得到的(cx,cy)和操作人員錄入的水深點讀數,修改點矢量文件中對應的記錄。
本發明的有益效果:
本發明能夠大幅度提高海圖水深點矢量化工作的效率。對于一幅1:150,000的海圖,一個熟練的矢量化操作員通常需要半天至一天的不間斷工作方能完成全部水深點的矢量化,利用本方法僅需要30分鐘至1小時即可實現,顯著提高了識別的效率。
附圖說明
圖1是本發明的流程圖。
圖2是局部海圖。
其中:數字即水深點,點的位置在整數位的中心,有多于1位的整數位,也有不帶小數位的,所有小數位只有1位。
圖3是數字在框選圖像區域中的位置示意圖。
圖4是同時獲取多個水深點讀數和坐標算法流程圖。
其中:numstr為數字序列,numstrm為數字序列中第m個數字,leftm、topm分別為第m個數字的left和top數值;depstr為單個水深點的數字收集器,dep為數值型水深點變量、w、h分別為單個水深點整數位的寬度和高度,coord為水深點左上角坐標。abs為絕對值操作:depstr+=numstr_為連接字符串操作:depstr→dep我字符串轉數值型操作。
具體實施方式
下面結合附圖和實施例對本發明作進一步的說明。
如圖1所示,一種掃描紙質海圖水深點自動矢量化及信息提取的改進方法,它包括以下步驟:
s1、掃描紙質海圖;
s2、對掃描的海圖圖像文件進行幾何校正(采用gis軟件工具進行幾何校正,如arcgis)(海圖屬于地理數據的一種,而地理數據要與實際空間位置對應起來才有意義,利用掃描儀掃描進電腦之后僅僅是一個普通的圖片,因此在使用之前需要對其進行幾何校正);創建點矢量文件,文件參考坐標系與已校正的掃描海圖圖像文件一致,事先依照幾何校正后的海圖數字格式創建的0至9十個數字模板圖像。
s3、框選海圖圖像中任一包含單個或多個水深點的圖像區域,并獲取框選的圖像區域左上角的空間坐標(x,y)及x、y方向的像元大小sx、sy;
s4、讀取框選區域的圖像數據,識別區域中的數字,將識別結果中多個數字序列合并為1個數字序列numstr,該數字序列中有n個數字,m為序列中的數字索引,m=0,...,n-1,獲得數字序列以及數字序列中各數字上邊到框頂邊的頂邊距離top、下邊到框頂邊的底邊距離bottom、左邊到框左邊的左邊距離left、右邊到框左邊的右邊距離right;
s5、聲明字符變量depstr用來存放提取的單個水深點數字序列,并將數字序列numstr中第一個數字即numstr0賦值給depstr,同時獲取其左上角的坐標位置(x,y);
s6、判斷數字序列numstr是否只包含一個數字:
如果是一個數字,則僅有一個水深點且數值為1位整數,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h;
如果包含多于一個數字,則依次將numstrm-1與numstrm的空間位置進行比較,m=1,...,n-1,直到所有數字比較完畢結束,得到所有水深點的正確讀數,獲取其整數數字的寬度w和高度h,采用下述步驟:
若存在小數位,寬度w通過數字序列中倒數第二個數字的右邊距離right減去第一個數字的左邊距離left得到寬度w,高度h通過排除數字序列最后一個數字之后的全部數字中最大底邊距離bottom減去最小頂邊距離top得到;
若不存在小數位,寬度w通過數字序列中最后一個數字的右邊距離right減去第一個數字的左邊距離left得到,高度h通過數字序列中所有數字中最大底邊距離bottom減去最小頂邊距離top得到。
其中,空間位置比較步驟具體為:
如果numstrm-1與numstrm的左邊距離left滿足下述情況,則進行相應處理:
c1、abs(leftm-leftm-1)<20且abs(topm-topm-1)<5,則numstrm為該水深點的一個整數位數字,將numstrm連接到depstr:(字符串連接,例如,字符串變量str現在=“1”,把一個新的字符串“6”連接到str,則str就變成了“16”;再把一個新的字符串“3”連接到str,則str就變成了“163”。因為選了多個水深點,ocr識別后結果可能比較亂,一個水深點的數可能識別成兩個對象,有可能多個水深點的數字識別成一個對象,所以首先把識別出的所有數字合成為一個水深點序列,然后通過這里的算法來把各個水深點正確分開。這里depstr是用來存放分開后的單個水深點數值的變量。)
進而,判斷numstrm是否為numstr的最后一個數字,即判斷m=n-1是否成立,如果成立,則depstr為該水深點的完整數字序列,且無小數位,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h,比較結束,否則繼續比較;
c2、abs(leftm-leftm-1)<20且5<abs(topm-topm-1)<15,則numstrm為小數位,將numstrm連接到depstr,depstr作為該水深點的完整數字序列,將depstr轉變為數值型并除以10即得到正確的水深點讀數,同時獲取其整數位寬度w和高度h;
判斷m<n-1是否成立,如果成立,則對depstr重新賦值為numstrm+1,并令m=m+1,同時獲取numstrm+1的坐標位置,否則繼續比較;
進而,判斷numstrm是否為numstr的最后一個數字,即判斷m=n-1是否成立,如果成立,則depstr為該水深點的完整數字序列且數值為1位整數,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h,比較結束,否則繼續比較;
c3、如果不滿足c1、c2的兩個初始判斷條件,則depstr為該水深點的完整數字序列,且無小數位,將depstr轉變為數值型即得到正確的水深點讀數,同時獲取其寬度w和高度h,獲取numstrm的坐標位置,對depstr重新賦值為numstrm;(depstr是一個臨時變量,用來存儲通過判斷從數字序列中分離得到的單個水深點讀數,每得到一個完整的水深點讀數,depstr就被轉換為數值型并存入一個用來存儲所選全部水深點讀數的數組變量,然后將被重新賦值用來存儲下一個水深點讀數。)
進而,判斷numstrm是否為numstr的最后一個數字,即判斷m=n-1是否成立,如果成立,則depstr為該水深點的完整數字序列,且無小數位,將depstr轉變為數值型即得到正確的水深點讀數,獲取其寬度w和高度h,比較結束,否則繼續比較。
s7、依次計算各個水深點的空間坐標,進一步地,步驟s7具體包括:
s7.1、首先根據數字識別結果獲取數字序列第一個數字左上角在所選圖像區域中的坐標(x,y);
s7.2、采用下述公式計算整數位中心點在整幅海圖中的坐標(cx,cy),即水深點的空間坐標:
cx=x+(x+w/2)×sx
cy=y-(y+h/2)×sy
其中:x,y表示框選的圖像區域左上角的空間坐標;x,y表示數字序列第一個數字左上角在所選圖像區域中的坐標,sx、sy表示x、y方向的像元大小,w表示水深點數值整數位寬度,h表示水深點數值整數位高度。
s8、根據所獲取的水深點空間坐標在步驟s2創建的點矢量文件中生成點要素并將水深數據寫入屬性表,在圖上顯示獲取的水深讀數和空間位置以便判斷正確與否;
s9、目視判斷所獲取的水深點讀數和空間位置是否正確,若不正確,進行修正,若正確,則重復s2至s9步,完成整幅海圖的矢量化,修正步驟為:
s9.1、用戶在地圖窗口中點擊待修正的水深點,獲取用戶點擊位置的空間坐標,比較用戶點擊位置的空間坐標與所有水深點的空間坐標之間的距離,距離最小者為待修正的水深點;
s9.2、操作人員手動錄入水深點正確讀數,根據所錄入數字整數位,從0至9數字模板中讀取相應的數字,若整數位只有1位只需讀取其中一個數字模板圖像,否則需要讀取相應位數的數字模板圖像,并合成為一個圖像,獲取整數位的寬度w和高度h;
s9.3、分別對所選圖像區域和前述步驟獲取的數字模板圖像執行傅里葉變換得到各自的頻譜圖;
s9.4、對兩個頻譜圖執行相關操作(correlation),然后對相關操作(correlation)所得到的圖像執行傅里葉逆變換,在用戶點擊位置附近搜索極大值點(x,y)即為待修正水深點整數位左上角在所選圖像區域中的坐標(x,y);
s9.5、采用下述公式計算整數位中心點在整幅海圖中的坐標(cx,cy),即水深點的空間坐標:
cx=x+(x+w/2)×sx
cy=y-(y+h/2)×sy
其中:x,y表示框選的圖像區域左上角的空間坐標;x,y表示數字序列第一個數字左上角在所選圖像區域中的坐標,sx、sy表示x、y方向的像元大小,w表示水深點數值整數位寬度,h表示水深點數值整數位高度;
s9.6、根據計算得到的(cx,cy)和操作人員錄入的水深點讀數,修改點矢量文件中對應的記錄。
本發明未涉及部分均與現有技術相同或可采用現有技術加以實現。