第7章 边沿检测与提取,轮廓跟踪

第7章 边沿检测与提取,轮廓跟踪
第7章 边沿检测与提取,轮廓跟踪

第7章边沿检测与提取,轮廓跟踪

我们在第三章介绍平滑与锐化时引入了模板操作,今天还要用到它。

7.1边沿检测

我们给出一个模板和一幅图象。不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。进行模板操作后的结果如下:

可以看出,第3、4列比其他列的灰度值高很多,人眼观察时,就能发现一条很明显的亮边,其它区域都很暗,这样就起到了边沿检测的作用。

为什么会这样呢?仔细看看那个模板就明白了,它的意思是将右邻点的灰度值减左邻点的灰度值作为该点的灰度值。在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0;而在边界附近,灰度值有明显的跳变,这么做的结果使得该点的灰度值很大,这样就出现了上面的结果。

这种模板就是一种边沿检测器,它在数学上的涵义是一种基于梯度的滤波器,又称边沿算子,你没有必要知道梯度的确切涵义,只要有这个概念就可以了。梯度是有方向的,和边沿的方向总是正交(垂直)的,例如,对于上面那幅图象的转置图象,边是水平方向的,我们可以用

梯度是垂直方向的模板检测它的边沿。

例如,一个梯度为45度方向模板,可以检测出135度方向的边沿。

1.Sobel算子

在边沿检测中,常用的一种模板是Sobel算子。Sobel算子有两个,一个是检测水平边沿的

;另一个是检测垂直平边沿的。与和

相比,Sobel算子对于象素的位置的影响做了加权,因此效果更好。

Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边

沿的,另一个是检测垂直平边沿的。各向同性Sobel 算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。

下面的几幅图中,图7.1为原图;图7.2为普通Sobel算子处理后的结果图;图7.3为各向同性Sobel算子处理后的结果图。可以看出Sobel算子确实把图象中的边沿提取了出来。

图7.1原图

图7.2普通Sobel算子处理后的结果图

图7.3各向同性Sobel算子处理后的结果图

在程序中仍然要用到第3章介绍的通用3×3模板操作函数TemplateOperation,所做的操作只是增加几个常量标识及其对应的模板数组,这里就不再给出了。

2.高斯拉普拉斯算子

由于噪声点(灰度与周围点相差很大的点)对边沿检测有一定的影响,所以效果更好的边沿检测器是高斯拉普拉斯(LOG)算子。它把我们在第3章中介绍的高斯平滑滤波器和拉普拉斯锐化滤波器结合了起来,先平滑掉噪声,再进行边沿检测,所以效果会更好。

常用的LOG算子是5×5的模板,如下所示。到中心点的距离与位置加权系数的关系用曲线表示为图7.4。是不是很象一顶墨西哥草帽?所以,LOG又叫墨西哥草帽滤波器。

图7.4LOG到中心点的距离与位置加权系数的关系曲线

图7.5为图7.1用LOG滤波器处理后的结果。

图7.5图7.1用LOG滤波器处理后的结果图

LOG的算法和普通模板操作的算法没什么不同,只不过把3×3改成了5×5,这里就不再给出了。读者可以参照第3章的源程序自己来完成。

7.2Hough变换

Hough变换用来在图象中查找直线。它的原理很简单:假设有一条与原点距离为s,方向角为θ的一条直线,如图7.6所示。

图7.6一条与原点距离为s,方向角为θ的一条直线

直线上的每一点都满足方程

(7.1)利用这个事实,我们可以找出某条直线来。下面将给出一段程序,用来找出图象中最长的直线(见图7.7)。找到直线的两个端点,在它们之间连一条红色的直线。为了看清效果,将结果描成粗线,如图7.8所示。

图7.7原图图7.8Hough变换的结果

可以看出,找到的确实是最长的直线。方法是,开一个二维数组做为计数器,第一维是角度,

第二维是距离。先计算可能出现的最大距离为,用来确定数组第二维的大小。对于每一个黑色点,角度的变化范围从00到1780(为了减少存储空间和计算时间,

角度每次增加20而不是10),按方程(7.1)求出对应的距离s来,相应的数组元素[s][]加1。同时开一个数组Line,计算每条直线的上下两个端点。所有的象素都算完后,找到数组元素中最大的,就是最长的那条直线。直线的端点可以在Line中找到。要注意的是,我们处理的虽然是二值图,但实际上是256级灰度图,不过只用到了0和255两种颜色。BOOL Hough(HWND hWnd)

{

//定义一个自己的直线结构

typedef struct{

int topx;//最高点的x坐标

int topy;//最高点的y坐标

int botx;//最低点的x坐标

int boty;//最低点的y坐标

}MYLINE;

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HDC hDc;

LONG x,y;

long i,maxd;

int k;

int Dist,Alpha;

HGLOBAL hDistAlpha,hMyLine;

Int*lpDistAlpha;

MYLINE*lpMyLine,*TempLine,MaxdLine;

static LOGPEN rlp={PS_SOLID,1,1,RGB(255,0,0)};

HPEN rhp;

//我们处理的实际上是256级灰度图,不过只用到了0和255两种颜色。if(NumColors!=256){

MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!", "Error Message",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

//计算最大距离

Dist=(int)(sqrt((double)bi.biWidth*bi.biWidth+

(double)bi.biHeight*bi.biHeight)+0.5);

Alpha=180/2;//0到to178度,步长为2度

//为距离角度数组分配内存

if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist*Alpha*

sizeof(int)))==NULL){

MessageBox(hWnd,"Error alloc memory!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

//为记录直线端点的数组分配内存

if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*

sizeof(MYLINE)))==NULL){

GlobalFree(hDistAlpha);

return FALSE;

}

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//BufSize为缓冲区大小

BufSize=OffBits+bi.biHeight*LineBytes;

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpDistAlpha=(int*)GlobalLock(hDistAlpha);

lpMyLine=(MYLINE*)GlobalLock(hMyLine);

for(i=0;i<(long)Dist*Alpha;i++){

TempLine=(MYLINE*)(lpMyLine+i);

(*TempLine).boty=32767;//初始化最低点的y坐标为一个很大的值}

for(y=0;y

//lpPtr指向位图数据

lpPtr=(char*)lpImgData+(BufSize-LineBytes-y*LineBytes);

for(x=0;x

if(*(lpPtr++)==0)//是个黑点

for(k=0;k<180;k+=2){

//计算距离i

i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0)));

//相应的数组元素加1

*(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1;

TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2);

if(y>(*TempLine).topy){

//记录该直线最高点的x,y坐标

(*TempLine).topx=x;

(*TempLine).topy=y;

}

if(y<(*TempLine).boty){

//记录该直线最低点的x,y坐标

(*TempLine).botx=x;

(*TempLine).boty=y;

}

}

}

maxd=0;

for(i=0;i<(long)Dist*Alpha;i++){

TempLine=(MYLINE*)(lpMyLine+i);

k=*(lpDistAlpha+i);

if(k>maxd){

//找到数组元素中最大的,及相应的直线端点

maxd=k;

MaxdLine.topx=(*TempLine).topx;

MaxdLine.topy=(*TempLine).topy;

MaxdLine.botx=(*TempLine).botx;

MaxdLine.boty=(*TempLine).boty;

}

}

hDc=GetDC(hWnd);

rhp=CreatePenIndirect(&rlp);

SelectObject(hDc,rhp);

MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);

//在两端点之间画一条红线用来标识

LineTo(hDc,MaxdLine.topx,MaxdLine.topy);

DeleteObject(rhp);

ReleaseDC(hWnd,hDc);

//释放内存及资源

GlobalUnlock(hImgData);

GlobalUnlock(hDistAlpha);

GlobalFree(hDistAlpha);

GlobalUnlock(hMyLine);

GlobalFree(hMyLine);

return TRUE;

}

如果是给定的,用上述方法,我们可以找到该方向上最长的直线。

其实Hough变换能够查找任意的曲线,只要你给定它的方程。这里,我们就不详述了。7.3轮廓提取

轮廓提取的实例如图7.9、图7.10所示。

图7.9原图图7.10轮廓提取

