Grassfire算法:

一、概念

这个算法是做图像处理的抽骨架处理,目的是求出图像的骨架,可以想象一片与物体形状相同的草,沿其外围各点同时点火。当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中轴。

一个与细化有关的运算是抽骨架,也称为中轴变换(Medialaxis transform)或焚烧草地技术(grass-fire technigue)。中轴是所有与物体在两个或更多非邻接边界点处相切的圆心的轨迹。但抽骨架很少通过在物体内拟合圆来实现。
    概念上,中轴可设想成按如下方式形成。想象一片与物体形状相同的草,沿其外围各点同时点火。当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中轴。
      抽骨架的实现与细化相似,可采用一个两步有条件腐蚀实现,但是删除像素的规则略有不同。
    下图将细化与抽骨架进行比较。二者的主要的差别在于抽骨架在拐角处延伸到了边界,而由细化得到的骨架却没有。
上面图a是细化的效果,下面的图b是抽骨架的效果。
(左边是处理一个均匀的矩形区域,右边是处理一个均匀的圆形区域)

二、简单运算实现:(加强理解)

我们的目标是:找到start-end之间的最短路径。

如图所示。刷过leetcode的朋友看见这张应该会会心一笑,BFS,DFS这类词争先恐后往外跳。但是呢,太高级了,我的朋友们。让我们先用一种最文艺(傻气)的办法,来解决这个问题。

Grassfire 算法。小时候,大家都背过一首诗:离离原上草,一岁一枯荣。 野火烧不尽,春风吹又生。说的就是这种算法。这首诗告诉我们,草,都是从旁边的草开始燃烧蔓延的!grassfire-烧草,就这么简单又有力。

1.首先把终点的距离设定为0,然后设定距离终点最近的格子距离为1。如图所示

2.然后,距离1最近的格子是2,距离2最近的格子是3,以此类推

3.好了,这时候每一个数字都代表这该单元格到终点的距离。我们把数字连起来,就形成了最短路径,注意了,这个路径很可能不是唯一解。

整个过程用伪代码表示就是:

For each node n in the graph
2  ·n.distance=Infinity
Create an empty list.
goal.distance=0,add goal to list.
While list not empty
6  ·Let current=first node in list,remove current from list
7  ·For each node,n that is adjacent to current
8    ·If n.distance=Infinity
9      ·n.distance=current.distance+1
10      ·add n to the back of the list

但是有些时候,我们会遇见走不通的情况,我们写代码的时候就要考虑好这个问题

三、实现过程:
1.如果start-end之间有路,找到最短路径
2.如果start-dend之间没有路,跳出循环,报错

下面谈谈这个算法计算复杂度的问题,这个算法是一种遍历搜索,火会席卷每一个角落。

计算复杂度为:O(|V|)

其中,V是图中格子的数量。我们假设我们有100个格子,要访问的格子数
2维棋盘:100 X100 = 1000
3维棋盘: 100X100X100 = 1000000
6维棋盘: 100X100X100X100X100X100 =1000000000000

1000000000000啊朋友们,什么概念,就差不多和天上的星星一样多了哇!grassfire的计算量随着格子的变多或者维度的上升而变得很大。

好啦,总的来说这是一个很简单的算法,一定能找到全局最优解。

参考:1)运动规划(Motion planning)- Grassfire 算法——https://www.jianshu.com/p/e22acfc75731?from=timeline

2)grassfire算法——https://www.iteye.com/blog/benworld-1920217

