freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码

       最近在做一些关于图像的东西,在用边界跟踪提取图像的边界之后要用链码编码之后才能进行下一步处理,所以查资料学习了一下标题里面提到的东西。在这里就不说这些东西的背景了,主要是通俗地解释一下这些东西的原理。

      在解释这些链码之前,首先解释一下一些需要了解的基础知识

4连通和8连通

       在计算机图形学里面,像素是数字图像的基本元素。一张图是由有限个像素点组成的。大家平时经常在网上看到的1080*1920的图其实就是指这张图每一列有1080个像素点,每一行有1920个像素点,整张图一共由1080*1920个像素点构成。根据中心像素点的邻接方向个数的不同,可以分为4连通和8连通(还有其他的情况,不过这里就只介绍4连通和8连通)。从中心像素点正右边开始,逆时针定义方向数,具体如下图:

freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码_第1张图片

     假如我们从图片里面提取了一个物体的轮廓如下图,红色的像素点代表我们编码的起始点。接下来以下图来讲解一下标题上的几种链码。

freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码_第2张图片

freeman链码

      在边界曲线上选取一点作为起点,记录起点的坐标,然后按照顺时针的方向,以8连通的方式从编码为1的方向(45度)开始搜索下一个边界像素点。找到之后记录方向编码,然后从找到的像素点开始重复以上步骤,得出一组链码,这个就是freeman链码。如果是闭合的边界,则编码完成后回到起点,可以省去起点坐标。上图的freeman码是(1,1)21176644或者211766444。

       关于搜索下一个边界像素点的要从哪一个方向开始,我查资料的时候看到不同的人有不同的做法,个人感觉自己定一套规则就好,往后的其他边界都按这套规则编码就没问题。

归一化链码

      对于闭合的边界,无论我们平移它,得到的链码都是一样的。但是如果选取的起点不同,那么得到的链码也会有所不同。这时候我们就要将它归一化。原理就是把我们得到的链码看成是一个自然数,将链码循环写下去,选取构成的自然数最小的那组链码。这个就是归一化链码。上图的链码循环:211766444211766444211766444……归一化链码为117664442。

一阶差分链码

       归一化链码解决了因为起点坐标不同而编码不同的问题,但仍有不足。如果我们将边界旋转,那么它的归一化链码也会发生变化。如下图

freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码_第3张图片

链码为666001334(按未旋转前链码编码的顺序),归一化链码为001334666,可看出旋转后链码编码发生了改变,那么当然归一化链码也会改变。

这时候我们就可以用一阶差分链码。原理就是计算相邻两个元素方向变化(按逆时针方向)的次数。例如

5→5变化了0步,记为0,4→6变化了两步,记为2。这样就可以得到一阶差分链码。根据归链码计算,上图旋转前后的一阶差分链码都为706706006。

freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码_第4张图片freeman链码,归一化链码,一阶差分链码,归一化一阶差分链码_第5张图片

归一化一阶差分链码

    其实就是对一阶差分链码进行归一化处理,得出的链码具有平移不变性和旋转不变性。上图的归一化一阶差分链码为006706706。


你可能感兴趣的:(图像处理)