梯度方向直方圖HOG_第1頁
梯度方向直方圖HOG_第2頁
梯度方向直方圖HOG_第3頁
梯度方向直方圖HOG_第4頁
梯度方向直方圖HOG_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

圖像梯度方向直方圖學習

HOG〔HistogramofOrientedGradient〕是2005年CVPR會議上,法國國家計算機科學及自動控制研究所的Dalal等人提出的一種解決人體目標檢測的圖像描述子,該方法使用梯度方向直方圖〔HistogramofOrientedGradients,簡稱HOG〕特征來表達人體,提取人體的外形信息和運動信息,形成豐富的特征集。

HOG描述子高維圖像特征向量生成步驟:1.圖像歸一化;

2.利用一階微分計算圖像梯度;3.基于梯度幅值的方向權(quán)重投影;4.HOG特征向量歸一化;

5.得出HOG最終的特征向量step1:圖像歸一化

歸一化圖像的主要目的是提高檢測器對光照的魯棒性,因為實際的人體目標可能出現(xiàn)的各種不同的場合,檢測器,必須對光照不太敏感才會有好的效果。Step2利用一階微分計算圖像梯度1、圖像平滑

對于灰度圖像,一般為了去除噪點,所以會先利用離散高斯平滑模板進行平滑:高斯函數(shù)在不同平滑的尺度下進行對灰度圖像進行平滑操作,Dalal等實驗說明在下,人體檢測效果最正確〔即不做高斯平滑〕,使得錯誤率縮小了約一倍。不做平滑操作,可能原因:圖像時基于邊緣的,平滑會降低邊緣信息的比照度,從而減少圖像中的信號信息。2、梯度法求圖像梯度Step3基于梯度幅值的方向權(quán)重投影

HOG結(jié)構(gòu):

通常使用的HOG結(jié)構(gòu)大致有三種:矩形HOG〔簡稱為R-HOG〕,圓形HOG和中心環(huán)繞HOG。它們的單位都是Block〔即塊〕。Dalal的試驗證明矩形HOG和圓形HOG的檢測效果根本一致,而環(huán)繞形HOG效果相對差一些。并且,圓形與環(huán)繞形的HOG文獻比擬少,應(yīng)用研究沒有矩形HOG普遍。所以,著重講解矩形HOG的情況。矩形HOG塊的劃分:一般一個塊〔Block〕都由假設(shè)干單元〔Cell〕組成,一個單元都有如干個像素點組成。

在每個Cell中有獨立做梯度方向統(tǒng)計,從而以梯度方向為橫軸的的直方圖,梯度方向可取0度到180度或0度~360度,但dalal實驗說明,對于人體目標檢測0度~180度這種忽略度數(shù)正負級的方向范圍能夠取得更好的結(jié)果。然后又將這個梯度分布平均分成個方向角度〔orientationbins〕,每個方向角度范圍都會對應(yīng)一個直方柱。根據(jù)Dalal等人實驗,在人體目標檢測中,在無符號方向角度范圍并將其平均分成9份〔bins〕能取得最好的效果,當bin的數(shù)目繼續(xù)增大效果改變不明顯,故一般在人體目標檢測中使用bin數(shù)目為9范圍0~180度的度量方式。

對梯度方向的投影權(quán)重方式的選?。簩τ谔荻确较虻募訖?quán)投影,一般都采用一個權(quán)重投影函數(shù),它可以是像素點的梯度幅值,梯度幅值的平方根或梯度幅值的平方,甚至可以使梯度幅值的省略形式,它們都能夠一定程度上反響出像素上一定的邊緣信息。根據(jù)Dalal等人論文的測試結(jié)果,采用梯度幅值量級本身得到的檢測效果最正確,使用量級的平方根會輕微降低檢測結(jié)果,而使用二值的邊緣權(quán)值表示會嚴重降低效果〔約為5%個單位10-4FPPW〔FalsePositivesPerWindow〕〕。

問:塊與塊之間是相互獨立的么?答:通常的將某個變量范圍固定劃分為幾個區(qū)域,由于邊界變量與相鄰區(qū)域也有相關(guān)性,所以變量只對一個區(qū)域進行投影而對相鄰區(qū)域完全無關(guān)時會對其他區(qū)域產(chǎn)生混疊效應(yīng)。

分塊之間的相關(guān)性問題的解決:方案一:塊重疊,重復統(tǒng)計計算。

方案二:線性插值權(quán)重分配