Grassfire算法- 运动规划(Motion planning)的更多相关文章

  1. 运动规划 (Motion Planning): MoveIt! 与 OMPL

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...

  2. 运动规划 (Motion Planning): MoveIt! 与 OMPL---44

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...

  3. 运动规划(Motion Planning)

    相关介绍: https://mp.weixin.qq.com/s?__biz=MzA5MDE2MjQ0OQ==&mid=2652786406&idx=1&sn=f937dd6a ...

  4. MoveIt运动规划-1

    按照帮助文档Setup Assistant Tutorial中的描述,用moveit_setup_assistant图形界面一步步配置机器人,最后生成机器人的配置文件保存到指定的文件夹中. 以UR5机 ...

  5. 【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一

    参考资料及致谢 本文的绝大部分内容转载自以下几篇文章,首先向原作者致谢,希望自己能在这些前辈们的基础上能有所总结提升. 1. 运动规划/路径规划/轨迹规划的联系与区别 https://blog.csd ...

  6. 如何用MoveIt快速搭建机器人运动规划平台?

    MoveIt = RobotGo,翻译成中文就是“机器人,走你!”所以,MoveIt的主要就是一款致力于让机器人能够自主运动及其相关技术的软件,它的所有模块都是围绕着运动规划的实现而设计的. 两个月前 ...

  7. 泡泡一分钟:Automatic Parameter Tuning of Motion Planning Algorithms

    Automatic Parameter Tuning of Motion Planning Algorithms 运动规划算法的自动参数整定 Jos´e Cano, Yiming Yang, Brun ...

  8. 泡泡一分钟:Motion Planning for a Small Aerobatic Fixed-Wing Unmanned Aerial Vehicle

    Motion Planning for a Small Aerobatic Fixed-Wing Unmanned Aerial Vehicle Joshua Levin, Aditya Paranj ...

  9. 泡泡一分钟:Learning Motion Planning Policies in Uncertain Environments through Repeated Task Executions

    张宁  Learning Motion Planning Policies in Uncertain Environments through Repeated Task Executions 通过重 ...

随机推荐

  1. thymeleaf中switch case多出一个空行

    以下是<thymeleaf3.0.5中文参考手册.pdf>中的代码,官方代码没有具体去查询. <div th:switch="${user.role}"> ...

  2. Python3之类和实例

    面向对象的重要概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如学生类Student,而实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,单各自的数据可能 ...

  3. MongoDB 谨防索引seek的效率问题(转)

    目录 背景 初步分析 索引seeks的原因 优化思路 小结 声明:本文同步发表于 MongoDB 中文社区,传送门:http://www.mongoing.com/archives/27310 背景 ...

  4. web-自动化测试流程

    1. 自动化测试流程 (1) 需求分析 (2) 挑选适合做自动化测试的功能 (3) 设计测试用例 (4) 搭建自动化测试环境 [可选] (5) 设计自动化测试项目的架构 [可选] (6) 编写代码 ( ...

  5. talend工具整理文件并出力文件到Excel当中

    问题描述: 每天都会生成一定的txt文件,txt文件当中含有复数个个人的信息,把每个个人信息都抽出来之后放到Excel文件的一览里面. 解决思路: 1.txt文件里面的信息有多件,每一件生成一个临时的 ...

  6. layui监听radio点击事件

    layui.form.on('radio(layui_dataType)', function(data){ console.log(data.elem); //得到radio原始DOM对象 cons ...

  7. Java面试 - == 和 equals 的区别?

    ==:如果比较的对象是基本数据类型,则比较的是数值是否一致:如果比较的是引用数据类型,则比较的是对象的地址值是否一致. equals():equals()方法不能用于比较基本数据类型的对象,如果对象和 ...

  8. 封装Json+日志

    /** * 输出json * @param $msg * @param int $errno */ public function printOutError($msg = '操作失败', $errn ...

  9. 解决 pycharm [Errno 11001] getaddrinfo failed 错误提示!

    我看网上很多问题对这个问题的解决方法也是一只半解的,可能产生问题的原因不一样吧,今天我说下我的经验 解决办法: 原因就是你的本地dns解析的host文件,里面的的解析地址被注释了! 打开本地的hous ...

  10. python day1 (afternoon)购物清单

    购物清单 #顾客给出余额 #给出商品清单 #顾客挑选商品 #给出购物清单 代码: #!/usr/bin/env python#-*- coding:utf-8 -*- salary = int(inp ...