轮廓提取的算法非常简单,就是掏空内部点:如果原图中有一点为黑,且它的8个相邻点都是黑色时(此时该点是内部点),则将该点删除。要注意的是,我们处理的虽然是二值图,但实际上是256级灰度图,不过只用到了0和255两种颜色。源程序如下:

BOOL Outline(HWND hWnd)

{

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

int num;

int nw,n,ne,w,e,sw,s,se;

//我们处理的实际上是256级灰度图,不过只用到了0和255两种颜色。

if(NumColors!=256){

MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",

"Error Message",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//BufSize为缓冲区大小

BufSize=OffBits+bi.biHeight*LineBytes;

//为新图缓冲区分配内存

if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK| MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //拷贝头信息和位图数据

memcpy(lpTempImgData,lpImgData,BufSize);

for(y=1;y

//lpPtr指向原图数据,lpTempPtr指向新图数据

lpPtr=(char*)lpImgData+(BufSize-LineBytes-y*LineBytes);

lpTempPtr=(char*)lpTempImgData+(BufSize-LineBytes-y*LineBytes);

for(x=1;x

if(*(lpPtr+x)==0){//是个黑点

//查找八个相邻点

nw=(unsigned char)*(lpPtr+x+LineBytes-1);

n=(unsigned char)*(lpPtr+x+LineBytes);

ne=(unsigned char)*(lpPtr+x+LineBytes+1);

w=(unsigned char)*(lpPtr+x-1);

e=(unsigned char)*(lpPtr+x+1);

sw=(unsigned char)*(lpPtr+x-LineBytes-1);

s=(unsigned char)*(lpPtr+x-LineBytes);

se=(unsigned char)*(lpPtr+x-LineBytes+1);

num=nw+n+ne+w+e+sw+s+se;

if(num==0)//说明都是黑点

*(lpTempPtr+x)=(unsigned char)255;//删除该黑点

}

}

}

if(hBitmap!=NULL)

DeleteObject(hBitmap);

hDc=GetDC(hWnd);

//创立一个新的位图

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB_RGB_COLORS);

hf=_lcreat("c:\\outline.bmp",0);

_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_lclose(hf);

//释放内存和资源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}

7.4种子填充

种子填充算法用来在封闭曲线形成的环中填充某中颜色,在这里我们只填充黑色。

种子填充其实上是图形学中的算法,其原理是:准备一个堆栈,先将要填充的点push进堆栈中;以后,每pop出一个点,将该点涂成黑色,然后按左上右下的顺序查看它的四个相邻点,若为白(表示还没有填充),则将该邻点push进栈。一直循环,直到堆栈为空。此时,区域内所有的点都被涂成了黑色。

这里,我们自己定义了一些堆栈的数据结构和操作,实现了堆栈的初始化、push、pop、判断是否为空、及析构。

//堆栈结构

typedef struct{

HGLOBAL hMem;//堆栈全局内存句柄

POINT*lpMyStack;//指向该句柄的指针

LONG ElementsNum;//堆栈的大小

LONG ptr;//指向栈顶的指针

}MYSTACK;

//初始化堆栈的操作,第二个参数指定堆栈的大小

BOOL InitStack(HWND hWnd,LONG StackLen)

{

SeedFillStack.ElementsNum=StackLen;//将堆栈的大小赋值

if((SeedFillStack.hMem=GlobalAlloc(GHND,SeedFillStack.ElementsNum*

sizeof(POINT)))==NULL)

{

//内存分配错误,返回FALSE;

MessageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|

MB_ICONEXCLAMATION);

return FALSE;

}

SeedFillStack.lpMyStack=(POINT*)GlobalLock(SeedFillStack.hMem);

//缓冲区全部清零

memset(SeedFillStack.lpMyStack,0,SeedFillStack.ElementsNum*

sizeof(POINT));

//堆顶指针为零

SeedFillStack.ptr=0;

//成功,返回TRUE

return TRUE;

}

//析构函数

void DeInitStack()

{

//释放内存,重置堆栈大小及栈顶指针。

GlobalUnlock(SeedFillStack.hMem);

GlobalFree(SeedFillStack.hMem);

SeedFillStack.ElementsNum=0;

SeedFillStack.ptr=0;

}

//push操作

BOOL MyPush(POINT p)

{

POINT*TempPtr;

if(SeedFillStack.ptr>=SeedFillStack.ElementsNum)

return FALSE;//栈已满,返回FALSE

//进栈,栈顶指针加1

TempPtr=(POINT*)(SeedFillStack.lpMyStack+SeedFillStack.ptr++);

(*TempPtr).x=p.x;

(*TempPtr).y=p.y;

return TRUE;

}

//pop操作

POINT MyPop()

{

POINT InvalidP;

InvalidP.x=-1;

InvalidP.y=-1;

if(SeedFillStack.ptr<=0)

return InvalidP;//栈为空,返回无效点

SeedFillStack.ptr--;//栈顶指针减1

//返回栈顶点

return*(SeedFillStack.lpMyStack+SeedFillStack.ptr);

}

//判断堆栈是否为空

BOOL IsStackEmpty()

{

return(SeedFillStack.ptr==0)?TRUE:FALSE;

}

如果读者对堆栈的概念还不清楚,请参阅有关数据结构方面的书籍,这里就不详述了。

要注意的是:(1)要填充的区域是封闭的;(2)我们处理的虽然是二值图,但实际上是256级灰度图,不过只用到了0和255两种颜色;(3)在菜单中选择种子填充命令时,提示用户用鼠标点取一个要填充区域中的点,处理是在WM_LBUTTONDOWN中。

MYSTACK SeedFillStack;

BOOL SeedFill(HWND hWnd)

