基于meanshift算法的图像处理Word文档下载推荐.docx

上传人:b****5 文档编号:19496519 上传时间:2023-01-06 格式:DOCX 页数:20 大小:21.84KB
下载 相关 举报
基于meanshift算法的图像处理Word文档下载推荐.docx_第1页
第1页 / 共20页
基于meanshift算法的图像处理Word文档下载推荐.docx_第2页
第2页 / 共20页
基于meanshift算法的图像处理Word文档下载推荐.docx_第3页
第3页 / 共20页
基于meanshift算法的图像处理Word文档下载推荐.docx_第4页
第4页 / 共20页
基于meanshift算法的图像处理Word文档下载推荐.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于meanshift算法的图像处理Word文档下载推荐.docx

《基于meanshift算法的图像处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于meanshift算法的图像处理Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。

基于meanshift算法的图像处理Word文档下载推荐.docx

{

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1