2D Fast Marching Computations

2023-11-16

Fast Marching method 跟 dijkstra 方法类似,只不过dijkstra方法的路径只能沿网格,而Fast Marching method的方法可以沿斜线.
[Level Set Methods and Fast Marching Methods p94-95
这里写图片描述

这里写图片描述
]

这里 u 理解为到达点的时间, Fijk理解为在点 ijk 的流速.
然后就可以跟Boundary Value Formulation对应起来了.

[Level Set Methods and Fast Marching Methods p7
这里写图片描述
]

本例,首先加载一张灰度图片, 将里面像素的值W作为该点的流速F. 然后算到达该点的时间,也就是程序里面的距离D.

matlab部分源代码如下:
example1.m

n = 400;
[M,W] = load_potential_map('road2', n);
%start_point = [16;219];
%end_point = [394;192];
% You can use instead the function
[start_point,end_point] = pick_start_end_point(W);

clear options;
options.nb_iter_max = Inf;
options.end_points = end_point; % stop propagation when end point reached
[D,S] = perform_fast_marching(W, start_point, options);
% nicde color for display
A = convert_distance_color(D);
imageplot({W A}, {'Potential map' 'Distance to starting point'}); 
colormap gray(256);

perform_front_propagation_2d_slow.m

function [D,S,father] = perform_front_propagation_2d_slow(W,start_points,end_points,nb_iter_max,H)

%   [D,S] = perform_front_propagation_2d_slow(W,start_points,end_points,nb_iter_max,H);
%
%   [The mex function is perform_front_propagation_2d]
%
%   'D' is a 2D array containing the value of the distance function to seed.
%   'S' is a 2D array containing the state of each point : 
%       -1 : dead, distance have been computed.
%        0 : open, distance is being computed but not set.
%        1 : far, distance not already computed.
%   'W' is the weight matrix (inverse of the speed).
%   'start_points' is a 2 x num_start_points matrix where k is the number of starting points.
%   'H' is an heuristic (distance that remains to goal). This is a 2D matrix.
%   
%   Copyright (c) 2004 Gabriel Peyr?

data.D = W.*0 + Inf; % action 先把所有点的距离标为Inf
start_ind = sub2ind(size(W), start_points(1,:), start_points(2,:));
data.D( start_ind ) = 0; %将起点的距离设置为0
data.O = start_points; % 将起点加入Open list 
% S=1 : far,  S=0 : open,  S=-1 : close
data.S = ones(size(W));% 将所点的状态设为Far
data.S( start_ind ) = 0; % 将起点的状态设为open(trial)
data.W = W;
data.father = zeros( [size(W),2] );% father维度400*400*2,父节点有两个,因为走斜线

verbose = 1;

if nargin<3
    end_points = [];
end
if nargin<4
    nb_iter_max = round( 1.2*size(W,1)^2 );
end
if nargin<5
    data.H = W.*0;
else
    if isempty(H)
        data.H = W.*0;
    else
        data.H = H;
    end
end

if ~isempty(end_points)
    end_ind = sub2ind(size(W), end_points(1,:), end_points(2,:));
else
    end_ind = [];
end

str = 'Performing Fast Marching algorithm.';
if verbose
    h = waitbar(0,str);
end

i = 0; 
while i<nb_iter_max && ~isempty(data.O) && isempty( find( data.S(end_ind)==-1 ) )
    i = i+1;
    data = perform_fast_marching_step(data);
    if verbose
        waitbar(i/nb_iter_max, h, sprintf('Performing Fast Marching algorithm, iteration %d.', i) );
    end
end

if verbose
    close(h);
end

D = data.D;
S = data.S;
father = data.father;


function data1 = perform_fast_marching_step(data)%有多个起点也是一样的,只需将他们的距离都设为0即可

% perform_fast_marching_step - perform one step in the Fast Marching algorithm
%
%   data1 = perform_fast_marching_step(data);
%
%   Data is a structure that records the state before/after a step 
%   of the FM algorithm.
%
%   Copyright (c) 2004 Gabriel Peyr?