重疊塊:Datal等人在他們那篇關(guān)于HOG最為經(jīng)典的論文《HistogramofOrientedGradientforHumanDetection》提出了利用塊與塊的重疊〔Overlap〕來解決混疊,并且取得了不錯的效果。在重疊方式中,塊與塊之間的邊緣點被重復根據(jù)權(quán)重投影到各自相鄰塊〔block〕中,從而一定模糊了塊與塊之間的邊界,處于塊邊緣局部的像素點也能夠給相鄰塊中的方向梯度直方圖提供一定奉獻,從而到達關(guān)聯(lián)塊與塊之間的關(guān)系的作用。Datal對于塊和塊之間相互重疊程度對人體目標檢測識別率影響也做了實驗分析。

利用線性插值的方法解決分塊之間聯(lián)系問題:有些文獻采用的不是塊與塊重疊的方法,而是采用線性插值的方法來削弱混疊效應(yīng)。這種方法的主要思想是每個Block都對臨近的Block都有影響,這種影響,我們可以以一種加權(quán)方式附加上去。Step4:HOG特征向量歸一化

我們要對block塊內(nèi)的HOG特征向量進行歸一化。對block塊內(nèi)特征向量的歸一化主要是為了使特征向量空間對光照,陰影和邊緣變化具有魯棒性。還有歸一化是針對每一個block進行的,一般采用的歸一化函數(shù)有以下四種:

在人體檢測系統(tǒng)中進行HOG計算時一般使用L2-norm,Dalal的文章也驗證了對于人體檢測系統(tǒng)使用L2-norm的時候效果最好。Step5HOG最終的特征向量生成

HOG與SIFT的區(qū)別

HOG和SIFT都屬于描述子,以及由于在具體操作上有很多相似的步驟,所以致使很多人誤認為HOG是SIFT的一種,其實兩者在使用目的和具體處理細節(jié)上是有很大的區(qū)別的。HOG與SIFT的主要區(qū)別如下:①SIFT是基于關(guān)鍵點特征向量的描述。②HOG是將圖像均勻的分成相鄰的小塊,然后在所有的小塊內(nèi)統(tǒng)計梯度直方圖。③SIFT需要對圖像尺度空間下對像素求極值點,而HOG中不需要。④SIFT一般有兩大步驟,第一個步驟是對圖像提取特征點,而HOG不會對圖像提取特征點。

HOG的優(yōu)點:HOG表示的是邊緣〔梯度〕的結(jié)構(gòu)特征,因此可以描述局部的形狀信息;位置和方向空間的量化一定程度上可以抑制平移和旋轉(zhuǎn)帶來的影響;采取在局部區(qū)域歸一化直方圖,可以局部抵消光照變化帶來的影響。由于一定程度忽略了光照顏色對圖像造成的影響,使得圖像所需要的表征數(shù)據(jù)的維度降低了。而且由于它這種分塊分單元的處理方法,也使得圖像局部像素點之間的關(guān)系可以很好得到的表征。

HOG的缺點:描述子生成過程冗長,導致速度慢,實時性差;很難處理遮擋問題。由于梯度的性質(zhì),該描述子對噪點相當敏感。

在初步了解HOG理論的根底上,我在網(wǎng)上找到了HOG的matlab代碼,并做了相應(yīng)的注釋,雖然現(xiàn)在還不是很清楚它的原理,不過還是貼出來,供大家學習和參考:[plain]viewplaincopyprint?<spanstyle="font-size:18px;color:#000000;">functionF=hogcalculator1(img,cellpw,cellph,nblockw,nblockh,nthet,overlap,isglobalinterpolate,issigned,normmethod)%IMG:是輸入圖像,CELLPW和CELLPH分別是單元格像素寬度和高度。%NBLOCKW、NBLCOKH:分別是塊中單元格在x和y方向上數(shù)量。%NTHET:是梯度方向直方圖容器的數(shù)目%ISSIGNED:是梯度方向直方圖范圍從無符號的0到pi和有符號是0到2*pi條件??梢酝ㄟ^設(shè)置變量的值ISSIGNED來指定。%OVERLAP:兩個相鄰塊重疊的比例。%ISGLOBALINTERPOLATE:嚴格按照Dalal論文中程序要求來的。%NORMMETHOD:是塊直方圖歸一化方法,設(shè)置為以下字符串:‘none',這意味著非標準化;%

’l1’,這意味著L1標準標準化;%'l2’,這意味著L2標準標準化;%'l1sqrt’,這意味著L1sqrt標準標準化;%'l2hys',這意味著L2-hys-norm標準化。%F:是一個行向量,存儲所有塊的最后的直方圖,從左上角到右下角一個一個掃描圖像的方式,單元格的直方圖以相同的方式存儲在每個塊中。%注意:CELLPW*NBLOCKW和CELLPH*NBLOCKH應(yīng)該分別等于IMG的寬度和高度。%調(diào)用方式1:這里是一個示范,在Dalal的論文中提到所有參數(shù)的設(shè)置最正確值是:當窗口是128*64的大小(128行、64列)%F=hogcalculator(window,8,8,2,2,9,0.5,'localinterpolate','unsigned','l2hys');%調(diào)用方式2:函數(shù)也可以像下面這樣調(diào)用:F=hogcalculator(window);其他參數(shù)的設(shè)置都通過使用上述dalal的提到的最正確值來默認。%——————

