本發(fā)明涉及圖像識(shí)別研究領(lǐng)域,特別涉及一種單目標(biāo)區(qū)域的復(fù)雜背景植物葉片圖像的準(zhǔn)確分割方法。
背景技術(shù):
植物,尤其藥用植物,是大自然賦予人類(lèi)的重要資源。藥用植物在人類(lèi)與疾病抗?fàn)幍那Ч艢v程中,一直發(fā)揮著顯著的作用。然而,近年來(lái),由于對(duì)生物資源保護(hù)和可持續(xù)利用意識(shí)的薄弱,致使大面積植被被毀,生態(tài)環(huán)境急劇惡化,藥用植物資源快速萎縮,一部分種類(lèi)瀕臨滅絕。加強(qiáng)對(duì)藥用植物的保護(hù)已刻不容緩。
毋容置疑,全面深入地摸清瀕危藥用植物的地理分布,構(gòu)建起較為完備的地理信息資源庫(kù),對(duì)于野生藥用植物的保護(hù)、引種和利用等,將會(huì)起到重要的支撐作用,是一項(xiàng)惠及大眾的基礎(chǔ)性工程。
然而,一般人無(wú)法擔(dān)負(fù)野外鑒別植物的任務(wù);相關(guān)專業(yè)的大學(xué)生也不行;只有從事有關(guān)工作多年,又可時(shí)常出差野外的中青年專家才能勝任。即便是放眼全球,這一類(lèi)的高端人才都是非常缺乏的。而他們本身往往已經(jīng)肩負(fù)著沉重的教學(xué)和科研任務(wù)。
所以,現(xiàn)行的資源調(diào)查,也只能采取抽樣選點(diǎn)的方式,離全面深入的調(diào)查還有一定距離。這樣構(gòu)建起的資源庫(kù),其作用是差強(qiáng)人意的。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明為克服上述現(xiàn)有技術(shù)所述的至少一種缺陷(不足),提供一種單目標(biāo)區(qū)域的復(fù)雜背景植物葉片圖像的準(zhǔn)確分割方法。該方法對(duì)于直接拍攝植物枝干上的葉片所得的復(fù)雜背景圖像,能取得較為準(zhǔn)確的分割結(jié)果。此類(lèi)圖像中除了目標(biāo)葉片外,還含有枝干、泥土、其他葉片等背景對(duì)象,分割難度大。本發(fā)明為葉片生長(zhǎng)參數(shù)的無(wú)損測(cè)定乃至植物無(wú)損自動(dòng)鑒別,掃清了一道障礙。
為解決上述技術(shù)問(wèn)題,本發(fā)明的技術(shù)方案如下:
一種單目標(biāo)區(qū)域的復(fù)雜背景植物葉片圖像的準(zhǔn)確分割方法,包括以下步驟:
第一步、預(yù)處理:把圖像縮放至所設(shè)定的尺度并顯示,用戶標(biāo)定葉邊緣點(diǎn)或葉內(nèi)點(diǎn)得到標(biāo)記點(diǎn)序列pos,再初始化前景和背景圖像;
第二步、檢測(cè)葉外點(diǎn):圍繞每一個(gè)葉邊緣點(diǎn)并在以半徑為radius的圓周上,依賴圖像的彩色像素值以及前述標(biāo)記點(diǎn)序列pos的形狀信息,確定每一個(gè)葉邊緣點(diǎn)的葉外點(diǎn);
第三步、結(jié)合葉外點(diǎn)信息修改前景背景標(biāo)記;結(jié)合葉邊緣點(diǎn)、葉內(nèi)點(diǎn)以及葉外點(diǎn)的信息,完善前景標(biāo)記和背景標(biāo)記;
第四步、分割及修正處理;在彩色空間直接求取梯度圖,而后作標(biāo)記分水嶺分割,并運(yùn)用數(shù)學(xué)形態(tài)學(xué)方法修正結(jié)果;
第五步、判斷分割及修改結(jié)果是否滿意,不滿意則返回步驟第一步,滿意則輸出分割及修改結(jié)果。
優(yōu)選的,所述第一步的預(yù)處理過(guò)程具體為:
step1:把圖像縮小至所設(shè)定的尺度,首先計(jì)算縮放比例系數(shù)ratio=(2592×1936)/(圖像的行數(shù)×圖像的列數(shù)),若ratio<1,則把圖像以ratio的開(kāi)平方的值為倍數(shù)縮??;否則無(wú)需縮??;
step2:顯示縮小后的圖像currentImage;
step3:用戶標(biāo)定葉邊緣點(diǎn)或葉內(nèi)點(diǎn),得到標(biāo)記點(diǎn)序列pos;在此,用戶選點(diǎn)的原則是:
第1個(gè)葉邊緣點(diǎn)標(biāo)定在葉基點(diǎn)處,循著順時(shí)針或逆時(shí)針?lè)较颍来螛?biāo)定后續(xù)的葉邊緣點(diǎn)或葉內(nèi)點(diǎn);要求前后相鄰的兩個(gè)標(biāo)記點(diǎn)之間的連線不經(jīng)過(guò)葉片的外部;當(dāng)?shù)诙螛?biāo)記第1點(diǎn)所在位置時(shí),標(biāo)記過(guò)程結(jié)束,第二次標(biāo)定的與第1點(diǎn)相同位置的點(diǎn),不會(huì)被存儲(chǔ)于標(biāo)記點(diǎn)序列pos;隨即會(huì)依次連接相鄰的兩點(diǎn),組成一個(gè)封閉的多邊形;
step4:初始化背景二值圖backgroundMask;新建一個(gè)與當(dāng)前顯示圖像currentImage大小一致的全“0”二值圖像backgroundMask,然后把它的四邊框上的像素全修改為“1”;
step5:初始化前景二值圖foregroundMask;新建一個(gè)與當(dāng)前圖像currentImage大小一致的全“0”二值圖像foregroundMask;然后在foregroundMask內(nèi),把處于pos中所有標(biāo)記點(diǎn)依次連結(jié)而成的多邊形polygon內(nèi)部及邊界上的點(diǎn),修改為“1”。
優(yōu)選的,所述第二步檢測(cè)葉外點(diǎn)的具體實(shí)現(xiàn)過(guò)程為:
step6:初始化計(jì)數(shù)器變量i=1;
step7:依次對(duì)標(biāo)記點(diǎn)序列pos中的每一個(gè)標(biāo)記點(diǎn)p,確定其是否為葉邊緣點(diǎn);
Step8:統(tǒng)計(jì)標(biāo)記點(diǎn)序列pos中,未被標(biāo)記為葉邊緣點(diǎn)的點(diǎn)數(shù)concavepointsNum;
Step9:設(shè)置一個(gè)葉邊緣點(diǎn)判斷距離;
Step10:判斷concavepointsNum是否大于2;若是,把葉邊緣點(diǎn)判斷距離加倍;
Step11:對(duì)標(biāo)記點(diǎn)序列pos中每一個(gè)未被標(biāo)記為葉邊緣點(diǎn)的點(diǎn)p,判斷點(diǎn)p與前面的一點(diǎn)pBefored的距離,以及與后面一點(diǎn)pBehind的距離,均小于葉邊緣點(diǎn)判斷距離,若是,確定點(diǎn)p為葉邊緣點(diǎn);
step12:檢測(cè)每一個(gè)葉邊緣點(diǎn)p的葉外點(diǎn)o,并依次存于點(diǎn)列表outPosForLine;其中,檢測(cè)一個(gè)葉邊緣點(diǎn)p對(duì)應(yīng)的葉外點(diǎn)o。
優(yōu)選的,所述步驟step7的依次對(duì)標(biāo)記點(diǎn)序列pos中的每一個(gè)標(biāo)記點(diǎn)p,確定其是否為葉邊緣點(diǎn)具體方式為:
做step7.1至step7.6的操作,直至處理完標(biāo)記點(diǎn)序列pos中的所有點(diǎn)為止;
Step7.1:如果i小于等于標(biāo)記點(diǎn)p的總數(shù),轉(zhuǎn)向step7.2,否則轉(zhuǎn)向step8;
Step7.2:i是否等于1,若是,標(biāo)記pos中的第i點(diǎn)為葉邊緣點(diǎn),轉(zhuǎn)向step7.6,否則轉(zhuǎn)向step7.3;
Step7.3:設(shè)置點(diǎn)p等于pos中的第i點(diǎn);
Step7.4:判斷點(diǎn)p在多邊形polygon中,是否為凸點(diǎn)。若是,確定點(diǎn)p為葉邊緣點(diǎn),即標(biāo)記pos中的第i點(diǎn)為葉邊緣點(diǎn),轉(zhuǎn)向step7.6;否則,轉(zhuǎn)向Step7.5。
Step7.5:把點(diǎn)p以及在標(biāo)記點(diǎn)序列pos中p前面的一點(diǎn)pBefore、在ppos中p后面的一點(diǎn)pBehind組成三角形,若點(diǎn)p是ppos中的最后一點(diǎn),則把ppos中的第一點(diǎn)作為pBehind,計(jì)算點(diǎn)p所在的角的角度angle1,若angle1的范圍為[150°,180°),則確定點(diǎn)p為葉邊緣點(diǎn),即標(biāo)記pos中的第i點(diǎn)為葉邊緣點(diǎn);
Step7.6:令i=i+1,轉(zhuǎn)向step7.1。
優(yōu)選的,所述步驟step12的具體實(shí)現(xiàn)過(guò)程如下:
step12.1:抽樣選取圓周上的點(diǎn),在葉邊緣點(diǎn)p為中心,半徑為radius的圓周上,按順時(shí)針或逆時(shí)針?lè)较?,均勻地選取circlePointsNum個(gè)點(diǎn),依次存儲(chǔ)每一個(gè)點(diǎn)的橫坐標(biāo)和縱坐標(biāo)組成的二元組于circlePoints;
step12.2:圓周點(diǎn)的像素值整理復(fù)制,順序檢測(cè)circlePoints中的每一個(gè)點(diǎn)在前景二值圖foregroundMask里的值;從circlePoints中,把在前景二值圖foregroundMask中為“1”的那部分點(diǎn),按其從圓周上抽取的順序,依次復(fù)制它們?cè)赾urrentImage中的紅、綠、藍(lán)像素值于pixelList,同時(shí)記錄它們的橫縱坐標(biāo)到pixelIndexInCirclePoints中的相同位置;而后,從circlePoints中,把在前景二值圖foregroundMask中為“0”的那部分點(diǎn),按其從圓周上抽取的順序,緊跟著pixelList上的最后一個(gè)點(diǎn),依次復(fù)制它們?cè)赾urrentImage中的紅、綠、藍(lán)像素值于pixelList,同時(shí)記錄它們的橫縱坐標(biāo)于pixelIndexInCirclePoints中的相同位置;記錄pixelList中,在foregroundMask里為“1”且下標(biāo)最大的那個(gè)點(diǎn)的下標(biāo)LastInpointIndex;
step12.3:初始化最大類(lèi)間方差maxD=-1;
step12.4:初始化背景類(lèi)起始下標(biāo)i等于LastInpointIndex+1;
step12.5:判斷背景類(lèi)起始下標(biāo)i是否小于等于circlePointsNum;若是,轉(zhuǎn)向步驟step12.6;否則轉(zhuǎn)向step12.16;
step12.6:初始化背景類(lèi)終止下標(biāo)j等于背景類(lèi)起始下標(biāo)i;
step12.7:判斷背景類(lèi)終止下標(biāo)j是否小于等于circlePointsNum;若是,轉(zhuǎn)向步驟step12.8;否則,轉(zhuǎn)向step12.15;
step12.8:求分量類(lèi)間方差:把pixelList中,下標(biāo)從i到j(luò)的點(diǎn),看作一類(lèi);剩下的為另一類(lèi),分別就兩類(lèi)點(diǎn)的紅色像素值、綠色像素值、藍(lán)色像素值三個(gè)分量,求類(lèi)間方差d1、d2、d3;類(lèi)間方差公式為:d=ω1(μ1-μ)^2+ω2(μ2-μ)^2;
其中,ω1,ω2分別為第一類(lèi)和第二類(lèi)的點(diǎn)出現(xiàn)的概率,ω1+ω2=1;μ表示所有點(diǎn)某一顏色分量的像素均值;μ1、μ2分別為第一類(lèi)和第二類(lèi)的點(diǎn)某一顏色分量的像素均值;
step12.9:令綜合類(lèi)間方差D=d1+d2+d3;
step12.10:求修正系數(shù)modifyCoefficient,具體為:
step12.10.1:計(jì)算i和j的均值并取整,記為midOfij;
step12.10.2:求midOfij-LastInpointIndex和circlePointsNum-midOfij中的最小者,記為testX;
step12.10.3:計(jì)算(circlePointsNum-LastInpointIndex)/2,并取整,記為testR;
step12.10.4:modifyCoefficient=arctan(testX/testR×20)/(π/2);arctan為反正切函數(shù);
其中下標(biāo)為midOfij的點(diǎn)即為擬確定的葉外點(diǎn)o;葉片區(qū)域包含前景標(biāo)記區(qū)域,即foregroundMask中為“1”的點(diǎn)組成的區(qū)域,
step12.11:基于下式求綜合類(lèi)間方差修正值D’,D’=D^modifyCoefficient;
step12.12:判斷當(dāng)前的D’是否大于maxD,若是,轉(zhuǎn)向step12.13;否則,轉(zhuǎn)向step12.14;
step12.13:更新最優(yōu)值:maxD=D;bestStartIndex=i;bestStopIndex=j(luò);其中bestStartIndex表示最佳分類(lèi)方案的背景點(diǎn)類(lèi)起始下標(biāo);bestStopIndex表示最佳分類(lèi)方案的背景點(diǎn)類(lèi)終止下標(biāo);
step12.14:j=j(luò)+1;轉(zhuǎn)向step12.7;
step12.15:i=i+1;轉(zhuǎn)向step12.5;
step12.16:確定葉外點(diǎn)o的坐標(biāo):求bestStartIndex和bestStopIndex的均值并取整,以此為下標(biāo),在pixelIndexInCirclePoints中查詢得到葉外點(diǎn)o在currentImage中的橫縱坐標(biāo)。
優(yōu)選的,所述第三步結(jié)合葉外點(diǎn)信息修改前景背景標(biāo)記的具體實(shí)現(xiàn)過(guò)程為:
Step13:在背景二值圖像backgroundMask上修改所有葉外點(diǎn)o為“1”;
Step14:新建一個(gè)大小與backgroundMask一致的全“0”二值圖像backgroundMaskAdd;
Step15:初始化drawLineNum為0;
Step16:如果concavepointsNum小于等于6,轉(zhuǎn)向Step17,否則轉(zhuǎn)向Step18;
Step17:在backgroundMaskAdd上,在滿足特定條件的相鄰的每?jī)蓚€(gè)葉外點(diǎn)之間畫(huà)一條線;該線軌跡上的點(diǎn)均為“1”;每畫(huà)一條線,把drawLineNum累加1;
所述的相鄰是指:每個(gè)葉外點(diǎn)在outPosForLine的下標(biāo)相差為1,或者一個(gè)位于outPosForLine的第一個(gè)位置,另一個(gè)位置outPosForLine的最后一個(gè)位置;
所述的特定條件定義為:兩點(diǎn)距離小于標(biāo)準(zhǔn)參照距離standardDis的a1倍;或者兩點(diǎn)距離小于標(biāo)準(zhǔn)參照距離standardDis的a2倍,同時(shí)concavepointsNum小于等于b1;或者標(biāo)記點(diǎn)總數(shù)大于等于c1且兩點(diǎn)距離小于標(biāo)準(zhǔn)參照距離standardDis的a3倍,同時(shí)concavepointsNum小于等于b2;或者標(biāo)記點(diǎn)總數(shù)大于等于c2;
前述standardDis的取值是,currentImage寬度(矩形的短邊)的2%到50%間的任意值。
前述a1的取值范圍是[0.05,1];a2的取值范圍是[0.1,10]且要求a2>a1;a3的取值范圍是[0.5,50)且要求a3>a2;此外,要求a1、a2、a3與standardDis的乘積,均小于圖像的寬度。
前述b1的取值范圍是[2,10];b2的取值范圍是[1,5]且b2<b1。
前述c1的取值范圍是[10,30];c2的取值范圍是[20,40]且c2>c1。畫(huà)線的過(guò)程是:按在outPosForLine中的順序,把兩個(gè)葉外點(diǎn)分別作為第二點(diǎn)p2和第三點(diǎn)p3;把p2在outPosForLine中的前一個(gè)葉外點(diǎn),作為p1;p3在outPosForLine中的后一個(gè)葉外點(diǎn),作為p4;特別地,若p2為outPosForLine中的第一點(diǎn),則把outPosForLine中的最后一點(diǎn)作為p1;若p3為outPosForLine中的最后一點(diǎn),則把outPosForLine中的第1點(diǎn)作為p4;計(jì)算p1、p2、p3形成的三角形中,p2所在的角的角度;計(jì)算p2、p3、p4形成的三角形中,p3所在的角的角度;若上述兩個(gè)角度均大于等于預(yù)設(shè)的角度值(該預(yù)設(shè)的角度值是根據(jù)測(cè)試和經(jīng)驗(yàn)直接寫(xiě)進(jìn)去的一個(gè)值),依次以p1、p2、p3、p4為控制點(diǎn),在p2、p3間畫(huà)樣條曲線;否則,在p2、p3間畫(huà)直線段;
Step18:比較outPosForLine包含葉外點(diǎn)的總數(shù)和drawLineNum是否相等,若是,則認(rèn)為相鄰的每?jī)蓚€(gè)葉外點(diǎn)都在backgroundMaskAdd上畫(huà)了線,從而組成了封閉的曲線,轉(zhuǎn)向Step19:否則轉(zhuǎn)向Step21;
Step19:對(duì)backgroundMaskAdd進(jìn)行孔洞填充;
Step20:把backgroundMaskAdd取反;
Step21:計(jì)算backgroundMask=backgroundMask||backgroundMaskAdd;
Step22:在backgroundMask中,把在backgroundMask和foregroundMask中均為“1”的點(diǎn)重置為“0”;即刪除兩者的前景區(qū)域的重疊部分;
Step23:對(duì)foregroundMask做數(shù)學(xué)形態(tài)學(xué)的腐蝕操作。
優(yōu)選的,所述第四步分割及修正處理的具體實(shí)現(xiàn)過(guò)程為:
Step24:在rgb空間中,求currentImage的梯度圖VG;
Step25:求mask=backgroundMask||foregroundMask;
Step26:以VG為梯度圖,mask為標(biāo)記,作標(biāo)記分水嶺分割,得到outputImage;
Step27:確定foregroundMask任意一個(gè)為“1”的點(diǎn),在outputImage中的值leafLabelNum;
Step28:在outputImage中,把值為leafLabelNum的點(diǎn)設(shè)置為“1”,其余為“0”,得到二值圖像logicImage;
Step29:對(duì)logicImage作數(shù)學(xué)形態(tài)學(xué)閉運(yùn)算;
Step30:對(duì)logicImage作數(shù)學(xué)形態(tài)學(xué)開(kāi)運(yùn)算;
Step31:對(duì)logicImage進(jìn)行孔洞填充;
Step32:在logicImage中,刪除所有小面積區(qū)域,僅保留面積最大的唯一區(qū)域;
Step33:顯示結(jié)果,讓用戶判斷是否滿意;若是,全過(guò)程結(jié)束;若否,轉(zhuǎn)向Step34;
Step34:讓用戶修改所標(biāo)記的點(diǎn),即增加點(diǎn)或刪除已有的點(diǎn),同步更新pos;待用戶完成修改后,轉(zhuǎn)向Step5。
優(yōu)選的,所述Step24的具體實(shí)現(xiàn)過(guò)程為:
Step24.1:求x和y方向的偏導(dǎo)數(shù);令圖像currentImage上任意一點(diǎn)的坐標(biāo)為(x,y),像素值為(R,G,B),其中R,G,B分別表示紅、綠、藍(lán)的分量值;在此,(R,G,B)就是一個(gè)關(guān)于(x,y)的二元向量值函數(shù)。求
其中,和分別是二元向量值函數(shù)(R,G,B)關(guān)于x和y的偏導(dǎo)數(shù)。
Step24.2:求與自身的點(diǎn)積與自身的點(diǎn)積與的點(diǎn)積
Step24.3:求其中arctan為反正切函數(shù);θ1和θ2兩者之一,是二元向量值函數(shù)(R,G,B)的最大變化率方向的角度值,另一個(gè),則是相反方向的角度值。
Step24.4:求和和兩者其中之一,就是二元向量值函數(shù)(R,G,B)最大變化率的值。
Step24.5:max即為求取最大值的意思。以和中的最大者為F(x,y);F(x,y)即為所求的梯度值,存儲(chǔ)得到梯度圖VG。
本發(fā)明打破現(xiàn)有的僵局,提出拍攝植物葉片圖像,繼而進(jìn)行機(jī)器鑒別的設(shè)想,讓更多的只具有初步基礎(chǔ)的人員在野外通過(guò)簡(jiǎn)單的手機(jī)操作就能相對(duì)準(zhǔn)確地鑒定當(dāng)前植物的種類(lèi)。
和多數(shù)的圖像識(shí)別問(wèn)題一樣,葉片圖像的分割是第一道難關(guān)。在此,本文提出一種分割方法。先讓用戶近似地標(biāo)記少量的葉邊緣點(diǎn);接著在此基礎(chǔ)上,檢測(cè)出相應(yīng)的葉外點(diǎn);然后分別優(yōu)化構(gòu)造出前景標(biāo)記圖像和背景標(biāo)記圖像;最后應(yīng)用標(biāo)記分水嶺方法對(duì)圖像進(jìn)行分割。
本方法能對(duì)復(fù)雜背景的葉片圖像,實(shí)現(xiàn)較為準(zhǔn)確的分割。
從更長(zhǎng)遠(yuǎn)來(lái)看,在本方法基礎(chǔ)上繼續(xù)研究的植物機(jī)器識(shí)別,將來(lái)也可以用于幫助人們,特別是青少年,去認(rèn)識(shí)身邊的植物,從而慢慢地改變?nèi)藗儗?duì)待植物的生活態(tài)度,拉近人與植物的距離,幫助人們重回大自然的懷抱,盡情享受陽(yáng)光、綠樹(shù)、清風(fēng)的美好。
與現(xiàn)有技術(shù)相比,本發(fā)明技術(shù)方案的有益效果是:
基于葉片圖像的植物參數(shù)測(cè)定、病害自動(dòng)診斷和機(jī)器鑒別,是發(fā)展的趨勢(shì)。
目前,相關(guān)研究的圖像采集方式具體又分為兩種。一是把葉片摘下來(lái),再拍攝或掃描,得到簡(jiǎn)單背景葉片圖像。其優(yōu)點(diǎn)是圖像容易分割,分割準(zhǔn)確率高;缺點(diǎn)是對(duì)植物造成損傷?,F(xiàn)有研究多采用這種方式。二是直接拍攝枝干上的葉片,得到復(fù)雜背景葉片圖像。優(yōu)點(diǎn)是不對(duì)植物造成任何損傷;缺點(diǎn)是圖像中除了目標(biāo)葉片外,還含有枝干、泥土、其他葉片等背景對(duì)象,分割難度大,分割準(zhǔn)確率低,嚴(yán)重影響了后續(xù)分類(lèi)識(shí)別的準(zhǔn)確性。
本方法就是針對(duì)復(fù)雜背景葉片圖像,為了支持植物葉片的無(wú)損檢測(cè)或鑒別而設(shè)計(jì)的。它相比于已報(bào)道的同類(lèi)方法,有著更好的分割準(zhǔn)確性。初步測(cè)試,平均分割準(zhǔn)確率達(dá)99.03%。比當(dāng)前報(bào)道的最好結(jié)果85.95%有相對(duì)顯著的提升。
附圖說(shuō)明
圖1是本發(fā)明方法的流程圖。
圖2是圖像庫(kù)中隨機(jī)選取的4張葉片圖像及其分割結(jié)果示意圖;(a)為防風(fēng)草葉片原圖,(b)為防風(fēng)草分割結(jié)果圖;(c)為廣金錢(qián)草葉片原圖,(d)為廣金錢(qián)草分割結(jié)果圖;(e)為排前樹(shù)葉片原圖,(f)為排前樹(shù)分割結(jié)果圖;(g)為紫蘇葉片原圖,(h)為紫蘇分割結(jié)果圖。
具體實(shí)施方式
附圖僅用于示例性說(shuō)明,不能理解為對(duì)本專利的限制;為了更好說(shuō)明本實(shí)施例,附圖某些部件會(huì)有省略、放大或縮小,并不代表實(shí)際產(chǎn)品的尺寸;
對(duì)于本領(lǐng)域技術(shù)人員來(lái)說(shuō),附圖中某些公知結(jié)構(gòu)及其說(shuō)明可能省略是可以理解的。下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的說(shuō)明。
一種單目標(biāo)區(qū)域的復(fù)雜背景藥用植物葉片圖像的準(zhǔn)確分割方法,包括以下步驟:
預(yù)處理,具體如下:
step1:把彩色圖像縮小至適當(dāng)?shù)某叨认?。先?jì)算ratio=(2592×1936)/(圖像的行數(shù)×圖像的列數(shù))。若ratio<1,則把圖像以ratio的開(kāi)平方的值為倍數(shù)縮小;否則無(wú)需縮小。
step2:顯示處理后的圖像currentImage。
step3:讓用戶標(biāo)定葉邊緣點(diǎn)或葉內(nèi)點(diǎn),得到標(biāo)記點(diǎn)序列pos。在此,用戶選點(diǎn)的原則是:
第1個(gè)葉邊緣點(diǎn)標(biāo)定在葉基點(diǎn)處,然后循著順時(shí)針或逆時(shí)針?lè)较?,依次?biāo)定后續(xù)的葉邊緣點(diǎn)或葉內(nèi)點(diǎn)。要求前后相鄰的兩個(gè)標(biāo)記點(diǎn)之間的連線不經(jīng)過(guò)葉片的外部。當(dāng)?shù)诙螛?biāo)記第1點(diǎn)所在位置時(shí),標(biāo)記過(guò)程結(jié)束,第二次標(biāo)定的與第1點(diǎn)相同位置的點(diǎn),不會(huì)被存儲(chǔ)于pos。系統(tǒng)隨即會(huì)依次連接相鄰的兩點(diǎn),組成一個(gè)封閉的多邊形。如圖2(a)所示。
補(bǔ)充說(shuō)明:連接葉片和枝干的,常呈圓柱形的部分稱為葉柄;葉柄與葉片的交界處稱為葉基點(diǎn)。
step4:初始化背景二值圖backgroundMask。新建一個(gè)與當(dāng)前圖像currentImage大小一致的全“0”二值圖像backgroundMask,然后把它的四邊框上的像素全修改為“1”。
step5:初始化前景二值圖foregroundMask。新建一個(gè)與當(dāng)前圖像currentImage大小一致的全“0”二值圖像foregroundMask;然后在foregroundMask內(nèi),把處于pos中所有標(biāo)記點(diǎn)依次連結(jié)而成的多邊形polygon內(nèi)部及邊界上的點(diǎn),修改為“1”。
檢測(cè)葉外點(diǎn),具體如下:
step6:初始化計(jì)數(shù)器變量i=1。
step7:依次對(duì)pos中的每一個(gè)標(biāo)記點(diǎn)p,做step7.1至step7.6的操作,直至處理完pos中的所有點(diǎn)為止。
Step7.1:如果i小于等于標(biāo)記點(diǎn)總數(shù)(pos的點(diǎn)的總數(shù)),轉(zhuǎn)向step7.2,否則轉(zhuǎn)向step8。
Step7.2:i等于1么,若是,標(biāo)記pos中的第i點(diǎn)為葉邊緣點(diǎn)。(注:按約定,第1點(diǎn)是葉柄點(diǎn),一般而言,即便在多邊形polygon中是一個(gè)凹點(diǎn),也都應(yīng)判為葉邊緣點(diǎn)的。)轉(zhuǎn)向step7.6,否則轉(zhuǎn)向step7.3。
Step7.3:設(shè)置點(diǎn)p等于pos中的第i點(diǎn)
Step7.4:判斷點(diǎn)p在多邊形polygon中,是否為凸點(diǎn)。若是,確定點(diǎn)p為葉邊緣點(diǎn),即標(biāo)記pos中的第i點(diǎn)為葉邊緣點(diǎn),轉(zhuǎn)向step7.6;否則,轉(zhuǎn)向Step7.5。
Step7.5:把點(diǎn)p以及在pos中p前面的一點(diǎn)pBefore、在pos中p后面的一點(diǎn)pBehind(若點(diǎn)p是pos中的最后一點(diǎn),把pos中的第一點(diǎn)作為pBehind),組成三角形,計(jì)算p所在的角的角度angle1。若angle1大于某個(gè)接近180度的值(如170度),則確定點(diǎn)p為葉邊緣點(diǎn),即標(biāo)記pos中的第i點(diǎn)為葉邊緣點(diǎn)。
Step7.6:i=i+1,轉(zhuǎn)向step7.1。
Step8:統(tǒng)計(jì)pos中,未被標(biāo)記為葉邊緣點(diǎn)的點(diǎn)數(shù)concavepointsNum。concavepointsNum也可以近似理解為凹點(diǎn)的數(shù)量。
Step9:設(shè)置一個(gè)葉邊緣點(diǎn)判斷距離,如設(shè)為currentImage的寬度的10分之1。
Step10:判斷concavepointsNum是否大于2,若是,把葉邊緣點(diǎn)判斷距離加倍。(注:多于2個(gè)凹點(diǎn),就考慮葉片有大鋸齒了)
Step11:對(duì)pos中每一個(gè)未被標(biāo)記為葉邊緣點(diǎn)的點(diǎn)p,判斷點(diǎn)p與前面的一點(diǎn)pBefored的距離,以及與后面一點(diǎn)pBehind的距離,均小于葉邊緣點(diǎn)判斷距離,若是,確定點(diǎn)p為葉邊緣點(diǎn)。
step12:檢測(cè)每一個(gè)葉邊緣點(diǎn)p的葉外點(diǎn)o,并依次存于點(diǎn)列表outPosForLine。其中,檢測(cè)一個(gè)葉邊緣點(diǎn)p對(duì)應(yīng)的葉外點(diǎn)o的具體過(guò)程如下:
step12.1:抽樣選取圓周上的點(diǎn)。在葉邊緣點(diǎn)p為中心,radius(如25)為半徑的圓周上,按順時(shí)針或逆時(shí)針?lè)较颍鶆虻剡x取circlePointsNum(如circlePointsNum=radius×9)個(gè)點(diǎn),依次存儲(chǔ)每一個(gè)點(diǎn)的橫坐標(biāo)和縱坐標(biāo)組成的二元組(后面簡(jiǎn)稱橫縱坐標(biāo))于circlePoints。
step12.2:圓周點(diǎn)的像素值整理復(fù)制。順序檢測(cè)circlePoints中的每一個(gè)點(diǎn)在前景二值圖foregroundMask里的值。從circlePoints中,把在前景二值圖foregroundMask中為“1”的那部分點(diǎn),按其從圓周上抽取的順序,依次復(fù)制它們?cè)赾urrentImage中的紅、綠、藍(lán)像素值于pixelList,同時(shí)記錄它們的橫縱坐標(biāo)到pixelIndexInCirclePoints中的相同位置。而后,從circlePoints中,把在前景二值圖foregroundMask中為“0”的那部分點(diǎn),按其從圓周上抽取的順序,緊跟著pixelList上的最后一個(gè)點(diǎn),依次復(fù)制它們?cè)赾urrentImage中的紅、綠、藍(lán)像素值于pixelList,同時(shí)記錄它們的橫縱坐標(biāo)于pixelIndexInCirclePoints中的相同位置。記錄pixelList中,在foregroundMask里為“1”且下標(biāo)最大的那個(gè)點(diǎn)的下標(biāo)LastInpointIndex。
step12.3:初始化最大類(lèi)間方差maxD=-1;
step12.4:初始化背景類(lèi)起始下標(biāo)i等于LastInpointIndex+1;
step12.5:判斷背景類(lèi)起始下標(biāo)i是否小于等于circlePointsNum;若是,轉(zhuǎn)向步驟step12.6;否則轉(zhuǎn)向step12.16;
step12.6:初始化背景類(lèi)終止下標(biāo)j等于背景類(lèi)起始下標(biāo)i;
step12.7:判斷背景類(lèi)終止下標(biāo)j是否小于等于circlePointsNum;若是,轉(zhuǎn)向步驟step12.8;否則,轉(zhuǎn)向step12.15;
step12.8:求分量類(lèi)間方差:把pixelList中,下標(biāo)從i到j(luò)的點(diǎn),看作一類(lèi);剩下的為另一類(lèi),分別就兩類(lèi)點(diǎn)的紅色像素值、綠色像素值、藍(lán)色像素值三個(gè)分量,求類(lèi)間方差d1、d2、d3;類(lèi)間方差公式為:d=ω1(μ1-μ)^2+ω2(μ2-μ)^2;
其中,ω1,ω2分別為第一類(lèi)和第二類(lèi)的點(diǎn)出現(xiàn)的概率,ω1+ω2=1;μ表示所有點(diǎn)某一顏色分量的像素均值;μ1、μ2分別為第一類(lèi)和第二類(lèi)的點(diǎn)某一顏色分量的像素均值;
step12.9:令綜合類(lèi)間方差D=d1+d2+d3;
step12.10:求修正系數(shù)modifyCoefficient,具體為:
step12.10.1:計(jì)算i和j的均值并取整,記為midOfij;
step12.10.2:求midOfij-LastInpointIndex和circlePointsNum-midOfij中的最小者,記為testX;
step12.10.3:計(jì)算(circlePointsNum-LastInpointIndex)/2,并取整,記為testR;
step12.10.4:modifyCoefficient=arctan(testX/testR×20)/(π/2);arctan為反正切函數(shù);
其中下標(biāo)為midOfij的點(diǎn)即為擬確定的葉外點(diǎn)o;葉片區(qū)域包含前景標(biāo)記區(qū)域,即foregroundMask中為“1”的點(diǎn)組成的區(qū)域,
說(shuō)明:下標(biāo)為midOfij的點(diǎn)即為擬確定的葉外點(diǎn)o。葉片區(qū)域包含前景標(biāo)記區(qū)域(foregroundMask中為“1”的點(diǎn)組成的區(qū)域),前者的范圍比后者要大。單就這一因素而言,點(diǎn)o距離前景標(biāo)記區(qū)域的兩個(gè)邊界點(diǎn)越遠(yuǎn),它正確落到葉外區(qū)域的可能性就越大。當(dāng)點(diǎn)o非常靠近前景標(biāo)記區(qū)域時(shí),即便它依然處于前景標(biāo)記區(qū)域的外部,但是,它錯(cuò)誤地落入葉片內(nèi)部的風(fēng)險(xiǎn)也很高。所以,總的來(lái)說(shuō),修正系數(shù)modifyCoefficient的作用是鼓勵(lì)遠(yuǎn)離前景標(biāo)記區(qū)域的情形,抑制過(guò)于靠近前景標(biāo)記區(qū)域的情形。
step12.11:基于下式求綜合類(lèi)間方差修正值D’,D’=D^modifyCoefficient;
step12.12:判斷當(dāng)前的D’是否大于maxD,若是,轉(zhuǎn)向step12.13;否則,轉(zhuǎn)向step12.14;
step12.13:更新最優(yōu)值:maxD=D;bestStartIndex=i;bestStopIndex=j(luò);其中bestStartIndex表示最佳分類(lèi)方案的背景點(diǎn)類(lèi)起始下標(biāo);bestStopIndex表示最佳分類(lèi)方案的背景點(diǎn)類(lèi)終止下標(biāo);
step12.14:j=j(luò)+1。轉(zhuǎn)向step12.7。
step12.15:i=i+1。轉(zhuǎn)向step12.5。
step12.16:確定葉外點(diǎn)o的坐標(biāo):求bestStartIndex和bestStopIndex的均值并取整,以此為下標(biāo),在pixelIndexInCirclePoints中查詢得到葉外點(diǎn)o在currentImage中的橫縱坐標(biāo)。
結(jié)合葉外點(diǎn)信息修改前景背景標(biāo)記,具體如下:
Step13:在背景二值圖像backgroundMask上修改所有葉外點(diǎn)o為“1”。
Step14:新建一個(gè)大小與backgroundMask一致的全“0”二值圖像backgroundMaskAdd。
Step15:初始化drawLineNum為0。
Step16:如果concavepointsNum小于等于6,轉(zhuǎn)向Step17,否則轉(zhuǎn)向Step18。(注:凹點(diǎn)少于等于6時(shí),才考慮畫(huà)葉外線。凹點(diǎn)多于6,很大可能是鋸齒較大的葉片。此時(shí)應(yīng)該避免畫(huà)線,以防誤傷鋸齒。)
Step17:在backgroundMaskAdd上,于滿足特定條件的相鄰的每?jī)蓚€(gè)葉外點(diǎn)之間,畫(huà)一條線。該線軌跡上的點(diǎn)均為“1”。每畫(huà)一條線,就把drawLineNum累加1。
所述的相鄰是指:每個(gè)葉外點(diǎn)在outPosForLine的下標(biāo)相差為1,或者一個(gè)位于outPosForLine的第一個(gè)位置,另一個(gè)位置outPosForLine的最后一個(gè)位置。
所述的特定條件定義為:兩點(diǎn)距離小于currentImage的寬度的10分之1的一半;或者兩點(diǎn)距離小于currentImage的寬度的10分之1,同時(shí)concavepointsNum小于等于4;或者標(biāo)記點(diǎn)總數(shù)(pos的點(diǎn)的總數(shù))大于等于20且兩點(diǎn)距離小于某參數(shù)值的2倍,同時(shí)concavepointsNum小于等于2;或者標(biāo)記點(diǎn)總數(shù)大于等于30。(凹點(diǎn)多于2,就要堤防具有鋸齒的情形,畫(huà)線的條件就要收緊。)
畫(huà)線的過(guò)程是:按在outPosForLine中的順序,把兩個(gè)葉外點(diǎn)分別作為第二點(diǎn)p2,和第三點(diǎn)p3。把p2在outPosForLine中的前一個(gè)葉外點(diǎn),作為p1;p3在outPosForLine中的后一個(gè)葉外點(diǎn),作為p4。特別地,若p2為outPosForLine中的第一點(diǎn),則把outPosForLine中的最后一點(diǎn)作為p1;若p3為outPosForLine中的最后一點(diǎn),則把outPosForLine中的第1點(diǎn)作為p4。計(jì)算p1、p2、p3形成的三角形中,p2所在的角的角度;計(jì)算p2、p3、p4形成的三角形中,p3所在的角的角度。若上述兩個(gè)角度均大于等于某參數(shù)值(如90度),依次以p1、p2、p3、p4為控制點(diǎn),在p2、p3間畫(huà)樣條曲線(如三次B樣條);否則,在p2、p3間畫(huà)直線段。
Step18:比較outPosForLine包含葉外點(diǎn)的總數(shù)和drawLineNum是否相等,若是,則認(rèn)為相鄰的每?jī)蓚€(gè)葉外點(diǎn)都在backgroundMaskAdd上畫(huà)了線,從而組成了封閉的曲線,轉(zhuǎn)向Step19:否則轉(zhuǎn)向Step21。
Step19:對(duì)backgroundMaskAdd進(jìn)行孔洞填充。
Step20:把backgroundMaskAdd取反。
Step21:計(jì)算backgroundMask=backgroundMask||backgroundMaskAdd。
Step22:在backgroundMask中,把在backgroundMask和foregroundMask中均為“1”的點(diǎn)重置為“0”。即刪除兩者的前景區(qū)域的重疊部分。
Step23:對(duì)foregroundMask做數(shù)學(xué)形態(tài)學(xué)的腐蝕操作。
分割及修正,具體如下:
Step24:在rgb空間中,求currentImage的梯度圖VG。具體過(guò)程是:
Step24.1:求x和y方向的偏導(dǎo)數(shù)。令圖像currentImage上任意一點(diǎn)的坐標(biāo)為(x,y),像素值為(R,G,B),其中R,G,B分別表示紅、綠、藍(lán)的分量值。求
在本實(shí)施例中,計(jì)算等六個(gè)偏導(dǎo)數(shù)時(shí),可以使用sobel算子。
Step24.2:求
Step24.3:求其中arctan為反正切函數(shù)。
Step24.4:求和
Step24.5:以和中的最大者為F(x,y)。F(x,y)即為所求的梯度值,存儲(chǔ)得到梯度圖VG。
Step25:求mask=backgroundMask||foregroundMask。
Step26:以VG為梯度圖,mask為標(biāo)記,作標(biāo)記分水嶺分割,得到outputImage。
Step27:確定foregroundMask任意一個(gè)為“1”的點(diǎn),在outputImage中的值leafLabelNum。
Step28:在outputImage中,把值為leafLabelNum的點(diǎn)設(shè)置為“1”,其余為“0”,得到二值圖像logicImage。
Step29:對(duì)logicImage作數(shù)學(xué)形態(tài)學(xué)閉運(yùn)算。
Step30:對(duì)logicImage作數(shù)學(xué)形態(tài)學(xué)開(kāi)運(yùn)算。
Step31:對(duì)logicImage進(jìn)行孔洞填充。
Step32:在logicImage中,刪除所有小面積區(qū)域,僅保留面積最大的唯一區(qū)域。
Step33:顯示結(jié)果,讓用戶判斷是否滿意。若是,全過(guò)程結(jié)束;若否,轉(zhuǎn)向Step34。
Step34:讓用戶修改所標(biāo)記的點(diǎn),即增加點(diǎn)或刪除已有的點(diǎn),同步更新pos。待用戶完成修改后,轉(zhuǎn)向Step5。
顯然,本發(fā)明的上述實(shí)施例僅僅是為清楚地說(shuō)明本發(fā)明所作的舉例,而并非是對(duì)本發(fā)明的實(shí)施方式的限定。對(duì)于所屬領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在上述說(shuō)明的基礎(chǔ)上還可以做出其它不同形式的變化或變動(dòng)。這里無(wú)需也無(wú)法對(duì)所有的實(shí)施方式予以窮舉。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明權(quán)利要求的保護(hù)范圍之內(nèi)。