% some constant
kClose = -1;
kOpen = 0;
kFar = 1;

D = data.D; % action, a 2D matrix
O = data.O; % open list
S = data.S; % state, either 'O' or 'C', a 2D matrix
H = data.H; % Heuristic
W = data.W; % weight matrix, a 2D array (speed function)
father = data.father;

[n,p] = size(D);  % size of the grid,   n,p都为400

% step size
h = 1/n;

if isempty(O)%看开集是否为空
    data1 = data;
    return;
end

ind_O = sub2ind(size(D), O(1,:), O(2,:));%获取开集里面的顶点的索引

[m,I] = min( D(ind_O)+H(ind_O) ); %m里面是最小值,I里面是该最小值在被检测矩阵里面的索引
I = I(1);%取第一个索引
% selected vertex
% 取开集中的第I个点的索引
i = O(1,I);
j = O(2,I);
O(:,I) = [];  % pop from open ,将此点从开集中移除
S(i,j) = kClose; % now its close, 将此点加入闭集(known set)中

% its neighbor
% 准备遍历他的右,上,左,下的邻近点
nei = [1,0; 0,1; -1,0; 0,-1 ];

for k = 1:4

    ii = i+nei(k,1);
    jj = j+nei(k,2);

    if ii>0 && jj>0 && ii<=n && jj<=p

        f = [0 0];  % current father

        %%% update the action using Upwind resolution
        P = h/W(ii,jj);
        % neighbors values
        a1 = Inf;
        if ii<n
            a1 = D( ii+1,jj );
            f(1) = sub2ind(size(W), ii+1,jj);
        end
        if ii>1 && D( ii-1,jj )<a1
            a1 = D( ii-1,jj );
            f(1) = sub2ind(size(W), ii-1,jj);
        end
        a2 = Inf;
        if jj<n
            a2 = D( ii,jj+1 );
            f(2) = sub2ind(size(W), ii,jj+1);
        end
        if jj>1 && D( ii,jj-1 )<a2
            a2 = D( ii,jj-1 );
            f(2) = sub2ind(size(W), ii,jj-1);
        end
        if a1>a2    % swap to reorder
            tmp = a1; a1 = a2; a2 = tmp;
            f = f([2 1]);
        end
        % now the equation is   (a-a1)^2+(a-a2)^2 = P^2, with a >= a2 >= a1.
        % 书上95页公式为:(ux^2 + uy^2)^(1/2)=1/Fijk
        % u理解为到达点的时间,Fijk理解为在点ijk处的流速

        % 那么 ux = (a-a1)/(1/400), uy = (a-a2)/(1/400)
        % 所以方程变为:((a-a1)^2/(1/400))^2+((a-a2)^2/(1/400))^2 = (1/Wij)^2
        % 把1/400移到右边,则得P

        if P^2 > (a2-a1)^2%delta 大于0
            delta = 2*P^2-(a2-a1)^2;
            A1 = (a1+a2+sqrt(delta))/2;
        else%否则用dijkstra方法,沿着格子走,公式为:max|ux,uy|=1/Fijk
            % (a-a1) / (1/400) = 1 / Wij
            A1 = a1 + P;
            f(2) = 0;%将第2个父节点设为0
        end

        switch S(ii,jj)
            case kClose%闭集不用更新
                % check if action has change. Should not appen for FM
                if A1<D(ii,jj)
                    % warning('FastMarching:NonMonotone', 'The update is not monotone');
                    % pop from Close and add to Open
                    if 0        % don't reopen close points
                        O(:,end+1) = [ii;jj];
                        S(ii,jj) = kOpen;
                        D(ii,jj) = A1;
                    end
                end
            case kOpen%开集才更新
                % check if action has change.
                if A1<D(ii,jj)
                    D(ii,jj) = A1;
                    father(ii,jj,:) = f;
                end
            case kFar%远集不仅更新,而且加入开集
                if D(ii,jj)~=Inf
                    warning('FastMarching:BadInit', 'Action must be initialized to Inf');  
                end    
                % add to open
                O(:,end+1) = [ii;jj];
                S(ii,jj) = kOpen;
                % action must have change.
                D(ii,jj) = A1;
                father(ii,jj,:) = f;
            otherwise
                error('Unknown state');
        end
    end