{

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr,lpTempPtr1;

HDC hDc;

HFILE hf;

POINT CurP,NeighborP;

//我们处理的实际上是256级灰度图,不过只用到了0和255两种颜色。

if(NumColors!=256){

MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",

"Error Message",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//BufSize为缓冲区大小

BufSize=OffBits+bi.biHeight*LineBytes;

//为新图缓冲区分配内存

if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK| MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //拷贝头信息和位图数据

memcpy(lpTempImgData,lpImgData,BufSize);

if(!InitStack(hWnd,(LONG)bi.biHeight*bi.biWidth)){//初始化堆栈//若失败,释放内存,返回

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return FALSE;

}

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-SeedPoint.y*LineBytes)+SeedPoint.x;

if(*lpTempPtr==0){

//鼠标点到了黑点上,提示用户不能选择边界上的点,返回FALSE

MessageBox(hWnd,"The point you select is a contour point!",

"Error Message",MB_OK|MB_ICONEXCLAMATION);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

DeInitStack();

return FALSE;

}

//push该点(用户用鼠标选择的,处理是在WM_LBUTTONDOWN中MyPush(SeedPoint);

while(!IsStackEmpty())//堆栈不空则一直处理

{

CurP=MyPop();//pop栈顶的点

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

//将该点涂黑

*lpTempPtr=(unsigned char)0;

//左邻点

if(CurP.x>0)//注意判断边界

{

NeighborP.x=CurP.x-1;

NeighborP.y=CurP.y;

lpTempPtr1=lpTempPtr-1;

if(*lpTempPtr1!=0)//如果为白,表示还没有填,进栈

MyPush(NeighborP);

}

//上邻点

if(CurP.y>0)//注意判断边界

{

NeighborP.x=CurP.x;

NeighborP.y=CurP.y-1;

lpTempPtr1=lpTempPtr+LineBytes;

if(*lpTempPtr1!=0)//如果为白,表示还没有填,进栈

MyPush(NeighborP);

}

//右邻点

if(CurP.x

{

NeighborP.x=CurP.x+1;

NeighborP.y=CurP.y;

lpTempPtr1=lpTempPtr+1;

if(*lpTempPtr1!=0)//如果为白,表示还没有填,进栈

MyPush(NeighborP);

}

//下邻点

if(CurP.y

{

NeighborP.x=CurP.x;

NeighborP.y=CurP.y+1;

lpTempPtr1=lpTempPtr-LineBytes;

if(*lpTempPtr1!=0)//如果为白,表示还没有填,进栈

MyPush(NeighborP);

}

}

//析构堆栈,释放内存

DeInitStack();

if(hBitmap!=NULL)

DeleteObject(hBitmap);

hDc=GetDC(hWnd);

//创建新的位图

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB_RGB_COLORS);

hf=_lcreat("c:\\seed.bmp",0);

_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_lclose(hf);

//释放内存和资源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}

7.5轮廓跟踪

轮廓跟踪,顾名思义就是通过顺序找出边缘点来跟踪出边界。图7.9经轮廓跟踪后得到的结果如图7.11所示。

图7.11图7.9轮廓跟踪后的结果

一个简单二值图象闭合边界的轮廓跟踪算法很简单:首先按从上到下,从左到右的顺序搜索,找到的第一个黑点一定是最左上方的边界点,记为A。它的右,右下,下,左下四个邻点中至少有一个是边界点,记为B。从开始B找起,按右,右下,下,左下,左,左上,上,右上的顺序找相邻点中的边界点C。如果C就是A点,则表明已经转了一圈,程序结束;否则从C点继续找,直到找到A为止。判断是不是边界点很容易:如果它的上下左右四个邻居都是黑点则不是边界点,否则是边界点。源程序如下,其中函数IsContourP用来判断某点是不是边界点。

BOOL Contour(HWND hWnd)

{

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

POINT StartP,CurP;

BOOL found;

int i;

int direct[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};

//我们处理的实际上是256级灰度图,不过只用到了0和255两种颜色。

if(NumColors!=256){

MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",

"Error Message",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

//到位图数据的偏移值

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//缓冲区大小

BufSize=OffBits+bi.biHeight*LineBytes;

//为新图缓冲区分配内存

if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//新图缓冲区初始化为255

memset(lpTempImgData,(BYTE)255,BufSize);

//拷贝头信息

memcpy(lpTempImgData,lpImgData,OffBits);

//找到标志置为假

found=FALSE;

for(y=0;y

lpPtr=(char*)lpImgData+(BufSize-LineBytes-y*LineBytes);

for(x=0;x

if(*(lpPtr++)==0)found=TRUE;

//找到了最左上的黑点,一定是个边界点

}

if(found){//如果找到了,才做处理

//从循环退出时,x,y坐标都做了加1的操作。在这里把它们减1,得到//起始点坐标StartP

StartP.x=x-1;

StartP.y=y-1;

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-StartP.y*LineBytes)+StartP.x;

*lpTempPtr=(unsigned char)0;//起始点涂黑

//右邻点

CurP.x=StartP.x+1;

CurP.y=StartP.y;

lpPtr=(char*)lpImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

if(*lpPtr!=0){//若右邻点为白,则找右下邻点

CurP.x=StartP.x+1;

CurP.y=StartP.y+1;

lpPtr=(char*)lpImgData+

(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

if(*lpPtr!=0){//若仍为白,则找下邻点

CurP.x=StartP.x;

CurP.y=StartP.y+1;

}

else{//若仍为白,则找左下邻点

CurP.x=StartP.x-1;

CurP.y=StartP.y+1;

}

}

while(!((CurP.x==StartP.x)&&(CurP.y==StartP.y))){//知道找到起始点,//循环才结束

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

*lpTempPtr=(unsigned char)0;

for(i=0;i<8;i++){

//按右,右上,上,左上,左,左下,下,右下的顺序找相邻点

//direct[i]中存放的是该方向x,y的偏移值

x=CurP.x+direct[i][0];

y=CurP.y+direct[i][1];

//lpPtr指向原图数据,lpTempPtr指向新图数据

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-y*LineBytes)+x;

lpPtr=(char*)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;

if(((*lpPtr==0)&&(*lpTempPtr!=0))||

((x==StartP.x)&&(y==StartP.y)))

//原图中为黑点,且新图中为白点(表示还没搜索过)时才处理

//另一种可能是找到了起始点

if(IsContourP(x,y,lpPtr)){//若是个边界点

//记住当前点的位置

CurP.x=x;

CurP.y=y;

break;

}

}

}

}

if(hBitmap!=NULL)

DeleteObject(hBitmap);

hDc=GetDC(hWnd);

//创立一个新的位图

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB_RGB_COLORS);

hf=_lcreat("c:\\contour.bmp",0);

_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_lclose(hf);

//释放内存和资源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}

//判断某点是不是边界点,参数x,y为该点坐标,lpPtr为指向原数据的指针BOOL IsContourP(LONG x,LONG y,char*lpPtr)

{

int num,n,w,e,s;

n=(unsigned char)*(lpPtr+LineBytes);//上邻点

w=(unsigned char)*(lpPtr-1);//左邻点

e=(unsigned char)*(lpPtr+1);//右邻点

s=(unsigned char)*(lpPtr-LineBytes);//下邻点

num=n+w+e+s;

if(num==0)//全是黑点,说明是个内部点而不是边界点

return FALSE;

return TRUE;

}

The University of Southern California does not screen or control the content on this website and thus does not guarantee the accuracy,integrity,or quality of such content.All content on this website is provided by and is the sole responsibility of the person from which such content originated,and such content does not necessarily reflect the opinions of the University administration or the Board of Trustees

地质雷达测量技术

地质雷达测量技术 内容提要:本文在简述地质雷达基本原理的基础上,介绍了地质雷达检测隧道衬砌质量的工作方法,通过理论分析、实际资料计算、实测效果等方面说明采用地质雷达技术检测隧道衬砌质量的必要性和可靠性。 关键词:地质雷达测量技术 1 前言 地质雷达(Geological Radar)又称探地雷达(Ground Penetrating Radar),是一项基于不破坏受检母体而获得各项检测数据的检测方法,在我国已在数百项工程中得到了应用,并取得了显著成效。同时,随着交通、水利、市政建设工程等基础设施的大力发展,以及国家对工程质量的日益重视,工程实施过程中仍急需用物理勘探的手段解决大量的地质难题,因此,地质雷达极其探测技术市场前景十分广阔。 地质雷达作为一项先进技术,具有以下四个显著特点:具有非破坏性;抗电磁干扰能力强;采用便携微机控制,图象直观;工作周期短,快速高效。它不仅用于管线探测,还可用于工程建筑,地质灾害,隧道探测,不同地层划分,材料,公路工程质量的无损检测,考古等等。 2 地质雷达技术原理 地质雷达是运用瞬态电磁波的基本原理,通过宽带时域发射天线向地下发射高频窄脉冲电磁波,波在地下传播过程中遇到不同电性介质界面时产生反射,由接收天线接收介质反射的回波信息,再由计算机将收到的数字信号进行分析计算和成像处理,即可识别不同层面反射体的空间形态和介质特性,并精确标定物体的深度(图1)。

图1 地质雷达检测原理图 3 雷达的使用特性 3.1无损、连续探测,不破坏原有母体,避免了后期修补工作,可节约大量的时间和费用。 3.2 操作简便,使用者经过2-3天培训就能掌握。 探测时,主机显示器实时成像,操作人员可直接从屏幕上判读探测结果,现场打印成图,为及时掌握施工质量提供资料,提高了检测速度和科学水平。并且通过数据分析,还可以了解道路的结构情况,发现道路路基的变化和隐性灾害,使日常管理和维护更加简单。 3.3 测量精度高,测试速度快。在车载工作方式下,测试速度大大提高,当车速达80Km/h时,系统仍能正常工作。 3.4 收、发天线离地面的探测高度可以针对不同的埋地目标进行调整,以达到最佳的探测能力和探测分辨率:同时还可以调节收发天线之间的距离寻找系统工作的最好效果。 3.5 测点密度不受限制,便于点测和普查。 工作方式的灵活使得用户可以连续普查某一段工程的质量,也可随时对异常区域进行重点探测 和分析。 3.6 便于维护与保养。 本系统采用了结构化设计,对于使用不当或其它原因造成的质量问题,简单地更换接插件即可保证雷达的正常工作。 3.7 可扩充配置。 通过选择相应的发射源和收发天线,再配上相应的处理软件,就可以在中、深层探测范围,如地下管线、地基空洞、钢筋分布、堤坝密实程度等方面扩大应用。 4 地质雷达在检测隧道衬砌质量中的应用 新建隧道施工中为确保隧道衬砌质量,采用传统“钻、看”的检测方法显然已不能满足“多断面、全方位”的检测要求,业主和施工单位都在探索采用无损检测技术有效监控和确保隧道衬砌质量的新方法。 隧道衬砌的质量检测包括1)隧道衬砌厚度,2)隧道衬砌背后未回填的空区,3)隧道衬砌的密实程度,4)施工时坍方位置及坍方的处理情况。5)有时还可检测围岩中地下水向隧道侵入的位置。4.1 工作方法