設(shè)置默認參數(shù)值。ifnargin<2cellpw=8;cellph=8;nblockw=2;nblockh=2;nthet=9;overlap=0.5;isglobalinterpolate='localinterpolate';issigned='unsigned';normmethod='l2hys';elseifnargin<10error('Inputparametersarenotenough.');endend%

——————檢查參數(shù)的有效性。[M,N,K]=size(img);ifmod(M,cellph*nblockh)~=0error('IMG''sheightshouldbeanintegralmultipleofCELLPH*NBLOCKH.');endifmod(N,cellpw*nblockw)~=0error('IMG''swidthshouldbeanintegralmultipleofCELLPW*NBLOCKW.');endifmod((1-overlap)*cellpw*nblockw,cellpw)~=0||...mod((1-overlap)*cellph*nblockh,cellph)~=0str1='IncorrectOVERLAPorISGLOBALINTERPOLATEparameter';str2=',slidestepshouldbeanintergralmultipleofcellsize';error([str1,str2]);end%設(shè)置高斯空間權(quán)量窗口的標準偏差。delta=cellpw*nblockw*0.5;%計算梯度比例矩陣。hx=[-1,0,1];hy=-hx';gradscalx=imfilter(double(img),hx);gradscaly=imfilter(double(img),hy);ifK>1gradscalx=max(max(gradscalx(:,:,1),gradscalx(:,:,2)),gradscalx(:,:,3));gradscaly=max(max(gradscaly(:,:,1),gradscaly(:,:,2)),gradscaly(:,:,3));endgradscal=sqrt(double(gradscalx.*gradscalx+gradscaly.*gradscaly));%計算梯度方向矩陣。加上較小數(shù)值防止劃分為零。gradscalxplus=gradscalx+ones(size(gradscalx))*0.0001;gradorient=zeros(M,N);%無符號的情況:方向范圍是0到pi。ifstrcmp(issigned,'unsigned')==1gradorient=...atan(gradscaly./gradscalxplus)+pi/2;or=1;else%有符號的情況:方向范圍是0到2*pi。ifstrcmp(issigned,'signed')==1idx=find(gradscalx>=0&gradscaly>=0);gradorient(idx)=atan(gradscaly(idx)./gradscalxplus(idx));idx=find(gradscalx<0);gradorient(idx)=atan(gradscaly(idx)./gradscalxplus(idx))+pi;idx=find(gradscalx>=0&gradscaly<0);gradorient(idx)=atan(gradscaly(idx)./gradscalxplus(idx))+2*pi;or=2;elseerror('IncorrectISSIGNEDparameter.');endend%計算塊滑步。xbstride=cellpw*nblockw*(1-overlap);ybstride=cellph*nblockh*(1-overlap);xbstridend=N-cellpw*nblockw+1;ybstridend=M-cellph*nblockh+1;%計算在窗口檢測到所有塊的數(shù)量,這是ntotalbh*ntotalbw.ntotalbh=((M-cellph*nblockh)/ybstride)+1;ntotalbw=((N-cellpw*nblockw)/xbstride)+1;%generatethematrixhist3dbigforstoringthe3-dimensionshistogram.the%matrixcoversthewholeimageinthe'globalinterpolate'conditionor%coversthelocalblockinthe'localinterpolate'condition.Thematrixis%biggerthantheareawhereitcoversbyaddingadditionalelements%(correspondingtothecells)tothesurroundforcalculationconvenience.ifstrcmp(isglobalinterpolate,'globalinterpolate')==1ncellx=N/cellpw;ncelly=M/cellph;hist3dbig=zeros(ncelly+2,ncellx+2,nthet+2);F=zeros(1,(M/cellph-1)*(N/cellpw-1)*nblockw*nblockh*nthet);glbalinter=1;elseifstrcmp(isglobalinterpolate,'localinterpolate')==1hist3dbig=zeros(nblockh+2,nblockw+2,nthet+2);F=zeros(1,ntotalbh*ntotalbw*nblockw*nblockh*nthet);glbalinter=0;elseerror('IncorrectISGLOBALINTERPOLATEparameter.')endend%生成矩陣來存儲一個塊的直方圖;sF=zeros(1,nblockw*nblockh*nthet);%generategaussianspatialweight.[gaussx,gaussy]=meshgrid(0:(cellpw*nblockw-1),0:(cellph*nblockh-1));weight=exp(-((gaussx-(cellpw*nblockw-1)/2)....*(gaussx-(cellpw*nblockw-1)/2)+(gaussy-(cellph*nblockh-1)/2)....*(gaussy-(cellph*nblockh-1)/2))/(delta*delta));%voteforhistogram.therearetwosituationsaccordingtotheinterpolate%condition('global'interpolateorlocalinterpolate).Thehist3dwhichis%generatedfromthe'bigger'matrixhist3dbigisthefinalhistogram.ifglbalinter==1xbstep=nblockw*cellpw;ybstep=nblockh*cellph;elsexbstep=xbstride;ybstep=ybstride;end%blockslideloopforbtly=1:ybstep:ybstridendforbtlx=1:xbstep:xbstridendforbi=1:(cellph*nblockh)forbj=1:(cellpw*nblockw)i=btly+bi-1;j=btlx+bj-1;gaussweight=weight(bi,bj);gs=gradscal(i,j);go=gradorient(i,j);ifglbalinter==1jorbj=j;iorbi=i;elsejorbj=bj;iorbi=bi;end%calculatebinindexofhist3dbigbinx1=floor((jorbj-1+cellpw/2)/cellpw)+1;biny1=floor((iorbi-1+cellph/2)/cellph)+1;binz1=floor((go+(or*pi/nthet)/2)/(or*pi/nthet))+1;ifgs==0continue;endbinx2=binx1+1;biny2=biny1+1;binz2=binz1+1;x1=(binx1-1.5)*cellpw+0.5;y1=(biny1-1.5)*cellph+0.5;z1=(binz1-1.5)*(or*pi/nthet);%trilinearinterpolation.hist3dbig(biny1,binx1,binz1)=...hist3dbig(biny1,binx1,binz1)+gs*gaussweight...*(1-(jorbj-x1)/cellpw)*(1-(iorbi-y1)/cellph)...*(1-(go-z1)/(or*pi/nthet));hist3dbig(biny1,binx1,binz2)=...hist3dbig(biny1,binx1,binz2)+gs*gaussweight...*(1-(jorbj-x1)/cellpw)*(1-(iorbi-y1)/cellph)...*((go-z1)/(or*pi/nthet));hist3dbig(biny2,binx1,binz1)=...hist3dbig(biny2,binx1,binz1)+gs*gaussweight...*(1-(jorbj-x1)/cellpw)*((iorbi-y1)/cellph)...*(1-(go-z1)/(or*pi/nthet));hist3dbig(biny2,binx1,binz2)=...hist3dbig(biny2,binx1,binz2)+gs*gaussweight...*(1-(jorbj-x1)/cellpw)*((iorbi-y1)/cellph)...*((go-z1)/(or*pi/nthet));hist3dbig(biny1,binx2,binz1)=...hist3dbig(biny1,binx2,binz1)+gs*gaussweight...*((jorbj-x1)/cellpw)*(1-(iorbi-y1)/cellph)...*(1-(go-z1)/(or*pi/nthet));hist3dbig(biny1,binx2,binz2)=...hist3dbig(biny1,binx2,binz2)+gs*gaussweight...*((jorbj-x1)/cellpw)*(1-(iorbi-y1)/cellph)...*((go-z1)/(or*pi/nthet));hist3dbig(biny2,binx2,binz1)=...hist3dbig(biny2,binx2,binz1)+gs*gaussweight...*((jorbj-x1)/cellpw)*((iorbi-y1)/cellph)...*(1-(go-z1)/(or*pi/nthet));hist3dbig(biny2,binx2,binz2)=...hist3dbig(biny2,binx2,binz2)+gs*gaussweight...*((jorbj-x1)/cellpw)*((iorbi-y1)/cellph)...*((go-z1)/(or*pi/nthet));endend%Inthelocalinterpolatecondition.Fisgeneratedinthisblock%slideloop.hist3dbigshouldbeclearedineachloop.ifglbalinter==0ifor==2hist3dbig(:,:,2)=hist3dbig(:,:,2)...+hist3dbig(:,:,nthet+2);hist3dbig(:,:,(nthet+1))=...hist3dbig(:,:,(nthet+1))+hist3dbig(:,:,1);endhist3d=hist3dbig(2:(nblockh+1),2:(nblockw+1),2:(nthet+1));foribin=1:nblockhforjbin=1:nblockwidsF=nthet*((ibin-1)*nblockw+jbin-1)+1;idsF=idsF:(idsF+nthet-1);sF(idsF)=hist3d(ibin,jbin,:);endendiblock=((btly-1)/ybstride)*ntotalbw+...((btlx-1)/xbstride)+1;idF=(iblock-1)*nblockw*nblockh*nthet+1;idF=idF:(idF+nblockw*nblockh*nthet-1);F(idF)=sF;hist3dbig(:,:,:)=0;endendend%Intheglobalinterpolatecondition.Fisgeneratedhereoutsidethe%blockslideloopifglbalinter==1ncellx=N/cellpw;ncelly=M/cellph;ifor==2hist3dbig(:,:,2)=hist3dbig(:,:,2)+hist3dbig(:,:,nthet+2);hist3dbig(:,:,(nthet+1))=hist3dbig(:,:,(nthet+1))+hist3dbig(:,:,1);endhist3d=hist3dbig(2:(ncelly+1),2:(ncellx+1),2:(nthet+1));iblock=1;forbtly=1:ybstride:ybstridendforbtlx=1:xbstride:xbstridendbinidx=floor((btlx-1)/cellpw)+1;binidy=floor((btly-1)/cellph)+1;idF=(iblock-1)*nblockw*nblockh*nthet+1;idF=idF:(idF+nblockw*nblockh*nthet-1);foribin=1:nblockhforjbin=1:nblockwidsF=nthet*((ibin-1)*nblockw+jbin-1)+1;idsF=idsF:(idsF+nthet-1);sF(idsF)=hist3d(binidy+ibin-1,binidx+jbin-1,:);endendF(idF)=sF;iblock=iblock+1;endendend%adjustthenegativevaluecausedbyaccuracyoffloating-point%operations.thesevalue'sscaleisverysmall,usuallyatE-03magnitude%whileotherswillbeE+02orE+03beforenormalization.F(F<0)=0;%塊標準化e=0.001;l2hysthreshold=0.2;fslidestep=nblockw*nblockh*nthet;switchnormmethodcase'none'case'l1'forfi=1:fslidestep:size(F,2)div=sum(F(fi:(fi+fslidestep-1)));F(fi:(fi+fslidestep-1))=F(fi:(fi+fslidestep-1))/(div+e);endcase'l1sqrt'forfi=1:fslidestep:size(F,2)div=sum(F(fi:(fi+fslidestep-1)));F(fi:(fi+fslidestep-1))=sqrt(F(fi:(fi+fslidestep-1))/(div+e));endcase'l2'forfi=1:fslidestep:size(F,2)sF=F(fi:(fi+fslidestep-1)).*F(fi:(fi+fslidestep-1));div=sqrt(sum(sF)+e*e);F(fi:(fi+fslidestep-1))=F(fi:(fi+fslidestep-1))/div;endcase'l2hys'forfi=1:fslidestep:size(F,2)sF=F(fi:(fi+fslidestep-1)).*F(fi:(fi+fslidestep-1));div=sqrt(sum(sF)+e*e);sF=F(fi:(fi+fslidestep-1))/div;sF(sF>l2hysthreshold)=l2hysthreshold;div=sqrt(sum(sF.*sF)+e*e);F(fi:(fi+fslidestep-1))=sF/div;endotherwiseerror('IncorrectNORMMETHODparameter.');end</span>

