基于Matlab LBP實現(xiàn)植物葉片識別功能
一、LBP簡介
第一章 引言
植物在我們的身邊隨處可見,它們從產(chǎn)生發(fā)展進化到現(xiàn)在,其間經(jīng)歷了漫長的歲月。地球上的植物種類繁多、數(shù)量浩瀚,它們是生物圈的重要組成部分,在維持整個生物界的平衡方面發(fā)揮著巨大的作用;它們同時也是構(gòu)成人類生存環(huán)境的重要組成部分,是人類社會延續(xù)和發(fā)展不可或缺的重要因素。由于植物對于地球和人類都具有如此重要的意義,對它們的研究就顯得尤為重要,但不同種類的植物在形態(tài)構(gòu)造、生活習性、經(jīng)濟價值等各方面都表現(xiàn)出不同的特性,為了能更好、更有效地研究和利用各種植物,人們對植物進行了識別和分類,從而產(chǎn)生了植物分類學。在計算機科學與技術(shù)廣泛滲透于的大環(huán)境中,如何將計算機的各種相關技術(shù)應用于該領域也就成為研究工作中一項非常重要的內(nèi)容。
1.1 課題的提出與研究意義
自然界的植物是世界上物種數(shù)量最多并且分布最廣泛的的生命形式,與人類以及環(huán)境的關系最為密切。而即使是最專業(yè)的科學家也不可能記住所有植物的種類。所以由于人類生產(chǎn)活動造成了植物物種的滅絕的實例也數(shù)不勝數(shù)。而植物在維持生物平衡、水土保持等方面又起著重要的作用;同時,植物農(nóng)業(yè)作為國民經(jīng)濟命脈,是人們生產(chǎn)生活的基礎部分,提高農(nóng)業(yè)生產(chǎn)需要植物的精細數(shù)據(jù),因此植物分類和識別具有非常重要的意義。一方面,人們能夠通過植物識別系統(tǒng)毫不費力的查詢到植物的種類以及其他相關信息,能夠更好的保護瀕危物種,幫助維持生態(tài)平衡,另一方面,通過植物葉片圖像也可以鑒別出植物是否受到病蟲害。因此我們希望建立植物葉片識別系統(tǒng)來對農(nóng)作物以及各種稀有植物進行識別。采用模式識別和圖像處理的方法,用計算機軟件來對農(nóng)作物病蟲害以及各種植物進行分析、鑒別,從而實現(xiàn)稀有物種的快速鑒別或者農(nóng)作物病蟲害的自動診斷。因此,開發(fā)一種快速、準確的識別植物葉片的方法極具現(xiàn)實意義。
1.2 國內(nèi)外相關研究情況
植物的分類與識別一般選取植物的局部特征[1],例如植物的葉、花、根等特征。這些器官都有各自的分類價值,但是比起植物的其他器官,植物葉片的存活時間較長,在一年的大部分時間里都可較為方便的采集到,所以作為植物的識別特征和認知植物的主要參照器官。因此基于葉片的識別是識別一種植物最直接有效的切最簡單的方法。
Ojala[2]等人于2002年提出的局部二進制模式(LBP)[3],LBP算子定義為在33的窗口內(nèi),以窗口中心像素為閾值,將相鄰的8個像素的灰度值與其進行比較,若周圍像素值大于中心像素值,則該像素點的位置被標記為1,否則為0。33領域內(nèi)的8個點可產(chǎn)生8bit的無符號數(shù),即得到該窗口的LBP值,并用這個值來反映該區(qū)域的紋理信息.該方法分析紋理的吸引人的地方在于其計算復雜度小,具有多尺度特性和旋轉(zhuǎn)不變特性,在紋理檢索領域[4]得到應用。局部二值模式(LBP)是由Ojala等人于2002年提出,它被用于特征提取,而且,提取的特征是圖像的紋理特征,并且,是局部的紋理特征。
局部二值模式(LBP)提取的特征跟位置信息是緊密相關的。直接對兩幅圖片提取這種特征,并進行判別分析的話,會因為“位置沒有對準”而產(chǎn)生很大的誤差。后來,研究人員發(fā)現(xiàn),可以將一幅圖片劃分為若干的子區(qū)域,對每個子區(qū)域內(nèi)的每個像素點都提取LBP特征,然后,在每個子區(qū)域內(nèi)建立LBP特征的統(tǒng)計直方圖。如此一來,每個子區(qū)域,就可以用一個統(tǒng)計直方圖來進行描述;整個圖片就由若干個統(tǒng)計直方圖組成。
原始的LBP提出后,研究人員不斷對其提出了各種改進和優(yōu)化,從而得到了諸如半徑為R的圓形區(qū)域內(nèi)含有P個采樣點的LBP算子;LBP均勻模式;LBP旋轉(zhuǎn)不變模式;LBP等價模式[5] 。
1.3 論文的主要研究工作
本文的研究工作主要包括以下幾個方面:綜述了模式識別相關技術(shù)的研究現(xiàn)狀,研究了 LBP 方法以及 LBP 算子的相關理論、研究及應用,設計并實現(xiàn)了基于 LBP的植物葉片識別系統(tǒng),并用葉片樣本對系統(tǒng)進行了測試驗證。
本文深入研究了 LBP 方法的相關理論。LBP 方法將圖像紋理的兩種不同分類方法(即基于統(tǒng)計特征判別的分類方法和基于結(jié)構(gòu)特征判別的分類方法)有效地結(jié)合了起來,在一定程度上解決了對圖像紋理構(gòu)成的單一分類所帶來的問題。LBP 算子是提取圖像 LBP 特征的具體工具,本文詳細介紹了 LBP 算子的基本方法。
本文規(guī)劃了系統(tǒng)的體系結(jié)構(gòu),設計了系統(tǒng)的工作流程,將整個系統(tǒng)所實現(xiàn)的功能分成了樣本采集和預處理模塊、LBP 特征提取模塊和數(shù)據(jù)庫模塊等三個個功能模塊,然后對系統(tǒng)流程的各主要環(huán)節(jié)的設計與實現(xiàn)進行了詳細的介紹。
實際采集了3種不同植物的葉片圖像樣本,樣本總數(shù)將近40例。用這些樣本對系統(tǒng)進行了測試,得到了測試結(jié)果。
本文主要的工作在于應用 LBP 方法進行植物葉片樣本紋理分析,進而設計與實現(xiàn)了基于 LBP 的植物葉片分類識別系統(tǒng)。雖然 LBP 方法的應用領域涉及面很廣,但是目前在植物葉片分類識別領域幾乎還沒有相關的研究和應用,有很多具體的理論研究與實踐應用方面的工作還有待于進一步的深化。本文所設計與實現(xiàn)的基于 LBP 的植物葉片識別系統(tǒng)屬于該領域內(nèi)的創(chuàng)新工作。
1.4 論文結(jié)構(gòu)
本文結(jié)構(gòu)如下:
第一章 緒論
闡述課題背景,分析特征提取及LBP方法的國內(nèi)外研究現(xiàn)狀,明確課題研究的意義及目標,介紹論文的主要工作;并對論文結(jié)構(gòu)安排做了說明。
第二章 LBP方法的理論研究
對LBP特征提取的相關概念進行介紹,重點介紹LBP相關原理及基本特性,針對本研究課題,重點研究LBP特征在相關領域中的應用,針對當前的主要應用對LBP方法進行分析,為本文研究奠定理論基礎。
第三章基于LBP植物葉片識別系統(tǒng)設計
主要闡述了植物葉片識別系統(tǒng)的總體設計思路,并且詳細介紹了每個系統(tǒng)模塊的設計思想。在此基礎之上,更加詳細的介紹了每個系統(tǒng)模塊的主要功能和實現(xiàn)方法。同時,介紹了關鍵環(huán)節(jié)的設計。
第四章實驗結(jié)果
主要展示了本次研究得到的成果,分析實驗結(jié)果,驗證了基于LBP特征提取在植物葉片識別中的可行性。
第五章總結(jié)與展望
對論文的主要研究工作和貢獻進行總結(jié),并在當前工作的基礎上,結(jié)合研究中遇到的問題,為下一步研究工作提供參考。
二、部分源代碼
clc;clear; allsamples=[];%所有訓練圖像 M=300;N=300; SubNum=3; SubRow = M/SubNum; SubCol = N/SubNum; LbpHist=zeros(8,SubNum*SubNum*59); for n=1:3 ? ?for m=1:8 ? ? ?I11=imread(strcat('.bmp')); ? ? ?[M,N]=size(I11); ? ? ?%分塊獲取LBP直方圖,共分SubNum*SubNum塊,每塊提取1*59的特征 ? ? ?%所以總共特征數(shù)為1*(SubNum*SubNum*59) ? ? ?%初始化特征向量及分塊數(shù) ? ? ?h=((n-1)*8+m); ? ? ?SP=[-1 -1; -1 0; -1 1; 0 -1; -0 1; 1 -1; 1 0; 1 1]; ? ? ?mapping=getmapping(8,'u2'); ?? ? ? ?for i=1:SubNum ? ? ? ?for j=1:SubNum ? ? ? ? ? Img = I11(((i-1)*SubRow+1):i*SubRow, ((j-1)*SubCol+1):j*SubCol); ? ? ? ? ? LbpImg = LBP(Img,SP,0,'i'); ? ? ? ? ? H11=LBP(LbpImg,1,8,mapping,'h'); ? ? ? ? ? Index = (i-1)*SubNum+j; ? ? %計算第幾塊? ? ? ? ? ? LbpHist(h,((Index-1)*59+1):Index*59)=H11; ? ? ? ?end ? ? ?end ? ? ?%imshow(I11); ? ? ?%下面這行的112和92兩個數(shù)據(jù)哪里來的?干什么用?記住多用容易認的變量,比如SubNum ? ? ?b=I11(1:SubNum*SubNum*59); % b是行矢量 1×N,其中N=112*92,提取順序是先列后行,即從上到下,從左到右 ? ? ?b=double(b); ? ? ?%allsamples有何作用? ? ? ?allsamples=[allsamples; b]; ?% allsamples 是一個M * N 矩陣,allsamples 中每一行數(shù)據(jù)代表一張圖片,其中M=200 ? ?end end ? [fn,pn,fi]=uigetfile('*.bmp','選擇圖片'); ? I12=imread([pn fn]); ? [M1,N1]=size(I12); ? SubNum=3; ? SubRow = M1/SubNum; ? SubCol = N1/SubNum; ? LbpHist1=zeros(1,SubNum*SubNum*59); ? SP=[-1 -1; -1 0; -1 1; 0 -1; -0 1; 1 -1; 1 0; 1 1]; ? mapping=getmapping(8,'u2'); ?? ? ? ?for i=1:SubNum ? ? ? ?for j=1:SubNum ? ? ? ? ? Img1 = I12(((i-1)*SubRow+1):i*SubRow, ((j-1)*SubCol+1):j*SubCol); ? ? ? ? ? LbpImg1 = LBP(Img1,SP,0,'i'); ? ? ? ? ? H12=LBP(LbpImg1,1,8,mapping,'h'); ? ? ? ? ? Index = (i-1)*SubNum+j; ? ? %計算第幾塊? ? ? ? ? ? LbpHist1(((Index-1)*59+1):Index*59)=H12; ? ? ? ?end ? ? ?end ? ? ?juli=zeros(1,24); ? ? ?for j=1:24 ? ? ? ? ?for i=1:SubNum*SubNum*59 ? ? ? ? ? ? ?S=LbpHist(j,i); ? ? ? ? ? ? ?Q=LbpHist1(i); ? ? ? ? ? ? ?S1=S-Q; ? ? ? ? ? ? ?Q1=S+Q; ? ? ? ? ? ? ?f=sum(S1^2/Q1); ? ? ? ? ?end ? ? ? ? ?juli(1,j:j+1)=f; ? ? ?end min=min(juli); [m2,n2]=find(juli==min); [xsort,index]=sort(juli); n3=index(1); class1=8; class2=16; class3=24; if n3<=class1 ? ? disp('這個葉片屬于class1'); else if n3>class1&&n3<=class2 ? ? ? ?disp('這個葉片屬于class2'); ? ? ? ?else if n3>class2&&n3<=class3 ? ? ? ? ? ? ? ?disp('這個葉片屬于class3'); ? ? ? ? ? ?else ? ? ? ? ? ? ? ?disp('沒有類別'); ? ? ? ? ? ?end ? ? end end % GETMAPPING returns a structure containing a mapping table for LBP codes. % ?MAPPING = GETMAPPING(SAMPLES,MAPPINGTYPE) returns a % ?structure containing a mapping table for % ?LBP codes in a neighbourhood of SAMPLES sampling % ?points. Possible values for MAPPINGTYPE are % ? ? ? 'u2' ? for uniform LBP % ? ? ? 'ri' ? for rotation-invariant LBP % ? ? ? 'riu2' for uniform rotation-invariant LBP. % % ?Example: % ? ? ? I=imread('rice.tif'); % ? ? ? MAPPING=getmapping(16,'riu2'); % ? ? ? LBPHIST=lbp(I,2,16,MAPPING,'hist'); % ?Now LBPHIST contains a rotation-invariant uniform LBP % ?histogram in a (16,2) neighbourhood. % function mapping = getmapping(samples,mappingtype) % Version 0.1.1 % Authors: Marko Heikkil?and Timo Ahonen % Changelog % 0.1.1 Changed output to be a structure % Fixed a bug causing out of memory errors when generating rotation % invariant mappings with high number of sampling points. % Lauge Sorensen is acknowledged for spotting this problem. table = 0:2^samples-1; newMax ?= 0; %number of patterns in the resulting LBP code index ? = 0; if strcmp(mappingtype,'u2') %Uniform 2 ? newMax = samples*(samples-1) + 3; ? for i = 0:2^samples-1 ? ? j = bitset(bitshift(i,1,samples),1,bitget(i,samples)); %rotate left ? ? numt = sum(bitget(bitxor(i,j),1:samples)); %number of 1->0 and ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%0->1 transitions ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%in binary string ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%x is equal to the ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%number of 1-bits in ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%XOR(x,Rotate left(x)) ? ? if numt <= 2 ? ? ? table(i+1) = index; ? ? ? index = index + 1; ? ? else ? ? ? table(i+1) = newMax - 1; ? ? end ? end end if strcmp(mappingtype,'ri') %Rotation invariant ? tmpMap = zeros(2^samples,1) - 1; ? for i = 0:2^samples-1 ? ? rm = i; ? ? r ?= i; ? ? for j = 1:samples-1 ? ? ? r = bitset(bitshift(r,1,samples),1,bitget(r,samples)); %rotate ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%left ? ? ? if r < rm ? ? ? ? rm = r; ? ? ? end ? ? end ? ? if tmpMap(rm+1) < 0 ? ? ? tmpMap(rm+1) = newMax; ? ? ? newMax = newMax + 1; ? ? end ? ? table(i+1) = tmpMap(rm+1); ? end end if strcmp(mappingtype,'riu2') %Uniform & Rotation invariant ? newMax = samples + 2; ? for i = 0:2^samples - 1 ? ? j = bitset(bitshift(i,1,samples),1,bitget(i,samples)); %rotate left ? ? numt = sum(bitget(bitxor(i,j),1:samples)); ? ? if numt <= 2 ? ? ? table(i+1) = sum(bitget(i,1:samples)); ? ? else ? ? ? table(i+1) = samples+1; ? ? end ? end end mapping.table=table; mapping.samples=samples; mapping.num=newMax;
三、運行結(jié)果
到此這篇關于基于Matlab LBP實現(xiàn)植物葉片識別功能的文章就介紹到這了,更多相關Matlab LBP植物葉片識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Visual?Studio?2022?配置?PCL?1.12.1?的問題小結(jié)
這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗總結(jié)分享,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08C++實現(xiàn)string存取二進制數(shù)據(jù)的方法
這篇文章主要介紹了C++實現(xiàn)string存取二進制數(shù)據(jù)的方法,針對STL中string的用法進行了較為詳細的分析,需要的朋友可以參考下2014-10-10