智能跟踪系统使用说明

HXT智能图像 定位跟踪切换系统V1.0 使用说明

目录 前言 ...................................................................................................................... I I 第一章外观及硬件 . (3) 1.1外观及硬件说明 (3) 1.1.1 开箱须知 (3) 1.1.2 主机规格 (3) 1.1.3 定位摄像机规格 (4) 1.2接口说明 (4) 1.3跟踪机实物 (5) 1.4跟踪机指示灯说明 (5) 1.5跟踪机线缆连接说明 (6) 1.5.1 定位摄像机图像输入连接 (6) 1.5.2 其他接口连接 (7) 第二章软件操作说明 (8) 2.1配置概述 (8) 2.1.1 特别说明 (8) 2.1.2 概述说明 (8) 2.2软件配置 (9) 2.2.1 详细配置 (9) 2.2.2 配置向导 (17) 2.2.3 高级配置 (21) 2.2.4 专业云台配置 (26) 2.2.5 网络设置 (27) 2.2.6 图像跟踪调试 (28) 2.2.7 手动导播控制 (29) 第三章附录 (30) 3.1VISCA RS-232C规格 (30)

前言 感谢您使用智能图像跟踪系统! 本手册将帮助您对智能图像跟踪系统的安装及使用进行了解;帮助您排除智能图像跟踪系统在使用过程中的常见故障。在使用该系统之前,请仔细阅读本手册,这将有助于您更好地使用它。请将本手册保存好,以备随时查阅。 本手册在编排时力求清晰、全面,但因各种原因,未曾意识到的疏漏在所难免,如果您在使用手册的过程中发现错误或不明确的地方,请速与产品经销商联系。 为了最大可能地满足您的需求,同时能很好地适应市场发展的需要,我们将会不断地对硬件和软件作相应的升级和改动。当硬件和软件作相应的升级和改动出现实际情况与本手册不一致的地方,请您及时向经销商咨询,恕不另行通知。 感谢您对智能图像跟踪系统及相关产品的信任!

地质雷达

地质雷达在隧道超前地质预报中的应用 摘要:本文简要介绍了地质雷达基本原理及其探测深度、精度,并结合实例阐述了地质雷达的工程应用。 关键词:地质雷达;隧道超前地质预报;掌子面 引言 目前,我国修建大量穿越山岭的特长隧道。由于这些隧道大都处于地下各种复杂的水文地质、工程地质岩体中。为了摸清和预知周围的水文地质和工程地质条件,隧道地质超前预报显示出越来越重要的作用。在隧道开挖掘进过程中,提前发现隧道前方的地质变化,为施工提供较为准确的地质资料,及时调整施工工艺,减少和预防工程事故的发生非常重要。一、地质雷达基本原理及探测深度、精度 地质雷达( Ground Penetrating Radar, 简称GPR, 也称探地雷达) 是利用超高频(106Hz~109Hz)电磁脉冲波的反射探测地下目的体分布形态及特征的一种地球物理勘探方法。发射天线( T) 将信号送入地下,遇到地层界面或目的体反射后回到地面再由接收天线( R) 接收电磁波的反射信号,通过对电磁波反射信号的时域特征和振幅特征进行分析来了解地层或目的体特征(见图1)

图1 地质雷达反射探测原理图 根据波动理论,电磁波的波动方程为: P = │P│e-j(αx-αr)﹒e-βr(1)(1)式中第二个指数-βr是一个与时间无关的项,它表示电磁波在空间各点的场值随着离场源的距离增大而减小,β为吸收系数。式中第一个指数幂中αr表示电磁波传播时的相位项,α为相位系数,与电磁波传播速度V的关系为: V = ω/α(2)当电磁波的频率极高时,上式可简略为: V = c/ε1/2(3)式中c为电磁波在真空中的传播速度;ε为介质的相对介电常

一种自动提取目标的主动轮廓法

第31卷第5期 光 子 学 报 V o l.31No.5 2002年5月 ACTA PHOT ONICA SINICA M ay2002  一种自动提取目标的主动轮廓法 李熙莹 倪国强 (北京理工大学光电工程系,北京100081) 摘 要 提出一种新的广泛应用于数字图象分析和计算机视觉的主动轮廓(Snake)模型,引入作用方向可以自适应变化的外加强制力,使控制点能够不依赖于初始轮廓而快速地收敛 到目标的真实轮廓;初始轮廓自动确定;控制点的数目可以自适应地改变;能够在背景比较 复杂的图象中实现对目标轮廓的提取.用该模型对空中目标的红外图象进行的实验结果表 明其具有很好的鲁棒性和实用性. 关键词 主动轮廓法;Snake;红外图象;轮廓提取 0 引言 主动轮廓模型又称为Snake模型,是由Kass 于1987年提出的1,它融合了分割过程的三个阶段,使得检测得到的目标边界就是一光滑连接的曲线.其主要思想是定义一个能量函数,在Snake由初始位置向真实轮廓逐渐靠近时,寻找此能量函数的局部极小值,即通过对能量函数的动态优化来逼近目标的真实轮廓.此能量函数主要由内部能量函数及外部能量函数组成.内部能量函数考虑包络本身的连续性和各点曲率的大小;外部能量函数则主要涉及到图象的一些具体情况,如图象灰度变化的梯度等因素. Kass的Snake模型中,用参量表示轮廓线v(s)=(x(s),y(s))(s为轮廓弧长),其能量函数定义为  E*snake=∫10E snake(v(s))d s  =∫10[E int(v(s))+E image(v(s))+E con(v(s))](1)式中,E int表示主动轮廓线的内部能量,也叫内部力;E image表示图象作用力产生的能量,也叫图象力;E con表示外部限制作用力产生的能量,叫约束力.后两项和称为外部能量E ext=E image+ E con.内部力起到平滑轮廓、保持轮廓连续性的作用;图象力表示轮廓点与图象局部特征吻合的情况;约束力是各种人为定义的约束条件. Kass的算法存在要求外力可微、不稳定、控制参量无法确定、计算量大和时间开销大等缺点. Amini2、William s3等人改进了Kass的算法,引入硬强制力,且大大提高了运行速度(Amini的算法运算量为O(m3n)Williams的Gr eedy算法运算为O(mn),m为迭代的领域大小,n为Snake控制点的数目).不过,它们仍存在一些问题,如迭代效果依赖于初始轮廓点的选取;控制点在迭代中向高曲率边缘堆积;控制点数目固定不变,不能随目标大小变化调节等.有许多研究者针对原始Snake的缺点进行了模型改进或算法改进,如对角点判定的阈值选取方法加以改进、按照一定的规则调节控制点间距、采用不同的图象特征能量模型4,5等,不过对于初始轮廓点依然敏感或运算比较复杂。 本文以William的Greedy算法为参考,提出了一种自动的主动轮廓法(Auto-Snake),引入作用方向可自适应变化的外加强制力,从而使控制点能快速地收敛到目标的真实轮廓,不依赖于初始轮廓;初始轮廓自动确定,无需人工干预;控制点的数目可以自适应地改变;明确了各个参量的选择.该算法不仅继承前人算法的优点,而且保证算法快速收敛,适用于多种场合,在背景比较复杂的图象中也可以实现对目标轮廓的提取. 1 K ass的主动轮廓法能量模型 Kass和Snake模型中,内部能量可表示为轮廓对弧长的一阶导数项v s(s)和二阶导数项v ss(s)

最新Canny边缘检测与轮廓提取汇总

C a n n y边缘检测与轮 廓提取