通過調(diào)用hogcalculator1(x3),其中x3是圖像為,運行后產(chǎn)生臨時變量ans,用ans的值進行plot〔ans〕操作,最終圖像。程序的完整性和正確性還有待進一步研究。方向梯度直方圖〔HOG,HistogramofGradient〕根底知識梯度〔gradient〕:〔含代碼〕在向量微積分中,標量場的梯度是一個向量場,標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是最大的變化率。圖像處理之圖像梯度效果根本思想:利用X方向與Y方向分別實現(xiàn)一階微分,求取振幅,實現(xiàn)圖像梯度效果。關(guān)于如何計算圖像一階微分參見這里:使用的兩種微分算子分別為Prewitt與Sobel,其中Soble在X,Y兩個方向算子分別為:Prewitt在X,Y方向上梯度算子分別為:二:程序思路及實現(xiàn)梯度濾鏡提供了兩個參數(shù):–方向,用來要決定圖像完成X方向梯度計算,Y方向梯度計算,或者是振幅計算–算子類型,用來決定是使用sobel算子或者是prewitt算子。計算振幅的公式可以參見以前《圖像處理之一階微分應(yīng)用》的文章一階微分:〔含代碼〕對于離散的圖像來說,一階微分的數(shù)學表達相當于兩個相鄰像素的差值,根據(jù)選擇的梯度算子不同,效果可能有所不同,但是根本原理不會變化。最常見的算子為Roberts算子,其它常見還有Sobel,Prewitt等算子。圖像處理之一階微分應(yīng)用一:數(shù)學背景首先看一下一維的微分公式Δf=f(x+1)–f(x),對于一幅二維的數(shù)字圖像f(x,y)而言,需要完成XY兩個方向上的微分,所以有如下的公式:分別對X,Y兩個方向上求出它們的偏微分,最終得到梯度DeltaF.對于離散的圖像來說,一階微分的數(shù)學表達相當于兩個相鄰像素的差值,根據(jù)選擇的梯度算子不同,效果可能有所不同,但是根本原理不會變化。最常見的算子為Roberts算子,其它常見還有Sobel,Prewitt等算子。以Roberts算子為例的X,Y的梯度計算演示如以下圖:二:圖像微分應(yīng)用圖像微分(梯度計算)是圖像邊緣提取的重要的中間步驟,根據(jù)X,Y方向的梯度向量值,可以得到如下兩個重要參數(shù)振幅magnitude,角度theta,計算公式如下:Theta=tan-1(yGradient/xGradient)magnitude表示邊緣強度信息theta預言邊緣的方向走勢。假設(shè)對一幅數(shù)字圖像,求出magnitude之后與原來每個像素點對應(yīng)值相加,那么圖像邊緣將被大大加強,輪廓更加明顯,是一個很典型的sharpfilter的效果。Robert算子:Roberts邊緣檢測算子是一種利用局部差分算子尋找邊緣的算子,Robert算子圖像處理后結(jié)果邊緣不是很平滑。經(jīng)分析,由于Robert算子通常會在圖像邊緣附近的區(qū)域內(nèi)產(chǎn)生較寬的響應(yīng),故采用上述算子檢測的邊緣圖像常需做細化處理,邊緣定位的精度不是很高。Roberts邊緣檢測算子是一種利用局部差分算子尋找邊緣的算子,Robert算子圖像處理后結(jié)果邊緣不是很平滑。經(jīng)分析,由于Robert算子通常會在圖像邊緣附近的區(qū)域內(nèi)產(chǎn)生較寬的響應(yīng),故采用上述算子檢測的邊緣圖像常需做細化處理,邊緣定位的精度不是很高。.NET代碼如下:privatevoidmenuItem23_Click(objectsender,System.EventArgse){if(this.pictureBox1.Image!=null){this.pictureBox2.Visible=true;intheight=this.pictureBox1.Image.Height;intwidth=this.pictureBox1.Image.Width;Bitmaptemp=newBitmap(width,height);Bitmapprocess=(Bitmap)this.pictureBox1.Image;inti,j,p0,p1,p2,p3;Color[]pixel=newColor[4];intresult;for(j=height-2;j>0;j--){for(i=0;i<width-2;i++){pixel[0]=process.GetPixel(i,j);pixel[1]=process.GetPixel(i,j+1);pixel[2]=process.GetPixel(i+1,j);pixel[3]=process.GetPixel(i+1,j+1);p0=(int)(0.3*pixel[0].R+0.59*pixel[0].G+0.11*pixel[0].B);p1=(int)(0.3*pixel[1].R+0.59*pixel[1].G+0.11*pixel[1].B);p2=(int)(0.3*pixel[2].R+0.59*pixel[2].G+0.11*pixel[2].B);p3=(int)(0.3*pixel[3].R+0.59*pixel[3].G+0.11*pixel[3].B);result=(int)Math.Sqrt((p0-p3)*(p0-p3)+(p1-p2)*(p1-p2));if(result>255)result=255;if(result<0)result=0;temp.SetPixel(i,j,Color.FromArgb(result,result,result));}}this.pictureBox2.Image=temp;}}Sobel算子:索貝爾算子〔Sobeloperator〕是圖像處理中的算子之一,主要用作邊緣檢測。在技術(shù)上,它是一離散性差分算子,用來運算圖像亮度函數(shù)的梯度之近似值。在圖像的任何一點使用此算子,將會產(chǎn)生對應(yīng)的梯度矢量或是其法矢量。該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經(jīng)縱向向及橫向邊緣檢測的圖像,其公式如下:圖像的每一個像素的橫向及縱向梯度近似值可用以下的公式結(jié)合,來計算梯度的大小。然后可用以下公式計算梯度方向。在以上例子中,如果以上的角度Θ等于零,即代表圖像該處擁有縱向邊緣,左方較右方暗。算子描述編輯在邊緣檢測中,常用的一種模板是Sobel算子。Sobel算子有兩個,一個是檢測水平邊緣的;另一個是檢測垂直邊緣的。與Prewitt算子相比,Sobel算子對于象素的位置的影響做了加權(quán),可以降低邊緣模糊程度,因此效果更好。Sobel算子另一種形式是各向同性Sobel(IsotropicSobel)算子,也有兩個,一個是檢測水平邊緣的,另一個是檢測垂直邊緣的。各向同性Sobel算子和普通Sobel算子相比,它的位置加權(quán)系數(shù)更為準確,在檢測不同方向的邊沿時梯度的幅度一致。將Sobel算子矩陣中的所有2改為根號2,就能得到各向同性Sobel的矩陣。由于Sobel算子是濾波算子的形式,用于提取邊緣,可以利用快速卷積函數(shù),簡單有效,因此應(yīng)用廣泛。美中缺乏的是,Sobel算子并沒有將圖像的主體與背景嚴格地區(qū)分開來,換言之就是Sobel算子沒有基于圖像灰度進行處理,由于Sobel算子沒有嚴格地模擬人的視覺生理特征,所以提取的圖像輪廓有時并不能令人滿意。在觀測一幅圖像的時候,我們往往首先注意的是圖像與背景不同的局部,正是這個局部將主體突出顯示,基于該理論,我們給出了下面閾值化輪廓提取算法,該算法已在數(shù)學上證明當像素點滿足正態(tài)分布時所求解是最優(yōu)的。[1]C代碼1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/*

Sobel

templatea00

a01

a02a10

a11

a12a20

a21

a22*/unsigned

