本發(fā)明屬于計算機應用技術領域,涉及到圖像識別中連通區(qū)域檢測及特征提取方法。特別涉及到利用計算機技術對較大規(guī)模復雜連通區(qū)域數(shù)目、面積以及連通區(qū)域范圍等特征進行提取的方法。
背景技術:
圖像識別技術往往是對圖像中所包含的信息進行深度挖掘的第一步,在圖像識別過程中起著至關重要的作用。連通區(qū)域特征檢測是圖像識別技術之一,自從連通區(qū)域檢測方法被提出以來,廣泛應用于圖像識別與處理領域?,F(xiàn)行的連通區(qū)域檢測方法有多種,主要可分為兩大類。第一類為通過記錄沖突標記并形成等價對,然后通過合并等價對來達到標記連通區(qū)域的目的,該類方法如像素標記法中的兩次掃描法、單向反復掃描法及線標記法等。第二類為基于種子生長法的思想,即通過先指定一個基礎標記點或區(qū)域,然后在以該點或區(qū)域為基礎通過遞歸或堆棧的方式逐一擴展標記,直到所有相鄰的點都被標記完為止?,F(xiàn)行的這兩大類算法被廣泛應用于連通區(qū)域檢測中。
上述兩類方法雖然都可以用于連通區(qū)域檢測,但都無法便捷地提取出連通區(qū)域的特征。其中第一類算法需要對圖像進行多次掃描才能削除所有等價對,從而確定出連通區(qū)域,在處理含有較多連通區(qū)域的圖像時顯然速度會非常慢,且該類算法無法在不設置額外變量的情況下經(jīng)過一次完整的圖像掃描便提取出各連通區(qū)域的特征。第二類算法通常會考慮使用遞歸的方式實現(xiàn),在使用遞歸方式實現(xiàn)時,當某個連通區(qū)域較大時,必然出現(xiàn)非常大的遞歸深度。極端情況下,如對于由純目標像素組成的N*M大小的圖像,遞歸深度將達到N*M,處理較大圖像的效率將是無法忍受的,甚至直接導致系統(tǒng)堆棧溢出。而如果采用堆棧的方式來代替遞歸,雖然可以解決遞歸的問題,但該類方法不管是以點為基礎擴展還是以行為基礎擴展,都無法避免每一個目標像素都需要被多次訪問才能被全部標記,而且該類方法在處理較大連通區(qū)域時,如純目標色的圖像,算法效率將非常低。并且同樣無法在不設置額外變量的情況下經(jīng)過一次完整的圖像掃描便提取出各連通區(qū)域的常用特征。
技術實現(xiàn)要素:
根據(jù)現(xiàn)有連通區(qū)域標定算法,在實際應用于處理含有較多連通區(qū)域的海冰圖像時,效率和處理能力都無法滿足系統(tǒng)實時性的要求,且僅能標定連通區(qū)域,無法根據(jù)已標定的連通區(qū)域便捷地提取出整幅圖像中的連通區(qū)域特征。為解決上述現(xiàn)有技術手段中存在的問題,本發(fā)明采用關聯(lián)區(qū)域擴展標定的方式,提供一種復雜連通區(qū)域特征的快速標定與提取方法。該方法能夠充分利用目標區(qū)域的領域信息,在一次完整掃描圖像之后提取出整幅圖像中所有連通區(qū)域的常用特征,如連通區(qū)域的面積、周長等,該方法能夠處理任意復雜的圖形。并能夠根據(jù)獲得的結果數(shù)據(jù),非常便捷的進一步獲取到各連通區(qū)域更多的特征,如:相對直徑、水平或垂直最大弦長、對各連通區(qū)域進行快速著色等。
本發(fā)明所采用技術方案為:
一種復雜連通區(qū)域特征的快速標定與提取方法,包括以下步驟:
(一)對根據(jù)原圖所獲取到的二值圖像進行預處理,將其線性化到一維數(shù)組中,同時統(tǒng)計整幅圖像中的所有需要標定的總目標像素個數(shù)。
(二)總目標像素個數(shù)不為0時,按行標記,確定當前目標連通域的初始掃描行,及掃描指針向量的第一個元素。如果是第一次更新初始掃描行,則將掃描行初始位移指針指向第一個元素,第一行的起始及終止位置加入掃描指針向量。其中位移指針負責垂直方向,用于定位左右訪問的起點,掃描指針向量用于保存可能存在擴展連通區(qū)域的范圍。
(三)由位移指針開始向上及向下按行掃描,并對掃描點按連通區(qū)域序號標記(最終每個連通區(qū)域?qū)粋€序號),同時將標記點加入到初始掃描行,并記錄當前掃描行中的數(shù)據(jù)個數(shù),更新位移指針指向下一個位置,遞減目標像素總數(shù),直到上、下方向全部遇到邊界為止。在左右標記的同時記錄該行的掃描長度,將上下兩行非重疊起始位置加入到掃描指針向量。具體過程如圖2所示,假定目標像素以1表示,目標連通區(qū)域標記序號從2開始,圖示為第1個被訪問的連通域,圖中虛線框為位移指針范圍,實線框為掃描指針向量范圍,則從圖示中的掃描行位移指針A點(即掃描指針向量B的第一個元素)開始,經(jīng)過第一次上下方向訪問結束,結果將如圖3所示。
(四)從指向掃描指針向量的當前元素開始,判斷掃描指針向量中各個范圍內(nèi)元素的上下2個方向上是否有目標元素(第一個元素需要判斷其左上、左下、上、下四個方向;最后一個需要判斷上、下、右上、右下四個像素),如果沒有目標元素,則更新掃描指針向量指向下一個范圍繼續(xù)重復(四),如果有目標元素則將其位移指針指向該目標元素位置,繼續(xù)執(zhí)行(三)。如果不存在掃描指針向量的下一個元素,則向下執(zhí)行。以上述例子為例,訪問掃描指針向量第二個范圍的執(zhí)行結果將如圖4。
(五)此時初始掃描行中的數(shù)據(jù)即為當前連通區(qū)域的坐標,個數(shù)即為連通區(qū)域的面積,(三)、(四)中的邊界點個數(shù)即為周長,(三)、(四)中加入邊界點判斷即可獲取到當前連通區(qū)域的相對直徑、水平或垂直最大弦長。使用當前初始掃描行中的坐標數(shù)據(jù)即可直接訪問該連通區(qū)域在原圖中的所有坐標。(六)再次執(zhí)行(二)直到總目標像素數(shù)遞減為0,即可獲得所有連通區(qū)域的特征。
本發(fā)明的方法通過設置垂直方向上的位移指針及鄰域上非重疊區(qū)域的掃描指針向量,能夠有效避免所有已經(jīng)被訪問過但又不可能存在連通鄰域的元素被再次訪問,真正實現(xiàn)一次性擴展一片連通區(qū)域。同時,多數(shù)預判斷的元素都只需要通過判斷其上、下兩個方向即可實現(xiàn)8鄰域連通區(qū)域的識別效果。并且提取到的連通區(qū)域特征豐富,各連通區(qū)域的表示數(shù)據(jù)更加靈活,便于通過對提取到的連通區(qū)域表示數(shù)據(jù)進行進一步特征挖掘。實驗證明本發(fā)明在處理任意復雜的大量連通區(qū)域時性能遠超過普通方法,處理能力顯著提高,提取到的結果數(shù)據(jù)真實可靠,可擴展性強。海面浮冰識別及特征提取的工程項目中,能夠高效處理任意極端情況。在實際的工程應用中,具有其他算法無法替代的優(yōu)勢。
附圖說明
圖1是該方法的流程圖。
圖2是位移指針與掃描指針向量形象表示圖。
圖3是位移指針執(zhí)行完一次訪問的結果圖。
圖4是執(zhí)行完一次掃描指針向量之后的結果圖。
圖5是掃描指針向量的檢查形象圖。
圖中:A是位移指針,B是掃描指針向量。
具體實施方式
為使本發(fā)明實施例的目的、技術方案及其優(yōu)點更加清楚,下面結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚完整的描述,本實施例以海冰冰塊信息提取為例。整體方法流程圖如圖1所示:
第一步,線性化圖像到一維數(shù)組
1)采用合適的方法對彩色圖像進行灰度化
2)對灰度化的圖像進行適當降噪處理,由于本例中需要處理的圖像中有可能含有大量零散的冰塊,且本方法可以很方便地處理小連通區(qū)域的問題,所以為了保證結果的準確性,可以不進行降噪處理。
3)采用合適的閾值對灰度圖像進行二值化處理,并轉(zhuǎn)換為僅含0和1的二維數(shù)組。
4)根據(jù)圖像的寬度將二維數(shù)組線性化為一維數(shù)組,轉(zhuǎn)換公式為y*width+x,轉(zhuǎn)換后的一維數(shù)組存入arrLine,并統(tǒng)計1的個數(shù)allIceNum(假定1為冰)。
第二步,初始化基礎數(shù)據(jù),需要定義以下變量:
iceOrder:值為1的整數(shù),用于確定冰塊順序
currentCheckedIceIdx:指針,用于指向動態(tài)分配的存放當前檢查過的像素索引。
checkedIcePointerArr:指針數(shù)組,用于存放currentCheckedIceIdx所指向的相應冰塊的索引地址
lastPoint:值為0的整數(shù),記錄allIceNum不為0的情況下,下一次需要開始掃描的起點
第三步,初始化當前冰塊的初始數(shù)據(jù)并確定起始掃描行
1)首先定義并初始化以下表示當前冰塊信息的變量:
iceOrder:對iceOrder累加1,表示當前冰塊的序號
iceOrderSum:值為0的整數(shù),記錄當前冰塊序號對應的冰塊大小
idxUp:值為0的整數(shù),表示向上掃描的起始坐標
idxDown:值為0的整數(shù),表示向下掃描的起始坐標
currentUncheckedB:自定義的向量類型,用于存入坐標對,相當于流程圖中的掃描指針向量B
lastUncheckedB:類型為索引對,用于指向currentUncheckedB中下一次需要被檢查的索引對
targetB:值為0的整數(shù),用于存放lastUncheckedB中需要被currentOrderStart指向的索引
currentOrderStart:值為0的整數(shù),記錄當前序號冰塊的檢查起點,相當于流程圖中的位移指針A
currentCheckedIceIdx:將其指向一個新建的可以動態(tài)擴展的向量,用于存放后續(xù)中所有已標記的屬于當前冰塊的像素索引
2)如果allIceNum不為0,則從lastPoint開始,順序訪問線性化的一維數(shù)組,查找值為1的點,對第一個值為1的點按行標記,將標記過的索引存入起始掃描行向量currentCheckedIceIdx,并更新lastPoint的值為當前起始掃描行的最后一個索引的下一個位置。將訪問到的所有值為1的點的值修改為iceOrder的當前值,同時遞減allIceNum,遞增iceOrderSum。
3)將當前新加入到currentCheckedIceIdx中按行標記到的第一個元素和最后一個元素索引組成的索引對存入向量B,即currentUncheckedB
第四步,確定位移指針A的指向,并按行標記
1)將lastUncheckedB指向currentUncheckedB中未被檢查過的第一個索引對
2)如果是第一次訪問當前冰塊的currentUncheckedB,則直接將lastUncheckedB中的第一個元素賦給targetB和currentOrderStart。
3)從targetB所指向的元素開始,如圖5所示的方式進行查找由currentUncheckedB中的索引對所限定的像素周圍是否有目標像素點,并將其位置索引賦給掃描指針currentOrderStart。查找方式為第一個元素需要檢查其左上、左下、上、下四個方向上的相鄰元素,最后一個元素需要檢查其上、下、右上、右下四個方向上的相鄰元素,其他元素只需要檢查其上、下兩個方向即可。targetB始終指向當前被檢查的元素。直到找到合適的currentOrderStart被訪問完止,否則按1)更新lastUncheckedB并繼續(xù)
第五步,按行標記,并填充掃描指針向量B
1)將currentOrderStart的值賦給idxUp,currentOrderStart+width賦給idxDown,并檢查idxDown是否越界,然后按以下方式進行按行標記:
a)idxUp控制向上的方向,其值更新方式為idxUp-width
b)idxDown控制向下的方向,其值更新方式為currentOrderStart+width
c)對于向上方向,從idxUp開始,分別向右和向左訪問值為1的元素,檢查右或左邊界并記錄右或左邊界的值分別為trn和tln,并使用tr和tl分別存儲上一次的trn和tln的值
d)當trn>tr-width時,將由tr-width和trn組成的索引對[tr-width,trn]存入currentUncheckedB,同理,當tln<tl-width時,將[tln,tl-width]存入currentUncheckedB
e)對于向下方向的,從idxDown開始,與向上方向的類似,只是當trn>tr+width時,將[tr+width,trn]存入currentUncheckedB,同理,當tln<tl+width時,將[tln,tl+width]存入currentUncheckedB
f)idxUp和idxDown的值發(fā)生變化后均應檢查其在上方和下方是否越界
g)將所有訪問到值為1的元素索引加入currentCheckedIceIdx,并將其值修改為iceOrder的當前值,同時遞減allIceNum,遞增iceOrderSum
2)當沒有找到合適的currentOrderStart時表示當前冰塊已經(jīng)被標記并識別完成
第六步,存儲連通區(qū)域信息并繼續(xù)查找下一塊冰
當上述查找結束時,將currentCheckedIceIdx所指向動態(tài)數(shù)組的首地址存入checkedIcePointerArr,最終checkedIcePointerArr將存儲所有指向各冰塊的原始坐標索引的指針,iceOrder的值為冰塊數(shù)量??筛鶕?jù)特征需要存儲各塊冰查找結束后的信息,如iceOrderSum即是各塊冰的面積、iceOrder為各塊冰的編號,根據(jù)tr、trn、tl、tln最終的值將可以方便地計算出各塊冰的相對直徑、水平或垂直最大弦長等。