摘要................................................................................................................................................... Abstract.......................................................................................................................................... I 1 绪论 0 2 设计内容与OpenCV简介 (1) 2.1 设计任务内容 (1) 2.2 OpenCV简介 (1) 3 理论分析 (2) 3.1 边缘检测 (2) 3.1.1 图像的边缘 (2) 3.1.2 边缘检测的基本步骤 (2) 3.2 轮廓提取 (3) 4 边缘检测的算法比较 (4) 4.1 Reborts算子 (4) 4.2 Sobel算子 (5) 4.3 Prewitt 算子 (5) 4.4 Kirsch 算子 (7) 4.5 LOG算子 (7) 4.6 Canny算子 (8) 5 实验仿真 (10) 5.1算法设计 (10) 5.2 实验结果 (11) 6 分析与总结 (12) 参考文献 (13) 附录 (14)

边缘检测是图像处理和计算机视觉中的基本问题,它的目的是标识出数字图像中亮度变化明显的点。图像经过边沿检测处理之后,不仅大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。 事实上,边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置。这些轮廓常常是我们在图像边缘检测时,所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。 可用于图像边缘检测和轮廓提取的方法有很多,其中包括有常见的Robert边缘算子、Prewitt 边缘算子、Sobel边缘算子等等。本文首先将会从数字图像处理的角度,对几种边缘检测算法进行详细的分析,然后会并选择其中一种边缘检测算法进行实验。考虑到以后进一步的学习,本文将会使用openCV对算法进行实现。最后,本文将会把实验获得的实际效果,与理论分析的结果进行比对,并以此对本次实验进行总结。 关键字:边缘检测轮廓提取图像处理openCV

一种实时图像目标搜索与跟踪系统设计

一种实时图像目标搜索与跟踪系统设计 一种实时图像目标搜索与跟踪系统设计 1前言 电视图像跟踪器是一种具有简单智能的图像跟踪装置,由于需要逐场(20ms)处理视场中的数据,因此处理的数据量大、算法复杂度高,传统的处理器一般不能满足速度要求,本系统选择美国TI公司TMS320C5416信号处理器为核心,实现了实时采集视场中的图像数据并完成相应的图像处理算法运算的任务。TMS320C5416主频可达160MHz,片内总存储空间为128M×16bit,是一款高性能低功耗通用数字信号处理芯片。该系统能处理50场/秒的,图像分辨率可调的标准电视图像信号。 2.系统硬件框图 图1系统硬件整体结构框图 系统采用双DSP+CPLD构架,系统有两路输入,一路接数字视频信号输入,另外一路从摄像机输入PAL制式的视频信号。双DSP中一个为主DSP,负责处理跟踪算法以及与上位机通信,另外一个从DSP负责实时产生模拟高斯噪声用以检测各种噪声条件下跟踪算法的效果。两个DSP之间通过一个共享双口RAM或HPI进行通信。在场正程图像数据存储到图像SRAM中,主DSP在场逆程从图像双口RAM中读取图像数据到DSP 内部,场正程开始时主DSP开始进行图像处理算法,在下一场逆程主DSP 将处理的结果以及相关数据写入图形显示双口RAM同时开始从SRAM读入下一场数据,DSP处理完成以后在时序电路和视频复合电路配合下将处

理结果显示到监视器上,完成实时图像处理任务。 2.1图像采集模块 图像采集模块的主要功能是获取输入视频信号中的灰度数据和同步时钟,它是后续处理的基准。系统采用同步分离和锁相技术设计,采用分立元件。具体实现是信号从CCD出来后分为两路,一路经同步分离同步分离器LM1881,输出复合同步HS,场同步VS作为后面电路的控制信号,另一路经篏位和直流恢复,然后放大,将图像信号调整到A/D转换器的参考电压范围之内。对行同步信号进行锁相倍频即可得到像素时钟信号,锁相环芯片采用74HC4046。输入视频信号经锁相环锁相输出系统象素时钟提供给A/D变换器使用,得到数字图像数据。 2.2时序电路模块 时序模块主要由一片CPLD(Xilinx公司的95288XL)实现,包括锁相计数、标准视频行场信号生成、DSP的外接存储器接口片选读写信号生成以及部分存储器地址生成、实现图形信号的并串转换、用户自定义I/O等。 2.3通讯接口模块 本系统用到一个异步串口接收PC发送的调试命令,并向PC返回运算结果。 5416提供的串口是一种同步串行接口,并不支持通用异步接收器/发送器(UART)标准,本系统使用MAXIM公司的MAX3100芯片实现同步串口到异步串口的转换。5416使用FSR和FSX作为每次传输的同步信号,FSX作为MAX3100的选通信号。同步接收时钟CLKR和同步发送时钟CLKX在本系统中使用内部的时钟源,并且把CLKX作为MAX3100的同

图像视频跟踪系统

图像视频跟踪系统 摘要:通过对图像进行阈值处理(图像分割),再对分割后的图像求取形心,以对目标图像进行定位,并最后找到各幅帧图像的目标位置的方法,从而实现对200帧视频图像的实时跟踪。 关键词:阈值处理;视频序列目标跟踪;形心估计 1 引言 视频序列目标跟踪是指对传感器摄取到的图像序列进行处理与分析,充分利用传感器采集得到信息来对目标进行稳定跟踪的过程。一旦目标被确定,就可获得目标的位置、速度、加速度等运动参数,进而获得目标的特征参数。在军事上,视频序列目标跟踪技术广泛应用于精确制导、战场机器人自主导航、无人机着降,靶场光电跟踪等领域。在民用上,该技术在智能视频监控、智能交通管制、医疗影像诊断等方面也有很重要的应用。 视频跟踪目前在国内外都有较广泛的研究和应用,比如2005年,美国中央佛罗里达大学计算机视觉实验室开发出了基于MATLAB的COCOA系统,用于无人机低空航拍视频图像的目标检测与跟踪处理。 2 基于MATLAB的图像跟踪算法 2.1 200帧视频图像的读取 由于视频是由200帧图像通过连续播放从而达到视频的效果的,所以要达到视频放映的效果,应首先对200帧图像序列进行顺序读取。200帧图像存储在MATLAB的默认路径中,文件名为00000xxx.bmp。要达到读取它们的目的,需要使用循环算法。算法由一个名为read_seqim(i)的函数实现,以下是函数的源程序: function I=read_seqim(i) if nargin==0 i=1;min=00000001; end

name=num2str(i); if i<=9 min=strcat('0000000',name,'.bmp'); elseif i<=99 min=strcat('000000',name,'.bmp'); else min=strcat('00000',name,'.bmp'); end I=imread(min); 其中i为读取图像的序号,通过以上的函数可以很方便的实现对200帧图像中任意一帧的读取,从而为后面的处理提供方便。 2.2 图像的阈值处理(图像分割) 阈值(Threshold),也叫门限。阈值化(Thresholding),即按给定阈值进行图像的二值化处理。阈值分割法可分为以下几种: ?简单阈值分割法; ?多阈值分割法; ?最大类间方差法; ?最佳阈值法。 许多情况,图像是由具有不同灰度级的几类区域组成。如文字与纸张、地物与云层(航空照片)等,阈值分割是利用同一区域的具有某种共同灰度特性进行分割。而用阈值分割法分割图像就是选取一个适当的灰度阈值,然后将图像中的每个像素和它进行比较,将灰度值超过阈值的点和低于阈值的点分别指定一个灰度值,就可以得到分割后的二值图像,此时目标和背景已经得到了分割。阈值分割法简单,快速,特别适用于灰度和背景占据不同灰度级范围的图像。这里我们使用多阈值分割法。 多阈值分割法就是假设一幅图像包含两个以上的不同类型的区域,可以使用几个 门限来分割图象。分割函数如下:2.2.1阈值的确定 01 112 22 ,(,) (,),(,) ,(,) f f x y T g x y f T f x y T f f x y T ≤ ? ? =<≤ ? ?> ?

第二讲 国内外地质雷达技术发展状况

