简介
图像中所包含的信息主要体现在区域的边界上,边界的确定对图像的分析与理解非常重要。边界跟踪 ( boundary tracking)属于图像分割技术的范畴 ,是图像工程中一种非常重要的技术 ,受到人们广泛的重视和研究 ,并在实际中得到大量的应用。1
原理基于边缘的分割常用方法之一,用于区域已分出(二值或已标注),但边界未知的情况。
具体算法如下:
1. 从左上方开始搜索图像直至找到一个新区域的像素p0,该点为该域所有像素中具有最小行、最小列的像素;dir:移动方向,初值为:
dir-0=3 (4领域;-90°);dir-0=7 (8领域;-45°)
2. 按照逆时针顺序搜索当前像素的3*3领域,,计算dir
(a)4领域: (dir-k+3)mod4
(b)8领域: (dir-k+7)mod8 (dir-k为偶数)
(dir-k+6)mod 8 (dir-k为奇数)
3. 找到的第一个与当前相同的像素就是一个新的内边界元素pn,更新dir;
4. 若pn=p1且pn-1=p0 stop,内边界为p0……pn-2;否则重复2
四邻域与八邻域四邻域定义
对于一个像素A,Q是给定像素P的4个邻域,如果P和Q共享边界。
在一个黑像素集合,如果在P中每个像素对pi 和pj ,P是4连通分量,且存在像素序列pi…pj。
序列中所有像素在集合P中,都是黑色,且
在4邻域中,每两个像素都是相邻的。2八邻域和四邻域定义差不多。
8-邻域边界跟踪算法的实现
利用点的八邻域信息,选择下一个点作为边界点,这个算法需要选择一个开始点,可以选择图像上是目标点,在最上,最左的点。然后查看它的八邻域的点,从右下方45°的位置开始寻找,如果是目标点,将沿顺时针90°作为下一次寻找的方向,如果不是,则逆时针45°继续寻找,一旦找到重复上面的过程。
voidVessDibTrack(HDIB hdib,vector& pt) //八邻域
{
unsignedchar *lpSrc;
LPSTRlpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hdib);
int cxDIB= (int) ::DIBWidth(lpDIB); // Size of DIB - x
int cyDIB= (int) ::DIBHeight(lpDIB); // Size of DIB - y
LPSTRlpDIBBits=::FindDIBBits (lpDIB);
longlLineBytes = WIDTHBYTES(cxDIB * 8); // 计算图像每行的字节数
//寻找开始点,最右,最下
//先行,后列
int i,j;
POINTstartPt,currPt;
for (i =0;i
{
for (j =0;j
{
lpSrc =(unsigned char*)lpDIBBits + lLineBytes * (cyDIB -1 - i) + j; if (*lpSrc==0) //是黑点
{
startPt.x= i;
startPt.y= j;
//停止条件
i =cyDIB;
j = cxDIB;
}