链码

更新时间:2022-09-23 09:26

链码(又称为freeman码)是用曲线起始点的坐标和边界点方向代码来描述曲线或边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。

简介

常用的链码按照中心像素点邻接方向个数的不同,分为4连通链码和8连通链码。4连通链码的邻接点有4个,分别在中心点的上、下、左和右。8连通链码比4连通链码增加了4个斜方向,因为任意一个像素周围均有8个邻接点,而8连通链码正好与像素点的实际情况相符,能够准确地描述中心像素点与其邻接点的信息。因此,8连通链码的使用相对较多。

定义

按照水平垂直和两条对角线方向,可以为相邻的两个像素点定义4个方向符:0、1、2、3,分别表示0度、90度、180度和270度四个方向。同样,也可以定义8个方向符:0、1、2、3、4、5、6、7。链码就是用线段的起点加上由这几个方向符所构成的一组数列,通常称之为Freeman链码。用Freeman链码表示曲线时需要曲线的起点,对8链码而言,奇数码和偶数码的对应线段长度不等,规定偶数码单位长度为1,奇数码的单位长度为。

分类

1、原链码

边界(曲线)起点S开始,按顺时针方向观察每一线段走向,并用相应的指向符表示,结果就形成表示该边界(曲线)的数码序列,称为原链码。

2、归一化链码

原链码具有平移不变性(平移时不改变指向符),但当改变起点S时,会得到不同的链码表示,即不具备唯一性。为此可引入归一化链码,其方法是:对于闭合边界,任选一起点S得到原链码,将链码看作由各方向数构成的n位自然数,将该码按一个方向循环,使其构成的n位自然数最小,此时就形成起点唯一的链码,称为归一化链码,也称为规格化链码。

给定一个从任意点开始得到的链码,把它看作一个由各方向数构成的自然数。将这些方向数依一个方向循环,以使它们所构成的自然数的值最小。我们将这样转换后所对应的链码起点作为这个边界的归—化链码的起点。

MATLAB应用

用链码后,对象只要用起点坐标周长(边界点数)、链码、对象编号,就可以描述。链码一般用于一幅图像中有多个对象的情况,对单个对象不适用。

Matlab图像处理工具箱中,提供了专门的bwlabel( )函数,对二值图像的进行连通分支标记(非链码)。其调用格式如下:L = bwlabel(BW,n)。该函数返回一个和输入的二值图像BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、n(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域还是8连通寻找,如果参数省略,则默认为8。

8连通边界的链码生成程序:

function out=chaincode8(image)

%功能:实现8连通链码

%输入: 二值图像

%输出:链码的结果

n=[0 1;-1 1;-1 0;-1 -1;0 -1;1 -1;1 0;1 1];

%设置标志

flag=1;

%初始输出的链码串为空

cc=[];

%找到起始点

[x y]=find(image==1);

x=min(x);

imx=image(x,:);

y=min(find(imx==1));

first=[x y];

dir=7;

while flag==1

tt=zeros(1,8);

newdir=mod(dir+7-mod(dir,2),8);

for i=0:7

j=mod(newdir+i,8)+1;

tt(i+1)=image(x+n(j,1),y+n(j,2));

end

d=min(find(tt==1));

dir=mod(newdir+d-1,8);

%找到下一个像素点的方向码后补充在链码的后面

cc=[cc,dir];

x=x+n(dir+1,1);y=y+n(dir+1,2);

%判别链码的结束标志

if x==first(1)&&y==first(2)

flag=0;

end

end

out=cc;

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}