第二讲国内外地质雷达技术发展状况(历史与现状) 探地雷达的历史最早可追溯到20世纪初,1904年,德国人Hulsmeyer首次将电磁波信号应用与地下金属体的探测。1910年Leimback和Lowy以专利形式在1910年的专利,他们用埋设在一组钻孔里的偶极子天线探测地下相对高的导电性质的区域,并正式提出了探地雷达的概念。1926年Hulsenbeck第一个提出应用脉冲技术确定地下结构的思路,指出只要介电常数发生变化就会在交界面会产生电磁波反射,而且该方法易于实现,优于地震方法[1,2]。但由于地下介质具有比空气强得多的电磁衰减特性,加之地下介质情况的多样性,电磁波在地下的传播比空气中复杂的多,使得探地雷达技术和应用受到了很多的限制,初期的探测仅限于对波吸收很弱的冰层厚度(1951,B.O.Steenson,1963,S.Evans)和岩石和煤矿的调查(J.C.Cook)等。随着电子技术的发展,直到70探地雷达技术才重新得到人们的重视,同时美国阿波罗月球表面探测实验的需要,更加速了对探地雷达技术的发展,其发展过程大体可分为三个阶段: 第一阶段,称为试验阶段,从20世纪70年代初期到70年代中期,在此期间美国,日本、加拿大等国都在大力研究,英国、德国也相继发表了论文和研究报告,首家生产和销售商用GPR的公司问世,即Rex Morey和Art Drake成立的美国地球物理测量系统公司(GSSI),日本电器设备大学也研制出小功率的基带脉冲雷达系统。此期间探地雷达的进展主要表现在,人们对地表附近偶极天线的辐射场以及电磁波与各种地质材料相互作用的关系有了深刻的认识,但这些设备的探测精度、地下杂乱回波中目标体的识别、分别率等方面依然存在许多问题。 第二阶段,也称为实用化阶段,从20世纪70年代中后其到80年代,在次期间技术不段发展,美国、日本、加拿大等国相继推出定型的探地雷达系统,在国际市场,主要有美国的地球物理探测设备公司(GSSI)的SIR系统,日本应用地质株式社会(OYO)的YL-R2地质雷达,英国的煤气公司的GP管道公司雷达,在70年代末,加拿大A-Cube公司的Annan和Davis等人于1998年创建了探头及软件公司(SSI),针对SIR系统的局限性以及野外实际探测的具体要求,在系统结构和探测方式上做了重大的改进,大胆采用了微型计算机控制、数字信号处理以及光缆传输高新技术,发展成了EKKO Ground Penetrating Radar 系列产品,简称EKKO GPR系列。瑞典地质公司(SGAB)也生产出RAMAC 钻孔雷达系统,此外,英国ERA公司、SPPSCAN公司,意大利IDS公司、瑞典及丹麦也都在生产和研制各种不同型号的雷达。80年代全数字化的GPR问世,具有划时代的意义,数字化GPR不仅提供了大量数据存储的解决方案,增强了实时和现场数据处理的能力,为数据的深层次后处理带来方便,更重要的是GPR 因此显露出更大的潜力,应用领域得以向纵身拓展。 第三阶段,从上个世纪80年代至今,可称为完善和提高阶段。在此期间,GPR技术突飞猛进,更多的国家开始关注探地雷达技术,出现了很多探地雷达的研究机构,如荷兰的应用科学研究组织和代尔夫大学,法国_德国的Saint-Louis 研究所(ISL),英国的DERA,瑞典的FOA,娜威科技大学和地质研究所,比利时的RMA,南非的开普敦大学,澳大利亚昆士兰大学,美国的林肯实验室和Lawrence Livermore国家实验室以及日本的一些研究机构等等。同时,探地雷达也得到了地球物理和电子工程界的更多关注,对天线的改进、信号的处理、地下目标的成像等方面提出了许多新的见解。GSSI公司在商业上取得了极大的成功,

隧道衬砌地质雷达无损检测技术

. . . . 隧道衬砌质量地质雷达无损检测技术 1 前言 1.1工艺概况 铁路隧道衬砌是隐蔽工程,用传统的目测或钻孔对其质量进行检测有较大的局限性;应用物理勘探的方法对隧道衬砌混凝土进行无损检测,可取得快速、安全、可靠的效果。 1.2工艺原理 电磁反射波法(地质雷达)由主机、天线和配套软件等几部分组成。根据电磁波在有耗介质中的传播特性,当发射天线向被测介质发射高频脉冲电磁波时,电磁波遇到不均匀体(接口)时会反射一部分电磁波,其反射系数主要取决于被测介质的介电常数,雷达主机通过对此部分的反射波进行适时接收和处理,达到探测识别目标物体的目的(图1)。 图1 地质雷达基本原理示意图 电磁波在特定介质中的传播速度是不变的,因此根据地质雷达记录的电磁波传播时间ΔT,即可据下式算出异常介质的埋藏深度H: H V T =??2(1)

式中,V 是电磁波在介质中的传播速度,其大小由下式表示: V C =ε (2) 式中,C 是电磁波在大气中的传播速度,约为3.0×108m/s ; ε为相对介电常数,不同的介质其介电常数亦不同。 雷达波反射信号的振幅与反射系统成正比,在以位移电流为主的低损耗介质中,反射系数可表示为: 212 1εεεε+-=r (3) 反射信号的强度主要取决于上、下层介质的电性差异,电性差越大,反射信号越强。 雷达波的穿透深度主要取决于地下介质的电性和波的频率。电导率越高,穿透深度越小;频率越高,穿透深度越小。 2 工艺特点 电磁反射波法(地质雷达)能够预测隧道施工中衬砌的各种质量问题,分辨率高,精度高,探测深度一般在0.5m ~2.0m 左右。利用高频电磁脉冲波的反射,中心工作频率400MHz/900 MHz/1500 MHz ; 采用宽带短脉冲和高采样率,分辨率较高; 采用可调程序高次迭加和多波处理等信号恢复技术,大大改善了信噪比和图像显示性能。 (1)操作简单,对工作环境要求不高; (2)对衬砌隐蔽工程质量问题性质判断一般精度较高,分辨率可达到2~5cm ,检测的深度、结构尺寸以及里程偏差或误差小于10%,缺陷类型识别准确度达95%以上; (3)通过专业的RADAN 6.0分析软件,专业的技术人员可以迅速的完成数据处理等。 3 适用范围 地质雷达有其适用范围和适用条件,目标体与周围介质是否存在足够的电性

基于动态规划法的B样条主动轮廓模型

收稿日期:2004-09-07 基金项目:国家自然科学基金资助项目(10272033);广东省自然科学基金资助项目(04105186,5300090)作者简介:张海舰(1976-),男,硕士研究生,主要研究方向为基于数字图像序列的图像处理技术.基于动态规划法的B 样条主动轮廓模型 张海舰,成思源,骆少明,丁 炜 (广东工业大学机电工程学院,广东广州510090) 摘要:对基于主动轮廓模型的图像分割方法进行了研究,提出了一种基于动态规划法的B 样条主动轮廓模型.该模型结合了动态规划法与B 样条曲线的优点,不仅保留了动态规划法收敛过程稳定, 能保证全局最优的优点,而且还进一步改善了其计算复杂度.实验结果验证了该方法的有效性. 关键词:图像分割;主动轮廓模型;动态规划;B 样条 中图分类号:TP391 文献标识码:A 文章编号:1007-7162(2005)04-0026-05 图像分割指在图像中检测并勾画出感兴趣物体的处理,是图像处理领域中的重要内容之一,也是计算机视觉领域低层次视觉的主要问题.由于图像噪声及采样误差等原因通常造成目标边缘具有模糊、不连贯等特点,图像分割至今还不存在一个通用的解决方法.主动轮廓模型,又称为snake 模型,是目前研究最多、应用最广的分割方法[1] .它结合了几何、物理和近似理论,通过利用从图像数据中获得的约束信息(自底向上)和目标的位置、大小、形状等先验知识(自顶向下),可有效地对目标进行分割、识别、匹配和跟踪. 本文针对传统主动轮廓模型的不足,提出了一种新的基于动态规划法的B 样条主动轮廓模型,并通过图像分割的实验来验证该模型的有效性.1 主动轮廓模型 主动轮廓模型或snake 模型可表示为定义在s I [01]上的参数曲线v (s )=(x (s ),y (s )), 其能量函数表示为 [2]E snake =Q snake E (v (s ))d s =Q snake E in t (v (s ))+E ext (v (s ))d s , (1)其中内能E in t 代表对snake 模型的形状约束,定义为E int (s )=12 A (s )9v (s )9s 2+ B (s )92v (s )9t 22,(2)系数A 和B 分别控制对snake 的拉伸和弯曲.外能E ext 的极小值与图像特征相对应,对于一给定图像I (x ,y ),通常可定义为 E ext =-|¨I (x ,y )|2. (3)为使能量泛函(1)极小,snake 必须满足Euler 方程: -A v d (s )+B v d d (s )+¨E ext =0, (4) 式(4)可改写为力平衡方程 第22卷第4期 2005年12月广东工业大学学报Journal o f Guangdong University of Technology Vol.22No.4December 2005

