matlab freeman链码,对Freeman链码分析的角点检测算法

article/2025/10/3 7:07:14

图像中的角点是图像的重要特征, 具有旋转不变性, 决定了图像形状, 可以降低图像信息的存储效率, 在目标跟踪, 目标检测, 图像匹配, 图像轮廓拟合等领域都有重要的应用价值. 近几十年来, 国内外学者提出的图像角点检测算法[, 各有各的优缺点, 大致可分为三大类: 基于灰度强度的角点检测、基于模型的角点检测、基于边缘轮廓的角点检测[. 基于灰度强度的方法是通过图像的一阶或二阶导数查找, 经典算法代表有Harris算法[, Harris算法通过微分运算和自相关矩阵来检测角点, 稳定性高, 但是高斯平滑函数的窗口可控性差, 定位精度较差[.基于模型的方法是通过将一小块图像与预定义的模型相匹配来查找角点, SUSAN算法[就是这类角点检测的代表, SUSAN通过一个圆形模板实现角点检测, 通过模板中所有与圆心点像素相似的点组成的区域大小判断角点, 该算法不对图像求导, 精度较好, 具有一定的抗噪性, 但是相似函数计算较复杂, 且需要人工设定阈值[. 基于边缘轮廓的方法主要是通过分析图像边缘形状来检测角点的, 包括五个步骤[: 边缘提取和选择、曲线平滑、曲率估计、检测角点和角点跟踪筛选出最终的角点. 近年来, 基于边缘轮廓方法吸引了广泛的关注, 许多此类优秀的角点检测算法被提出[. 1998年Mokhtarian等人提出的著名CSS角点检测算法[, 利用Canny边缘检测算子提取图像边缘, 从边缘中提取边缘轮廓, 并填充边缘轮廓缺口, 在大尺度下得到轮廓曲率极大值点, 通过阈值选定候选角点, 大尺度到小尺度下对候选角点重新定位, 比较T-角点与曲率极大值检测的角点, 剔除相距相近的点, 该算法获得良好的角点检测效果. 但CSS有两个主要的问题[, 一是曲率估计对对轮廓局部变化和噪声较为敏感, 二是很难选择合适的高斯尺度平滑边缘轮廓. 在CSS基础上, 通过考虑检测中局部曲率, He和Yung[提出了一种使用自适应曲率阈值和动态支撑区域的检测器. 随后Awrangjeb和Lu利用点到弦的距离累加技术提出了一种稳健的角点检测算法——CPDA[, CPDA具有较高的可重复性和较低的定位误差. 之后又提出了CPDA的快速算法[. 但CPDA有一个缺点是估计拐角的曲率值与角度可能不成正比[. 还有一些角点检测算法, 利用Freeman链码多边形近似方法查找角点, 两边的交点判定为角点[, 文献[

本文在文献[

1 Freeman链码生成

1.1 图像预处理

本文图像在预处理方面与文献[[检测边缘, Canny算法抑制了多响应边缘, 提高边缘的定位精度, 具有一定的抗噪能力. Canny算法检测边缘的步骤如

图 1

Fig. 1

cb47d0563fae1c411936d7f26ac4cff3.png

图 1 Canny边缘检测步骤

1.2 Freeman链码

链码是通过带有给定方向的单位长度的线段序列来描述轮廓的边界, 链码的表示方法有基于4-邻接和8-邻接[, 如[产生轮廓的链码, 4-邻接检测边界只需要搜索4个方向, 8-邻接则需要搜索8个方向, 我们实验所用图都是点阵图, 当轮廓是一条直线时, 4-邻接链码要比8-邻接链码要快捷的多; 当轮廓是一条斜边时, 用4-邻接链码只能搜索上下左右4个方向, 表示轮廓时会丢失大量的边缘信息, 而8-邻接链码正好与像素点的实际情况相符, 能够准确地描述中心像素点与其邻接点的信息, 能较好地保留轮廓边缘信息. 因为任意一个像素周围均有8个邻接点, 因此本文算法采用的是8-邻接链码.

图 2

Fig. 2

b3be3f0971e16bafd90913acc3392875.png

图 2 链码示意图

一条轮廓曲线Freeman链码可以定义为:

${\left\{ {{a_{i - 1}} \to {a_i}} \right\}^n}$, 其中

${a_i} \in \left\{ {0,1,2,3,4,5,6,7} \right\}$, n表示轮廓点集数. 如

1.3 轮廓跟踪得到Freeman链码

基于八邻域边界跟踪可以得到轮廓的Freeman链码, 轮廓跟踪[方法如算法1.

算法1. 轮廓跟踪生成Freeman链码算法.

1) 分轮廓搜索, 找到图像最左上角的一个边界轮廓点P0作为搜索起点, 并以链码值dir=0为最开始搜索方向;

2) 按八邻域的逆时针方向搜索起点的下一个点, 每搜索一次链码值方向逆时针旋转45°, 即dir+1; 如果搜索到新的边界点Pi, 将该链码值赋值给它前一个点即点Pi–1的方向, 再以此点为八邻域的中心点, 链码值方向顺时针旋转90°, 即dir–2作为该点的开始搜索方向, 继续搜索;

3) 重复2)搜索方法, 当搜索到起始点P0时, 整个轮廓搜索完毕.

通过上述轮廓跟踪算法就得到了边缘轮廓的Freeman链码, 我们假定逆时针为正方向, 分轮廓将轮廓点坐标和链码值存储, 存储FMP格式有如下的定义:

struct FMP

{

int x; //点的图像x坐标

int y; //点的图像y坐标

int a; //下一个点的方向

}

2 对Freeman链码方向分析进行角点


http://chatgpt.dhexx.cn/article/rpeRRWAU.shtml

相关文章

Fabric链码升级

一、修改链码,上传 二、打包链码 1、设置组织1环境变量 export PATH${PWD}/../bin:$PATH export FABRIC_CFG_PATH$PWD/../config/ # Environment variables for Org1 export CORE_PEER_TLS_ENABLEDtrue export CORE_PEER_LOCALMSPID"Org1MSP" export C…

图像特征-链码(Freeman code)

目录 引言链码编程实现轮廓提取链码计算 总结 引言 本文介绍了图像的形状特征–链码,以及通过python和opencv实现的链码提取方法。所有opencv的版本为3.4.2,已经移除了直接返回链码的选项。 链码 链码用于描述图像的形状特征,首先需要获得图像…

Java知识扫盲——向上转型(类向上转型、接口向上转型)以及向上转型的优势、灵活运用

目录 普通类示例 抽象类的向上转型, 接口向上转型: 作用:使用向上转型可以,提高代码的简洁性、灵活性、适用性。 普通类示例 父类: package 普通类向上转型;public class Father {public int age 48;public void…

java 向上转换_java的向上转型总结

在《think of java》中对向上转型有着如下的描述 看完之后很蒙圈,所以自己在网上找了一些描述,并自己做了简单的总结 简单的例子 class A{ public void A1(){ System.out.println("父类方法1"); } public void A2(){ System.out.println("…

JAVA中多态以及向上转型向下转型、重写的讲解

重写 重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变。 重写的好处在于子类可以根据需要&#x…

JAVA中的向上转型和向下转型

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点: 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方…

java转型 内存_Java向上转型及内存分析

学习设计模式的时候,发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。 概念 先从几个基本概念开始: 1. Java中的引用类型(reference type) Java中的数据类型分…

java向上转型_Java向上转型和向下转型

一、向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量, 基本的实现语法: 父类类型变量new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调用子类覆写了父类的方法,但是为什么不调用Worker的say()方法呢?原…

C++ 向上转型

在 C 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java 对象向上转型_JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话:“父类…

java 向上转型_Java 转型问题(向上转型和向下转型)

Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象? 从 2 个名词开始说起:向上转型(upcasting) 、向下转型(downcasting)。 举个例子:有2个类,Father 是父类&a…

java向上转型_Java向上转型

向上类型转换: 1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。 2.父类引用变量无法调用子类新增成员变量和新增成员方法。 举个例子 public classAnimal { public voidsleep() { System.out.println("Animal sleep"); } public voidjump(…

向上转型与向下转型(超详细)

本文利用代码例子解释向上转型与向下转型,文末有举例整合原代码。 首先,我们要知道:转型发生在继承后,也就是父类子类存在的前提下。其次,我们要清楚:向下转型的前提是已经发生了向上转型,向下转…

java向上转型

我们知道按照现有类的类型来创建新类的方式为继承。 换句话说 “新类是现有类的一种类型” 因为继承可以确保父类中所有的方法在子类中也同样有效,所以能够向父类发送的所有信息也同样可以向子类发送。 这儿有一个例子: public class Test {public sta…

类中的向上转型与向下转型详解

我们的类与类之间会存在继承关系,子类继承父类,一个父类可以有多个子类,例如Animal类就可以有Cat子类,Dog子类,等等。那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况。 一、向上转型 1、Animal a…

【基础知识】向上转型和向下转型

向上转型和向下转型的利弊 一、向上转型 好处:隐藏了子类型,提高了代码的扩展性。 坏处:只能使用父类的功能,不能使用子类特有功能,功能被限定。 使用场景:不需要面对子类型,通过提高扩展性&am…

Java向上转型的作用(有详细代码介绍)

今天看到一道Java的练习题,题目如下 当时对于主函数中 Car car (Car) new Benz(); 不是很理解,也并不知道有什么意义,因为如果仅仅写Car car new Benz(); 程序运行结果是一样的。 在经过阅读书籍和查看别的博主写的关于向上向下转型的…

MATLAB三维数组转为二维数组(时间序列分析中很有用)

在MATLAB中三维数组转二维的方法 一、写该程序的初衷 在处理时间序列遥感数据的时候,我之前的做法是: 将时间序列数据读取为三维矩阵;将该数据保存为BIP格式;在每个像元上进行循环,取出其第三维(比如有46…

Matlab一维数组及其应用

目录 1.一维数组 2.与一维数组相关的函数 3.一维数组在二维绘图中的应用 4.在已存在的图形上添加新图形 5.在一个图形窗口中绘制多个子图 6.一维数组在一元多项式运算中的应用 1.一维数组 数值数组(简称为数组)是Matlab中最重要的一种内建数据类型。数组运算是Matlab软件…

matlab 二维数组声明,Matlab字符串函数及二维数组

Matlab字符串函数及二维数组 发布时间:2017年07月28日 评论数:抢沙发 阅读数:833 strcmp(Str1,Str2),finder(S,s),strcat(S1,S2),disp(str)>> str1 str1 I am a man >> str2 str2 Iamaboy >> strcmp(str1,str2) %比较str1和str2 相同…