char

a00,

a01,

a02;unsigned

char

a10,

a11,

a12;unsigned

char

a20,

a21,

a22;void

MySobel(IplImage*

gray,

IplImage*

gradient){CvScalar

color

;for

(int

i=1;

i<gray->height-1;

++i){for

(int

j=1;

j<gray->width-1;

++j){a00

=

cvGet2D(gray,

i-1,

j-1).val[0];a01

=

cvGet2D(gray,

i-1,

j).val[0];a02

=

cvGet2D(gray,

i-1,

j+1).val[0];a10

=

cvGet2D(gray,

i,

j-1).val[0];a11

=

cvGet2D(gray,

i,

j).val[0];a12

=

cvGet2D(gray,

i,

j+1).val[0];a20

=

cvGet2D(gray,

i+1,

j-1).val[0];a21

=

cvGet2D(gray,

i+1,

j).val[0];a22

=

cvGet2D(gray,

i+1,

j+1).val[0];//

x方向上的近似導數(shù)double

ux

=

a20

*

(1)

+

a21

*

(2)

+

a22

*

(1)+

(a00

*

(-1)

+

a01

*

(-2)

+

a02

*

(-1));//

y方向上的近似導數(shù)double

uy

=

a02

*

(1)

+

a12

*

(2)

+

a22

*

(1)+

a00

*

(-1)

+

a10

*

(-2)

+

a20

*

(-1);color.val[0]

=

sqrt(ux*ux

+

uy*uy);cvSet2D(gradient,

i,

j,

color);}}}//注釋:該程序需要在安裝Opencv軟件下運行。Matlabps=imread('D:\14.jpg');