边缘检测和轮廓提取方法和VC++程序

边沿检测和轮廓提取方法和程序 1 边沿检测 我们给出一个模板和一幅图象。不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。进行模板操作后的结果如下: 。 可以看出,第3、4列比其他列的灰度值高很多,人眼观察时,就能发现一条很明显的亮边,其它区域都很暗,这样就起到了边沿检测的作用。 为什么会这样呢?仔细看看那个模板就明白了,它的意思是将右邻点的灰度值减左邻点的灰度值作为该点的灰度值。在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0;而在边界附近,灰度值有明显的跳变,这么做的结果使得该点的灰度值很大,这样就出现了上面的结果。 这种模板就是一种边沿检测器,它在数学上的涵义是一种基于梯度的滤波器,又称边沿算子,你没有必要知道梯度的确切涵义,只要有这个概念就可以了。梯度是有方向的,和边沿的方向总是正交(垂直)的,例如,对于上面那幅图象的转置图象,边是水平方向的,我们可以用 梯度是垂直方向的模板检测它的边沿。 例如,一个梯度为45度方向模板,可以检测出135度方向的边沿。 1.Sobel算子

在边沿检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的。与和 相比,Sobel算子对于象素的位置的影响做了加权,因此效果更好。 Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边 沿的,另一个是检测垂直平边沿的。各向同性Sobel 算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。 下面的几幅图中,图7.1为原图;图7.2为普通Sobel算子处理后的结果图;图7.3为各向同性Sobel算子处理后的结果图。可以看出Sobel算子确实把图象中的边沿提取了出来。 图7.1 原图

地质雷达探测技术在路基病害检测中的应用继续教育答案

第1题 由于松散体部充填不同性状的土体排列无规律,因此松散体部在雷达图像上表现为杂乱的,随深度的增加,电磁波逐渐 A.强反射波,增大 B.强反射波,衰减 C.弱反射波,增大 D.弱反射波,衰减 答案:B 您的答案:B 题目分数:5 此题得分:5.0 批注: 第2题 空洞部会形成明显的多次反射波组,形态大致为一倒悬() A.双曲线 B.抛物线 C.折线 D.圆曲线 答案:A 您的答案:D 题目分数:5 此题得分:0.0 批注: 第3题 数据处理的一般流程为: 原始数据的编辑- > 滤波- >设定时间零点- >频谱分析- >()- >属性分析、剖面叠加等- >增益- >速度求取- >高程修正- >剖面输出 A.增益 B.滤波 C.去噪 D.时窗选取 答案:B 您的答案:B 题目分数:5 此题得分:5.0 批注: 第4题 反射系数的大小主要取决于反射界面两侧介质介电常数的差异, 差

异越大反射信号(), 反之反射信号() A.越强,越差 B.越强,越好 C.越弱,越差 D.越弱,越好 答案:A 您的答案:A 题目分数:5 此题得分:5.0 批注: 第5题 地质雷达法是一种采用()电磁波信号检测地下介质分布的方法 A.宽脉冲宽带高频 B.窄脉冲宽带高频 C.宽脉冲宽带低频 D.窄脉冲宽带低频 答案:B 您的答案:B 题目分数:5 此题得分:5.0 批注: 第6题 遇到不同的介质或介质中裂隙或孔隙发育程度不同时, 电磁波的反射系数、衰减系数、以及()是不一样的 A.传播速度 B.旅行时间 C.反射波频率 D.反射波振幅 答案:C 您的答案:D 题目分数:5 此题得分:0.0 批注: 第7题 现阶段,地质雷达探测技术可以检测道路路面以下()米围的空洞、疏松等路基缺陷,确定道路缺陷的位置、大小及埋深 A.4 B.5

基于图像识别的目标跟踪系统(论文)

基于图像识别的目标跟踪系统 周立建1茅正冲2 (江南大学,江苏省无锡市 214122) 摘要:研究了在简单的背景下实现对图像的识别和跟踪。系统以ARM微处理器STM32为主控制器。在分析了驱 动电机和目标环境等因素的基础上,选择摄像头捕捉、采集图像并跟踪目标,通过合适的图像识别算法正确地处 理图像信息、识别目标。通过对水平和垂直驱动电机的控制,实现三维目标跟踪。能够实现系统对目标的大范围, 高精度的自动跟踪。 关键词:图像采集;图像信息处理;目标识别;目标跟踪 Target Tracking Based on Image Recognition System (IOT Engineering School of Jiangnan University,Wuxi Jiangsu Province ,214122) Abstract:Studied in the context of a simple implementation of image recognition and tracking. STM32 ARM microprocessor-based system controller. In the analysis of the drive motor and objectives on the basis of environmental factors, select the camera capture, image acquisition and target tracking, image recognition algorithm by an appropriate image processing information correctly, identify the target.Through horizontal and vertical drive motor control, to achieve three-dimensional tracking. System to achieve the target of large-scale, high-precision automatic tracking. Key words:Image acquisition;Image information processing;Target identification;Target tracking 1引言 图像处理技术的高速发展,相应地促进目标识别和跟踪技术的发展。尤其是在不同的环境下,如何实现目标识别和跟踪的稳定,具有很重要的理论价值和实际意义。 嵌入式平台集成度高,支持实时多任务操作系统,符合实时性和小型化的要求,同时克服了基于桌面pc机图像处理系统体积庞大,不具有实时特性等不足,可以面对日益复杂的应用。所以基于嵌入式平台的图像处理系统是未来图像处理系统的发展趋势。随着现代高速处理器的迅猛发展,图像处理技术也日益成熟。其中,移动目标的视频检测与跟踪是图像处理、分析应用的一个重要领域,是当前相关领域的研究前沿。移动目标视频检测与跟踪技术在诸多经济和军事领域有很广泛的应用,发挥重要的作用。 在最近二十几年间,随着计算机技术、VLSI技术和高分辨率传感器技术的迅速更新,图像识别方法已经有了更广泛的应用,如工业上的工业过程控制、自主运载器导航等等,尤其是它具有的许多突出的优点:可获得大量的目标信息(为其他形式的跟踪手段所无法相比)、抗电子干扰能力强、测量(角、面)精度高、保密性好、低空跟踪范围大、使用多种传感器(可见光、红外、微光等)、全天候工作能力强等。利用先进的数字图像处理技术去除许多自然及人为的干扰,加上预测等技术配合使用,可以实现记忆跟踪以及对瞬间丢失的目标再捕获。这种方法大量的运用在军事上的火控、导航、特别是制导方面。然而由于这一课题的发展历史较短而且内容又涉及到图像处理、模式识别和人工智能等多个新兴学科,其理论还很不完善,一些重要的问题尚未解决,新的方法和技巧还有待开发。因此进行有关图像目标识别与跟踪的研究无疑是一项既有理论意义又有实用价值的课题。 本文介绍了一种在简单背景下实现对图像目标的捕捉与跟踪。本系统设计应用了以ARM微处理器STM32为主控制器的嵌入式系统,使用OV7670图像处理器,尽可能达到了实时性与可靠性的要求。系统的工作流程如图1:

公路水运继续教育---地质雷达探测技术在路基病害检测中的应用

