基于meanshift算法的图像处理Word文档下载推荐.docx
《基于meanshift算法的图像处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于meanshift算法的图像处理Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
{
inti,j,opti,optj;
SINT16scale[3]={-3,3,0};
FLOAT32dist,optdist;
SINT16h,w,optX,optY;
//tryno-scaling
FindNextFixScale(frame);
//找出目标的下一个大致范围
optdist=LastDist;
optX=m_sTrackingObjectTable[m_cActiveObject].X;
optY=m_sTrackingObjectTable[m_cActiveObject].Y;
//tryoneofthe9possiblescaling
i=rand()*2/RAND_MAX;
j=rand()*2/RAND_MAX;
h=m_sTrackingObjectTable[m_cActiveObject].H;
w=m_sTrackingObjectTable[m_cActiveObject].W;
if(h+scale[i]>
10&
&
w+scale[j]>
h+scale[i]<
m_nImageHeight/2&
w+scale[j]<
m_nImageWidth/2)
m_sTrackingObjectTable[m_cActiveObject].H=h+scale[i];
m_sTrackingObjectTable[m_cActiveObject].W=w+scale[j];
FindNextFixScale(frame);
if((dist=LastDist)<
optdist)//scalingisbetter
optdist=dist;
//printf("
Next%f->
\n"
dist);
else//noscalingisbetter
m_sTrackingObjectTable[m_cActiveObject].X=optX;
m_sTrackingObjectTable[m_cActiveObject].Y=optY;
m_sTrackingObjectTable[m_cActiveObject].H=h;
m_sTrackingObjectTable[m_cActiveObject].W=w;
};
TotalDist+=optdist;
//thelatestdistance
);
这里仍然在跟踪的基础上讲解meanshift。
首先还是把meanshift的原理用数学公式说一下吧。
1、目标模型,算法采用的是特征值的加权概率分布来描述目标模型。
这应该是模式识别中主要描述目标的模型,不同于自动控制理论中采用的状态方程。
目标模型共m个特征值(可以理解为像素灰度值)
其中X0是窗口中心点向量值(可能为RBG向量或者灰度值),Xi是窗口内第i点向量值。
C为归一化常数,保障q1+q2+q3+……qm=1,H为核函数的带宽向量。
M为特征值的个数,对应于图像处理可以理解为灰度等级划分的个数,从而特征值u为对应的灰度等级。
d函数为脉冲函数,保证只有具有u特征值的像素才对概率分布作出贡献。
从而k函数可以理解为u灰度值的一个加权频数。
2、匹配对象,也采用特征值加权概率分布
其中,Y为匹配对象的中心,Xi是匹配窗口内第i点向量值,Hh为匹配窗口的核函数带宽向量。
Ch为匹配窗口特征向量的归一化常数。
3、匹配对象与目标模型的相似程度,相似函数可采用Bhattacharyya函数
4、匹配过程就是寻找相似函数最大值的寻优过程,Mean-Shift采用的是梯度下降法。
首先将(Y)在
(Y0)附近进行泰勒级数展开,取前两项。
即:
要使得(Y)向最大值迭代,只要Y的搜索方向与梯度方向一致即可,通过求导可得到Y0的梯度方向为:
为权值。
因此如果如下确定Y1,那么Y1-Y0将与梯度方向一致。
以上为meanshift的数学原理。
有关文字的叙述已经在上一篇中提到了。
用meanshift来跟踪属于确定性算法,粒子滤波器属于统计学方法。
meanshift跟踪算法相对于粒子滤波器来说可能实时性更好一些,但是跟踪的准确性在理论上还是略逊于粒子滤波器的。
meanshift跟踪的的实质就是通过对应的模板来确定目标的下一个位置。
通过迭代找到新的中心点(即是目标的新的位置点)。
有关跟踪的code如下所示:
/**********************************************************************
BilkentUniversity:
Mean-shiftTrackerbasedMovingObjectTrackerinVideo
Version:
1.0
Compiler:
MicrosoftVisualC++6.0(testedinbothdebugandrelease
mode)
ModifiedbyMrZhou
**********************************************************************/
#include"
ObjectTracker.h"
utils.h"
#include<
math.h>
stdio.h>
stdlib.h>
/*
#defineGetRValue(rgb)((UBYTE8)(rgb))
#defineGetGValue(rgb)((UBYTE8)(((ULONG_32)(rgb))>
>
8))
#defineGetBValue(rgb)((UBYTE8)((rgb)>
16))
*/
//#defineRGB(r,g,b)((ULONG_32)(((UBYTE8)(r)|((UBYTE8)(g)<
<
8))|(((ULONG_32)(UBYTE8)(b))<
16)))
#definemin(a,b)(((a)<
(b))?
(a):
(b))
#definemax(a,b)(((a)>
(b))
#defineMEANSHIFT_ITARATION_NO5
#defineDISTANCE_ITARATION_NO1
#defineALPHA1
#defineEDGE_DETECT_TRESHOLD32
//////////////////////////////////////////////////
1给定目标的初始位置和尺寸,计算目标在图像中的直方图;
2输入新图像,迭代直到收敛:
计算图像上对应区域的新直方图;
新直方图与目标直方图比较,计算权重;
根据权重,计算图像上对应区域的形心/质心;
根据形心,修正目标位置;
直方图分为两部分,每部分大小4096,
RGB的256*256*256种组合,缩减为16*16*16=4096种组合.
如果目标区域的点是边缘点,则计入直方图的后一部分,
否则计入直方图的前一部分.
CObjectTracker:
CObjectTracker(INT32imW,INT32imH,IMAGE_TYPEeImageType)
m_nImageWidth=imW;
m_nImageHeight=imH;
m_eIMAGE_TYPE=eImageType;
m_cSkipValue=0;
for(UBYTE8i=0;
i<
MAX_OBJECT_TRACK_NUMBER;
i++)//初始化各个目标
m_sTrackingObjectTable[i].Status=false;
for(SINT16j=0;
j<
HISTOGRAM_LENGTH;
j++)
m_sTrackingObjectTable[i].initHistogram[j]=0;
m_nFrameCtr=0;
m_uTotalTime=0;
m_nMaxEstimationTime=0;
m_cActiveObject=0;
TotalDist=0.0;
LastDist=0.0;
switch(eImageType)
caseMD_RGBA:
m_cSkipValue=4;
break;
caseMD_RGB:
m_cSkipValue=3;
break;
~CObjectTracker()
//returnspixelvaluesinformat|0|B|G|R|wrtto(x.y)
ULONG_32CObjectTracker:
GetPixelValues(UBYTE8*frame,SINT16x,SINT16y)
ULONG_32pixelValues=0;
pixelValues=*(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)|//0BGR
*(frame+(y*m_nImageWidth+x)*m_cSkipValue+1)<
8|
*(frame+(y*m_nImageWidth+x)*m_cSkipValue)<
16;
return(pixelValues);
}*/
//setRGBcomponentswrtto(x.y)
SetPixelValues(IplImage*r,IplImage*g,IplImage*b,ULONG_32pixelValues,SINT16x,SINT16y)
//*(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)=UBYTE8(pixelValues&
0xFF);
//*(frame+(y*m_nImageWidth+x)*m_cSkipValue+1)=UBYTE8((pixelValues>
8)&
//*(frame+(y*m_nImageWidth+x)*m_cSkipValue)=UBYTE8((pixelValues>
16)&
//setpix32f
setpix8c(r,y,x,UBYTE8(pixelValues&
0xFF));
setpix8c(g,y,x,UBYTE8((pixelValues>
setpix8c(b,y,x,UBYTE8((pixelValues>
//returnsboxcolor
GetBoxColor()
switch(m_cActiveObject)
case0:
pixelValues=RGB(255,0,0);
break;
case1:
pixelValues=RGB(0,255,0);
case2:
pixelValues=RGB(0,0,255);
case3:
pixelValues=RGB(255,255,0);
case4:
pixelValues=RGB(255,0,255);
case5:
pixelValues=RGB(0,255,255);
case6:
pixelValues=RGB(255,255,255);
case7:
pixelValues=RGB(128,0,128);
case8:
pixelValues=RGB(128,128,0);
case9:
pixelValues=RGB(128,128,128);
case10:
pixelValues=RGB(255,128,0);
case11:
pixelValues=RGB(0,128,128);
case12:
pixelValues=RGB(123,50,10);
case13:
pixelValues=RGB(10,240,126);
case14:
pixelValues=RGB(0,128,255);
case15:
pixelValues=RGB(128,200,20);
default:
//初始化一个目标的参数
ObjectTrackerInitObjectParameters(SINT16x,SINT16y,SINT16Width,SINT16Height)
m_sTrackingObjectTable[m_cActiveObject].X=x;
m_sTrackingObjectTable[m_cActiveObject].Y=y;
m_sTrackingObjectTable[m_cActiveObject].W=Width;
m_sTrackingObjectTable[m_cActiveObject].H=Height;
m_sTrackingObjectTable[m_cActiveObject].vectorX=0;
m_sTrackingObjectTable[m_cActiveObject].vectorY=0;
m_sTrackingObjectTable[m_cActiveObject].Status=true;
m_sTrackingObjectTable[m_cActiveObject].assignedAnObject=false;
//进行一次跟踪
ObjeckTrackerHandlerByUser(IplImage*frame)
//计算目标的初始直方图
//在图像上搜索目标
//Extractsthehistogramofbox
//frame:
图像
//histogram:
直方图
//在图像frame中计算当前目标的直方图histogram
//直方图分为两部分,每部分大小4096,
//RGB的256*256*256种组合,缩减为16*16*16=4096种组合
//如果目标区域的点是边缘点,则计入直方图的后一部分,
//否则计入直方图的前一部分
FindHistogram(IplImage*frame,FLOAT32(*histogram))
SINT16i=0;
SINT16x=0;
SINT16y=0;
UBYTE8E=0;
UBYTE8qR=0,qG=0,qB=0;
//ULONG_32pixelValues=0;
UINT32numberOfPixel=0;
IplImage*r,*g,*b;
r=cvCreateImage(cvGetSize(frame),frame->
depth,1);
g=cvCreateImage(cvGetSize(frame),frame->
b=cvCreateImage(cvGetSize(frame),frame->
cvCvtPixToPlane(frame,b,g,r,NULL);
//dividecolorimageintoseparateplanesr,g,b.Theexactsequencedoesn'
tmatter.
for(i=0;
i++)//resetallhistogram
histogram[i]=0.0;
//forallthepixelsintheregion
for(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject].H/2,0);
y<
=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_cActiveObject].H/2,m_nImageHeight-1);
y++)
for(x=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObject].W/2,0);
x<
=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_cActiveObject].W/2,m_nImageWidth-1);
x++)
//边缘信息:
当前点与上下左右4点灰度差异是否超过阈值
E=CheckEdgeExistance(r,g,b,x,y);
qR=(UBYTE8)pixval8c(r,y,x)/16;
//quantizeRcomponent
qG=(UBYTE8)pixval8c(g,y,x)/16;
//quantizeGcomponent
qB=(UBYTE8)pixval8c(b,y,x)/16;
//quantizeBcomponent
histogram[4096*E+256*q