%讀取圖像subplot(1,3,1)imshow(ps);title('原圖像');ps=rgb2gray(ps);[m,n]=size(ps);

%用Sobel微分算子進行邊緣檢測pa

=

edge(ps,'sobel');subplot(1,3,2);imshow(pa);title('Sobel邊緣檢測得到的圖像');Prewitt算子:Prewitt算子是一種一階微分算子的邊緣檢測,利用像素點上下、左右鄰點的灰度差,在邊緣處到達極值檢測邊緣,去掉局部偽邊緣,對噪聲具有平滑作用。其原理是在圖像空間利用兩個方向模板與圖像進行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣。經(jīng)典Prewitt算子認為:凡灰度新值大于或等于閾值的像素點都是邊緣點。即選擇適當?shù)拈撝礣,假設(shè)P(i,j)≥T,那么(i,j)為邊緣點,P(i,j)為邊緣圖像。這種判定是欠合理的,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大,而且對于幅值較小的邊緣點,其邊緣反而喪失了。Prewitt算子是一種一階微分算子的邊緣檢測,利用像素點上下、左右鄰點的灰度差,在邊緣處到達極值檢測邊緣,去掉局部偽邊緣,對噪聲具有平滑作用。其原理是在圖像空間利用兩個方向模板與圖像進行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣。對數(shù)字圖像f(x,y),Prewitt算子的定義如下:G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]|G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]|那么P(i,j)=max[G(i),G(j)]或P(i,j)=G(i)+G(j)經(jīng)典Prewitt算子認為:凡灰度新值大于或等于閾值的像素點都是邊緣點。即選擇適當?shù)拈撝礣,假設(shè)P(i,j)≥T,那么(i,j)為邊緣點,P(i,j)為邊緣圖像。這種判定是欠合理的,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大,而且對于幅值較小的邊緣點,其邊緣反而喪失了。圖像邊緣檢測:物體的邊緣是以圖像局部特性的不連續(xù)性的形式出現(xiàn)的,例如,灰度值的突變,顏色的突變,紋理結(jié)構(gòu)的突變等。從本質(zhì)上說,邊緣就意味著一個區(qū)域的終結(jié)和另外一個區(qū)域的開始。圖像邊緣信息在圖像分析和人的視覺中十分重要,是圖像識別中提取圖像特征的一個重要屬性。圖像的邊緣有方向和幅度兩個特性。通常,沿邊緣走向的像素變化平緩,而垂直于邊緣走向的像素變化劇烈。這種變化可能呈現(xiàn)階躍型、房頂型和凸緣型。這些變化分別對應(yīng)景物中不同的物理狀態(tài)。例如,階躍型變化常常對應(yīng)目標的深度或者是反射邊界,而后兩者那么常常反映外表法線方向的不連續(xù)。實際要分析的圖像往往是比擬復雜的,灰度變化不一定是上述的標準形式。例如;灰度的變化不是突變而是在一個空間范圍內(nèi)的漸變。而且,在實際工程中獲得的圖像難免要混有噪聲。圖像處理Sobel,Roberts,prewitt,log,canny算子檢測比照matlab邊緣檢測代碼〔包含roberts,sobel,prewitt三種算子〕邊緣檢測類(包括Roberts,Sobel,Prewitt,Kirsch等算子的邊緣檢測算法)振幅〔Magnitude〕,角度〔Theta〕:振幅〔Magnitude〕表示邊緣強度信息。角度〔Theta〕預言邊緣的方向走勢。Theta=tan-1(yGradient/xGradient)假設(shè)對一幅數(shù)字圖像,求出magnitude之后與原來每個像素點對應(yīng)值相加,那么圖像邊緣將被大大加強,輪廓更加明顯,是一個很典型的sharpfilter的效果。方向梯度直方圖〔HOG,HistogramofGradient〕學習筆記二HOG正篇(2012-09-2613:39:33)轉(zhuǎn)載▼標簽:

雜談分類:

圖像處理1.介紹HOG〔HistogramofOrientedGradient〕是2005年CVPR會議上,法國國家計算機科學及自動控制研究所的Dalal等人提出的一種解決人體目標檢測的圖像描述子,該方法使用梯度方向直方圖〔HistogramofOrientedGradients,簡稱HOG〕特征來表達人體,提取人體的外形信息和運動信息,形成豐富的特征集。2.生成過程\t"://blog.sina/s/_blank"1〕圖像歸一化歸一化圖像的主要目的是提高檢測器對光照的魯棒性,因為實際的人體目標可能出現(xiàn)的各種不同的場合,檢測器,必須對光照不太敏感才會有好的效果。2)利用一階微分計算圖像梯度圖像平滑對于灰度圖像,一般為了去除噪點,所以會先利用離散高斯平滑模板進行平滑:高斯函數(shù)在不同平滑的尺度下進行對灰度圖像進行平滑操作,Dalal等實驗說明在下,人體檢測效果最正確〔即不做高斯平滑〕,使得錯誤率縮小了約一倍。不做平滑操作,可能原因:圖像時基于邊緣的,平滑會降低邊緣信息的比照度,從而減少圖像中的信號信息。梯度法求圖像梯度一階微分處理一般對灰度階梯有較強的響應(yīng)一階微分:\t"://blog.sina/s/_blank"對于函數(shù)f(x,y),在其坐標〔x,y〕上的梯度是通過如下二維列向量定義的:這個向量的模值由下式給出:\t"://blog.sina/s/_blank"\t"://blog.sina/s/_blank"因為模值的計算開銷比擬大,一般可以按如下公式近似求解:\t"://blog.sina/s/_blank"Dalal等人利用許多一階微分模板進行求梯度近似值,但在實驗中說明模板[-1,0,1]效果最好。采用模板[-1,0,1]為例計算圖像梯度以及方向,通過梯度模板計算水平和垂直方向的梯度分別如下:\t"://blog.sina/s/_blank"

其中,分別表示該像素點的水平,垂直梯度值。計算該像素點的梯度值〔梯度強度〕以及梯度方向:\t"://blog.sina/s/_blank"對于梯度方向的范圍限定,一般采用無符號的范圍,故梯度方向可表示為:\t"://blog.sina/s/_blank"3)基于梯度幅值的方向權(quán)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論