梯度方向直方图HOG_第1页
梯度方向直方图HOG_第2页
梯度方向直方图HOG_第3页
梯度方向直方图HOG_第4页
梯度方向直方图HOG_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图像梯度方向直方图学习

HOG〔HistogramofOrientedGradient〕是2005年CVPR会议上,法国国家计算机科学及自动控制研究所的Dalal等人提出的一种解决人体目标检测的图像描述子,该方法使用梯度方向直方图〔HistogramofOrientedGradients,简称HOG〕特征来表达人体,提取人体的外形信息和运动信息,形成丰富的特征集。

HOG描述子高维图像特征向量生成步骤:1.图像归一化;

2.利用一阶微分计算图像梯度;3.基于梯度幅值的方向权重投影;4.HOG特征向量归一化;

5.得出HOG最终的特征向量step1:图像归一化

归一化图像的主要目的是提高检测器对光照的鲁棒性,因为实际的人体目标可能出现的各种不同的场合,检测器,必须对光照不太敏感才会有好的效果。Step2利用一阶微分计算图像梯度1、图像平滑

对于灰度图像,一般为了去除噪点,所以会先利用离散高斯平滑模板进行平滑:高斯函数在不同平滑的尺度下进行对灰度图像进行平滑操作,Dalal等实验说明在下,人体检测效果最正确〔即不做高斯平滑〕,使得错误率缩小了约一倍。不做平滑操作,可能原因:图像时基于边缘的,平滑会降低边缘信息的比照度,从而减少图像中的信号信息。2、梯度法求图像梯度Step3基于梯度幅值的方向权重投影

HOG结构:

通常使用的HOG结构大致有三种:矩形HOG〔简称为R-HOG〕,圆形HOG和中心环绕HOG。它们的单位都是Block〔即块〕。Dalal的试验证明矩形HOG和圆形HOG的检测效果根本一致,而环绕形HOG效果相对差一些。并且,圆形与环绕形的HOG文献比拟少,应用研究没有矩形HOG普遍。所以,着重讲解矩形HOG的情况。矩形HOG块的划分:一般一个块〔Block〕都由假设干单元〔Cell〕组成,一个单元都有如干个像素点组成。

在每个Cell中有独立做梯度方向统计,从而以梯度方向为横轴的的直方图,梯度方向可取0度到180度或0度~360度,但dalal实验说明,对于人体目标检测0度~180度这种忽略度数正负级的方向范围能够取得更好的结果。然后又将这个梯度分布平均分成个方向角度〔orientationbins〕,每个方向角度范围都会对应一个直方柱。根据Dalal等人实验,在人体目标检测中,在无符号方向角度范围并将其平均分成9份〔bins〕能取得最好的效果,当bin的数目继续增大效果改变不明显,故一般在人体目标检测中使用bin数目为9范围0~180度的度量方式。

对梯度方向的投影权重方式的选取:对于梯度方向的加权投影,一般都采用一个权重投影函数,它可以是像素点的梯度幅值,梯度幅值的平方根或梯度幅值的平方,甚至可以使梯度幅值的省略形式,它们都能够一定程度上反响出像素上一定的边缘信息。根据Dalal等人论文的测试结果,采用梯度幅值量级本身得到的检测效果最正确,使用量级的平方根会轻微降低检测结果,而使用二值的边缘权值表示会严重降低效果〔约为5%个单位10-4FPPW〔FalsePositivesPerWindow〕〕。

问:块与块之间是相互独立的么?答:通常的将某个变量范围固定划分为几个区域,由于边界变量与相邻区域也有相关性,所以变量只对一个区域进行投影而对相邻区域完全无关时会对其他区域产生混叠效应。

分块之间的相关性问题的解决:方案一:块重叠,重复统计计算。

方案二:线性插值权重分配

重叠块:Datal等人在他们那篇关于HOG最为经典的论文《HistogramofOrientedGradientforHumanDetection》提出了利用块与块的重叠〔Overlap〕来解决混叠,并且取得了不错的效果。在重叠方式中,块与块之间的边缘点被重复根据权重投影到各自相邻块〔block〕中,从而一定模糊了块与块之间的边界,处于块边缘局部的像素点也能够给相邻块中的方向梯度直方图提供一定奉献,从而到达关联块与块之间的关系的作用。Datal对于块和块之间相互重叠程度对人体目标检测识别率影响也做了实验分析。

利用线性插值的方法解决分块之间联系问题:有些文献采用的不是块与块重叠的方法,而是采用线性插值的方法来削弱混叠效应。这种方法的主要思想是每个Block都对临近的Block都有影响,这种影响,我们可以以一种加权方式附加上去。Step4:HOG特征向量归一化

我们要对block块内的HOG特征向量进行归一化。对block块内特征向量的归一化主要是为了使特征向量空间对光照,阴影和边缘变化具有鲁棒性。还有归一化是针对每一个block进行的,一般采用的归一化函数有以下四种:

在人体检测系统中进行HOG计算时一般使用L2-norm,Dalal的文章也验证了对于人体检测系统使用L2-norm的时候效果最好。Step5HOG最终的特征向量生成

HOG与SIFT的区别