end

data1.D = D;
data1.O = O;
data1.S = S;
data1.W = W;
data1.H = H;
data1.father = father;

运行结果:
这里写图片描述

matlab完整源代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2D Fast Marching Computations 的相关文章

  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • 将 Matlab 数组移植到 C/C++

    我正在将 matlab 程序移植到 C C 我有几个问题 但最重要的问题之一是 Matlab 将任何维度的数组都视为相同 假设我们有一个这样的函数 function result f A B C result A 2 B C A B and
  • 将 kinect RGB 和深度值转换为 XYZ 坐标

    我正在寻找一种简单的方法将 kinect RGB 和深度值转换为 XYZ 坐标 使用 MATLAB 我的目标是一个输入为以下内容的函数 每个点的 RGB 和深度值Kinect相机 并输出 每个点的 x y 和 z 值 RGB 深度 RGB
  • 将向量(或弧)绘制到玫瑰图上。 MATLAB

    我有两个数据集 其中详细列出了angles 我正在绘制玫瑰图 angles 0 8481065519 0 0367932161 2 6273740453 n 另一个 从这组角度详细说明方向统计 angle error 0 848106563
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000

随机推荐

  • 经典兔子问题python(头歌教学实践平台)

    第1关 经典兔子问题 递归 任务描述 问题 有一对兔子 从出生后的第三个月起 每个月都生一对兔子 小兔子再长三个月后每个月又生一对兔子 假如兔子都不死 请问每个月的兔子的数量是多少对 本关任务 编写程序求解上面的问题 相关知识 兔子问题的分
  • java——集合框架

    文章目录 接口 实现 类 算法 1 排序算法 2 查找算法 3 拷贝算法 4 填充算法 5 比较算法 6 随机算法 7 迭代器算法 8 交集 并集 差集 9 分割集合 10 数组和集合的互转 集合框架是一个用来代表和操纵集合的统一架构 所有
  • EFSM(事件驱动型有限状态机:Event Finite State Machine)

    一 介绍 EFSM event finite state machine 事件驱动型有限状态机 是一个基于事件驱动的有限状态机 主要应用于嵌入式设备的软件系统中 EFSM的设计原则是 简单 EFSM的使用者只需要关心 当事件到来时 通过EF
  • 手撸算法-最大子数组和-牛客

    描述 给定一个数组arr 返回子数组的最大累加和 例如 arr 1 2 3 5 2 6 1 所有子数组中 3 5 2 6 可以累加出最大的和12 所以返回 题目保证没有全为负数的数据 要求 时间复杂度为O n O n 空间复杂度为O 1 O
  • css如何让块无间隙,CSS 去掉inline-block间隙的几种方法

    最近做移动端页面时 经常会用到inline block元素来布局 但无可避免都会遇到一个问题 就是inline block元素之间的间隙 这些间隙会导致一些布局上的问题 需要把间隙去掉 对于inline block元素及去掉间隙的方法 在这
  • antd中的Cascader级联选择框怎么清空重置React

    项目场景 React项目 使用antd中的Cascader级联选择框 问题描述 通过其他按钮无法重置选择框中的项 原因分析 对应解决办法一和二 1 级联选择框的数据默认是根据options绑定的数组中的value值来进行赋值显示的 可以使用
  • Python中Update()函数的使用

    简介 Python 字典 update 方法用于更新字典中的键 值对 可以修改存在的键对应的值 也可以添加新的键 值对到字典中 语法 d update e 参数说明 将e中键 值对添加到字典d中 e可能是字典 也可能是键 值对序列 详见实例
  • JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五 JVM监控及诊断工具 命令行篇 1 概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题 在用户体验至上的今天 解决好应用软件的性能问题能带来非常大的收益 Java作为最流行的编程语言之一 其应用性能诊断一直受到业界广泛关注
  • 大规模IM在线用户的计算和数据存储方案

    用户模型以及概念 月活量 基本上是总用户量 一个月不活动的用户基本上是死用户 日活量 一天中大于一定活跃时间的用户 峰值用户 一天中用户在线最高峰的用户总量 峰值并发用户 峰值用户可以同时在一秒钟发出一条消息的用户 业务消息的计算模型 当前
  • vue全屏某个dom元素(包括退出全屏、监听)

    vue全屏某个dom元素 包括退出全屏 监听 1 话不多说直接上源码 一 左上角的图标是随着DOM 元素是否全屏而改变的 二 用isFullscreen来监听DOM是否全屏 三 用screenfull toggle element 来使元素
  • C语言中打印函数的调用栈

    include
  • 娜璋初识(一)你的酒窝没有酒,我却醉得像条狗,看程序员如何表白

    这系列文章本不打算在CSDN发布 因为太腻 因为太爱 也担心读者吃不下这口狗粮 但是最近看到 情人节主题征文 活动 我俩也算是CSDN牵出的一段姻缘 索性就将该系列慢慢撰写出来 希望您喜欢 就当是程序猿的爱情周边吧 也算是对CSDN征文活动
  • 用python做一个输入半径值计算圆的面积保留两位小数_五天学会Python基础01(中)...

    语言元素 指令和程序 计算机的硬件系统通常由五大部件构成 包括 运算器 控制器 存储器 输入设备和输出设备 其中 运算器和控制器放在一起就是我们通常所说的中央处理器 它的功能是执行各种运算和控制指令以及处理计算机软件中的数据 我们通常所说的
  • Linux 自带的LED 灯驱动实验

    目录 Linux 内核自带LED 驱动使能 Linux 内核自带LED 驱动简介 LED 灯驱动框架分析 module platform driver 函数简析 gpio led probe 函数简析 设备树节点编写 运行测试 前面我们都是
  • 数学建模算法(基于matlab和python)之 Lagrange插值、Newton插值(1/10)

    实验目的及要求 1 了解多项式插值公式的存在唯一性条件及其余项表达式的推导 2 了解拉格朗日插值多项式的构造 计算及其基函数的特点 牛顿插值多项式的构造与应用 差商 差分的计算及基本性质 实验内容 1 编写Lagrange插值法 Newto
  • ctfshow-web入门——命令执行(2)(web41-web57)

    命令执行 2 web 41 if isset POST c c POST c if preg match 0 9 a z i c 过滤了数字 字母 大小写 还有一些其他符号 未过滤或运算符 和双引号 eval echo c else hig
  • Gof23设计模式之工厂方法模式和抽象工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可
  • Bootstrap3 多个模态对话框无法显示的问题

    今天帮同事调了一个代码 他们的项目最近在用Bootstrap做开发 突然间 他遇到了一个奇怪的问题 如果一个页面中 有多个Modal对话框的话 排列在第一个的对话框 能够正确显示 第二个 只能导致页面出现MASK层 却不能显示Dialog
  • 数据库作业14:第五章: 数据库完整性 习题 + 存储过程

    今有以下两个关系模式 职工 职工号 姓名 年龄 职务 工资 部门号 其中职工号为主码 Worker Wno Wname Wage Wjob Wsalary Wdept 部门 部门号 名称 经理名 电话号 其中部门号为主码 Dept Dno
  • 2D Fast Marching Computations

    Fast Marching method 跟 dijkstra 方法类似 只不过dijkstra方法的路径只能沿网格 而Fast Marching method的方法可以沿斜线 Level Set Methods and Fast Marc