第1题 由于松散体内部充填不同性状的土体排列无规律,因此松散体内部在雷达图像上表现为杂乱的,随深度的增加,电磁波逐渐 A.强反射波,增大 B.强反射波,衰减 C.弱反射波,增大 D.弱反射波,衰减 答案:B 您的答案:B 题目分数:5 此题得分:5.0 批注: 第2题 空洞内部会形成明显的多次反射波组,形态大致为一倒悬() A.双曲线 B.抛物线 C.折线 D.圆曲线 答案:A 您的答案:A 题目分数:5 此题得分:5.0 批注: 第3题 数据处理的一般流程为: 原始数据的编辑- > 滤波- >设定时间零点- >频谱分析- >()- >属性分析、剖面叠加等- >增益- >速度求取- >高程修正- >剖面输出 A.增益 B.滤波 C.去噪 D.时窗选取 答案:B 您的答案:B 题目分数:5 此题得分:5.0 批注: 第4题 反射系数的大小主要取决于反射界面两侧介质介电常数的差异, 差

异越大反射信号(), 反之反射信号() A.越强,越差 B.越强,越好 C.越弱,越差 D.越弱,越好 答案:A 您的答案:A 题目分数:5 此题得分:5.0 批注: 第5题 地质雷达法是一种采用()电磁波信号检测地下介质分布的方法 A.宽脉冲宽带高频 B.窄脉冲宽带高频 C.宽脉冲宽带低频 D.窄脉冲宽带低频 答案:B 您的答案:B 题目分数:5 此题得分:5.0 批注: 第6题 遇到不同的介质或介质中裂隙或孔隙发育程度不同时, 电磁波的反射系数、衰减系数、以及()是不一样的 A.传播速度 B.旅行时间 C.反射波频率 D.反射波振幅 答案:C 您的答案:C 题目分数:5 此题得分:5.0 批注: 第7题 现阶段,地质雷达探测技术可以检测道路路面以下()米范围内的空洞、疏松等路基缺陷,确定道路缺陷的位置、大小及埋深 A.4 B.5

图像定位及跟踪技术大解析

图像定位及跟踪技术大解析 在科学技术日新月异的今天,人们对机器设备的智能性、自主性要求也越来越高,希望其完全替代人的角色,把人们从繁重、危险的工作任务中解脱出来,而能否像人一样具有感知周围环境的能力已成为设备实现智能化自主化的关键。 广义的“图像跟踪”技术,是指通过某种方式(如图像识别、红外、超声波等)将摄像头中拍摄到的物体进行定位,并指挥摄像头对该物体进行跟踪,让该物体一直被保持在摄像头视野范围内。狭义的“图像跟踪”技术就是我们日常所常谈到的,通过“图像识别”的方式来进行跟踪和拍摄。 因为红外、超声波等方式,都受环境的影响,而且要专门的识别辅助设备,在实际应用中已经逐步被“图像识别”技术所替代。“图像识别”是直接利用了摄像头拍摄到的图像,进行NCAST图像差分及聚类运算,识别到目标物体的位置,并指挥摄像头对该物体进行跟踪。 图像跟踪系统采用特有的NCAST目标外形特征检测方法,被跟踪者无需任何辅助设备,只要进入跟踪区域,系统便可对目标进行锁定跟踪,使摄像机画面以锁定的目标为中心,并控制摄像机进行相应策略的缩放。系统支持多种自定义策略,支持多级特写模式,适应性强,不受强光、声音、电磁等环境影响。 目标物体的边缘检测 物体的形状特征在大多数情况下变化不多,基于目标形状轮廓的跟踪方法与基于区域的匹配方法相比,可以更精确的分割目标。 边缘是运动目标的最基本特征,表现在图像中就是指目标周围图像灰度有阶跃变化或屋顶变化的那些像素集合,它是图像中局部亮度变化最显著的部分。 边缘检测就是采用某种算法来定位灰度不连续变化的位置,从而图像中目标与背景的交界线。图像的灰度变化可以用灰度梯度来表示。

Canny边缘检测与轮廓提取

摘要...................................................................................I Abstract ..............................................................................II 1 绪论 (1) 2 设计内容与OpenCV简介 (2) 2.1 设计任务内容 (2) 2.2 OpenCV简介 (2) 3 理论分析 (3) 3.1 边缘检测 (3) 3.1.1 图像的边缘 (3) 3.1.2 边缘检测的基本步骤 (3) 3.2 轮廓提取 (4) 4 边缘检测的算法比较 (5) 4.1 Reborts算子 (5) 4.2 Sobel算子 (5) 4.3 Prewitt 算子 (6) 4.4 Kirsch 算子 (7) 4.5 LOG算子 (7) 4.6 Canny算子 (8) 5 实验仿真 (10) 5.1算法设计 (10) 5.2 实验结果 (11) 6 分析与总结 (12) 参考文献 (13) 附录 (14)

边缘检测是图像处理和计算机视觉中的基本问题,它的目的是标识出数字图像中亮度变化明显的点。图像经过边沿检测处理之后,不仅大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。 事实上,边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置。这些轮廓常常是我们在图像边缘检测时,所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。 可用于图像边缘检测和轮廓提取的方法有很多,其中包括有常见的Robert边缘算子、Prewitt 边缘算子、Sobel边缘算子等等。本文首先将会从数字图像处理的角度,对几种边缘检测算法进行详细的分析,然后会并选择其中一种边缘检测算法进行实验。考虑到以后进一步的学习,本文将会使用openCV对算法进行实现。最后,本文将会把实验获得的实际效果,与理论分析的结果进行比对,并以此对本次实验进行总结。 关键字:边缘检测轮廓提取图像处理openCV

地质雷达探测技术说明C.doc

减免税进口仪器、设备说明 今有中国地质大学(北京)地球物理与信息技术学院进口Scintrex公司CG-5型重力仪一套。 一、仪器主要部分 1.灵敏系统:主要部件由一个矩形石英框架支撑着,用一个支杆固定在密封器顶盖上。灵敏系统的位移方式属角位移。 2.测量系统:由测读装置、测程调节装置及纵、横水准器等组成,测量出弹簧长度变化后经过电子系统转化成电流的大小,从而数字化将测量值显示到主机显示屏上。 二、仪器性能 相比较其他传统金属弹簧重力仪而言Scintrex公司生产的CG-5型重力仪不容易产生掉格现象从而保证了更高的测量精度和稳定性: (一)石英材料的滞后作用比金属材料小。对于悬挂承重的石英弹簧来说,一旦去掉承重,弹簧就会精确地恢复原状,而一个金属弹簧则会保持一定的记忆。Scintrex所制造的石英传感器是整体铸造,包括石英弹簧及其悬挂连接点是一个整体结构,它的滞后作用比类似的金属部件要小许多。

(二)传感器的所有联结点,象悬挂弹簧的支点和石英弹簧本身焊成一个整体。相反,金属弹簧重力仪的各种功能部件都是通过机械连接装配在一起的。所以整体熔凝的石英传感器不会出现部件之间的滑移或内部变形。这是使石英传感器不易产生掉格的又一个重要原因,也使它很少出现测试数据混乱的现象。 (三)石英弹簧比金属弹簧具有比较大的温度系数,并且石英弹簧传感器是垂直悬挂式弹簧,对于相同的重力值,它的弹簧伸长比金属弹簧重力仪中的金属弹簧小。三、仪器工作原理 Scintrex公司CG-5型重力仪采用无静电熔凝石英材料做为传感器,是基于一种垂直悬挂式石英弹簧,弹簧末端的重锤上悬挂一根测量弹簧。当作用在重锤上的重力发生变化时,可以伸缩测量弹簧,使摆杆改变原来的静平衡位置。这样通过测量弹簧的伸缩量来测定重力的变化。重力变化同弹簧的伸缩量成线性关系,从而勘探地表重力场变化的先进仪器。 通过测定地表各点上的重力加速度的值,对地下介质和地质体的分布做出推断。 四、仪器技术参数 传感器类型:无静电熔凝石英 测量范围:8000mGal,不用重置 自动修正:潮汐、仪器倾斜、温度、噪声、地震噪声 尺寸:30cmX21cmX22cm 重量(含电池):8kg 电池容量:2X6Ah(10.78V) 袖珍锂电池 功耗:25°C时4.5W 工作温度:-40~+45°C 环境温度修正:通常0.2microGal/°C 大气压力修正:通常0.15microGal/kPa 磁场修正:通常1microGal/Gauss(微伽/高斯) 五、仪器在教学中的应用 该仪器是我院“地球物理学”专业和“地球探测与信息技术”专业勘探地质构造、

相关文档
最新文档