HOG和SIFT都属于描述子,以及由于在具体操作上有很多相似的步骤,所以致使很多人误认为HOG是SIFT的一种,其实两者在使用目的和具体处理细节上是有很大的区别的。HOG与SIFT的主要区别如下:①SIFT是基于关键点特征向量的描述。②HOG是将图像均匀的分成相邻的小块,然后在所有的小块内统计梯度直方图。③SIFT需要对图像尺度空间下对像素求极值点,而HOG中不需要。④SIFT一般有两大步骤,第一个步骤是对图像提取特征点,而HOG不会对图像提取特征点。

HOG的优点:HOG表示的是边缘〔梯度〕的结构特征,因此可以描述局部的形状信息;位置和方向空间的量化一定程度上可以抑制平移和旋转带来的影响;采取在局部区域归一化直方图,可以局部抵消光照变化带来的影响。由于一定程度忽略了光照颜色对图像造成的影响,使得图像所需要的表征数据的维度降低了。而且由于它这种分块分单元的处理方法,也使得图像局部像素点之间的关系可以很好得到的表征。

HOG的缺点:描述子生成过程冗长,导致速度慢,实时性差;很难处理遮挡问题。由于梯度的性质,该描述子对噪点相当敏感。

在初步了解HOG理论的根底上,我在网上找到了HOG的matlab代码,并做了相应的注释,虽然现在还不是很清楚它的原理,不过还是贴出来,供大家学习和参考:[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方向上数量。%NTHET:是梯度方向直方图容器的数目%ISSIGNED:是梯度方向直方图范围从无符号的0到pi和有符号是0到2*pi条件。可以通过设置变量的值ISSIGNED来指定。%OVERLAP:两个相邻块重叠的比例。%ISGLOBALINTERPOLATE:严格按照Dalal论文中程序要求来的。%NORMMETHOD:是块直方图归一化方法,设置为以下字符串:‘none',这意味着非标准化;%

’l1’,这意味着L1标准标准化;%'l2’,这意味着L2标准标准化;%'l1sqrt’,这意味着L1sqrt标准标准化;%'l2hys',这意味着L2-hys-norm标准化。%F:是一个行向量,存储所有块的最后的直方图,从左上角到右下角一个一个扫描图像的方式,单元格的直方图以相同的方式存储在每个块中。%注意:CELLPW*NBLOCKW和CELLPH*NBLOCKH应该分别等于IMG的宽度和高度。%调用方式1:这里是一个示范,在Dalal的论文中提到所有参数的设置最正确值是:当窗口是128*64的大小(128行、64列)%F=hogcalculator(window,8,8,2,2,9,0.5,'localinterpolate','unsigned','l2hys');%调用方式2:函数也可以像下面这样调用:F=hogcalculator(window);其他参数的设置都通过使用上述dalal的提到的最正确值来默认。%——————

设置默认参数值。ifnargin<2cellpw=8;cellph=8;nblockw=2;nblockh=2;nthet=9;overlap=0.5;isglobalinterpolate='localinterpolate';issigned='unsigned';normmethod='l2hys';elseifnargin<10error('Inputparametersarenotenough.');endend%

——————检查参数的有效性。[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%设置高斯空间权量窗口的标准偏差。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));%计算梯度方向矩阵。加上较小数值防止划分为零。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;%计算在窗口检测到所有块的数量,这是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>

通过调用hogcalculator1(x3),其中x3是图像为,运行后产生临时变量ans,用ans的值进行plot〔ans〕操作,最终图像。程序的完整性和正确性还有待进一步研究。方向梯度直方图〔HOG,HistogramofGradient〕根底知识梯度〔gradient〕:〔含代码〕在向量微积分中,标量场的梯度是一个向量场,标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是最大的变化率。图像处理之图像梯度效果根本思想:利用X方向与Y方向分别实现一阶微分,求取振幅,实现图像梯度效果。关于如何计算图像一阶微分参见这里:使用的两种微分算子分别为Prewitt与Sobel,其中Soble在X,Y两个方向算子分别为:Prewitt在X,Y方向上梯度算子分别为:二:程序思路及实现梯度滤镜提供了两个参数:–方向,用来要决定图像完成X方向梯度计算,Y方向梯度计算,或者是振幅计算–算子类型,用来决定是使用sobel算子或者是prewitt算子。计算振幅的公式可以参见以前《图像处理之一阶微分应用》的文章一阶微分:〔含代码〕对于离散的图像来说,一阶微分的数学表达相当于两个相邻像素的差值,根据选择的梯度算子不同,效果可能有所不同,但是根本原理不会变化。最常见的算子为Roberts算子,其它常见还有Sobel,Prewitt等算子。图像处理之一阶微分应用一:数学背景首先看一下一维的微分公式Δf=f(x+1)–f(x),对于一幅二维的数字图像f(x,y)而言,需要完成XY两个方向上的微分,所以有如下的公式:分别对X,Y两个方向上求出它们的偏微分,最终得到梯度DeltaF.对于离散的图像来说,一阶微分的数学表达相当于两个相邻像素的差值,根据选择的梯度算子不同,效果可能有所不同,但是根本原理不会变化。最常见的算子为Roberts算子,其它常见还有Sobel,Prewitt等算子。以Roberts算子为例的X,Y的梯度计算演示如以下图:二:图像微分应用图像微分(梯度计算)是图像边缘提取的重要的中间步骤,根据X,Y方向的梯度向量值,可以得到如下两个重要参数振幅magnitude,角度theta,计算公式如下:Theta=tan-1(yGradient/xGradient)magnitude表示边缘强度信息theta预言边缘的方向走势。假设对一幅数字图像,求出magnitude之后与原来每个像素点对应值相加,那么图像边缘将被大大加强,轮廓更加明显,是一个很典型的sharpfilter的效果。Robert算子:Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。.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〕是图像处理中的算子之一,主要用作边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经纵向向及横向边缘检测的图像,其公式如下:图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。然后可用以下公式计算梯度方向。在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。算子描述编辑在边缘检测中,常用的一种模板是Sobel算子。Sobel算子有两个,一个是检测水平边缘的;另一个是检测垂直边缘的。与Prewitt算子相比,Sobel算子对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。Sobel算子另一种形式是各向同性Sobel(IsotropicSobel)算子,也有两个,一个是检测水平边缘的,另一个是检测垂直边缘的。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。将Sobel算子矩阵中的所有2改为根号2,就能得到各向同性Sobel的矩阵。由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中缺乏的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的局部,正是这个局部将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。[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方向上的近似导数double

ux

=

a20

*

(1)

+

a21

*

(2)

+

a22

*

(1)+

(a00

*

(-1)

+

a01

*

(-2)

+

a02

*

(-1));//

y方向上的近似导数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算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处到达极值检测边缘,去掉局部伪边缘,对噪声具有平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,假设P(i,j)≥T,那么(i,j)为边缘点,P(i,j)为边缘图像。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丧失了。Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处到达极值检测边缘,去掉局部伪边缘,对噪声具有平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。对数字图像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)经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,假设P(i,j)≥T,那么(i,j)为边缘点,P(i,j)为边缘图像。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丧失了。图像边缘检测:物体的边缘是以图像局部特性的不连续性的形式出现的,例如,灰度值的突变,颜色的突变,纹理结构的突变等。从本质上说,边缘就意味着一个区域的终结和另外一个区域的开始。图像边缘信息在图像分析和人的视觉中十分重要,是图像识别中提取图像特征的一个重要属性。图像的边缘有方向和幅度两个特性。通常,沿边缘走向的像素变化平缓,而垂直于边缘走向的像素变化剧烈。这种变化可能呈现阶跃型、房顶型和凸缘型。这些变化分别对应景物中不同的物理状态。例如,阶跃型变化常常对应目标的深度或者是反射边界,而后两者那么常常反映外表法线方向的不连续。实际要分析的图像往往是比拟复杂的,灰度变化不一定是上述的标准形式。例如;灰度的变化不是突变而是在一个空间范围内的渐变。而且,在实际工程中获得的图像难免要混有噪声。图像处理Sobel,Roberts,prewitt,log,canny算子检测比照matlab边缘检测代码〔包含roberts,sobel,prewitt三种算子〕边缘检测类(包括Roberts,Sobel,Prewitt,Kirsch等算子的边缘检测算法)振幅〔Magnitude〕,角度〔Theta〕:振幅〔Magnitude〕表示边缘强度信息。角度〔Theta〕预言边缘的方向走势。Theta=tan-1(yGradient/xGradient)假设对一幅数字图像,求出magnitude之后与原来每个像素点对应值相加,那么图像边缘将被大大加强,轮廓更加明显,是一个很典型的sharpfilter的效果。方向梯度直方图〔HOG,HistogramofGradient〕学习笔记二HOG正篇(2012-09-2613:39:33)转载▼标签:

杂谈分类:

图像处理1.介绍HOG〔HistogramofOrientedGradient〕是2005年CVPR会议上,法国国家计算机科学及自动控制研究所的Dalal等人提出的一种解决人体目标检测的图像描述子,该方法使用梯度方向直方图〔HistogramofOrientedGradients,简称HOG〕特征来表达人体,提取人体的外形信息和运动信息,形成丰富的特征集。2.生成过程\t"://blog.sina/s/_blank"1〕图像归一化归一化图像的主要目的是提高检测器对光照的鲁棒性,因为实际的人体目标可能出现的各种不同的场合,检测器,必须对光照不太敏感才会有好的效果。2)利用一阶微分计算图像梯度图像平滑对于灰度图像,一般为了去除噪点,所以会先利用离散高斯平滑模板进行平滑:高斯函数在不同平滑的尺度下进行对灰度图像进行平滑操作,Dalal等实验说明在下,人体检测效果最正确〔即不做高斯平滑〕,使得错误率缩小了约一倍。不做平滑操作,可能原因:图像时基于边缘的,平滑会降低边缘信息的比照度,从而减少图像中的信号信息。梯度法求图像梯度一阶微分处理一般对灰度阶梯有较强的响应一阶微分:\t"://blog.sina/s/_blank"对于函数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)基于梯度幅值的方向权

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论