表示并解决给定图像的迷宫

2023-11-24

给定图像表示和解决迷宫的最佳方法是什么?

The cover image of The Scope Issue 134

给定一张 JPEG 图像(如上所示),读取它、将其解析为某种数据结构并解决迷宫的最佳方法是什么?我的第一直觉是逐像素读取图像并将其存储在布尔值列表(数组)中:True对于白色像素,以及False对于非白色像素(可以丢弃颜色)。这种方法的问题是图像可能不是“像素完美”。我的意思只是说,如果墙上某处有白色像素,它可能会创建一条意外的路径。

另一种方法(经过一番思考后想到)是将图像转换为 SVG 文件 - 这是在画布上绘制的路径列表。这样,路径可以读入相同类型的列表(布尔值),其中True表示路径或墙壁,False表示可行驶的空间。如果转换不是 100% 准确,并且没有完全连接所有墙壁,从而产生间隙,则此方法会出现问题。

转换为 SVG 的另一个问题是线条不是“完全”笔直。这导致路径成为三次贝塞尔曲线。使用由整数索引的布尔值列表(数组),曲线将不容易传输,并且必须计算曲线上的所有点,但不会与列表索引完全匹配。

我认为虽然其中一种方法可能有效(尽管可能无效),但考虑到如此大的图像,它们的效率非常低下,并且存在更好的方法。如何最好地(最有效和/或以最小的复杂性)完成此操作?有没有最好的方法?

然后就是迷宫的解决。如果我使用前两种方法中的任何一种,我基本上都会得到一个矩阵。根据这个答案,表示迷宫的一个好方法是使用树,解决它的一个好方法是使用A*算法。如何从图像中创建一棵树?有任何想法吗?

TL;DR
最好的解析方式?变成什么数据结构?所述结构如何帮助/阻碍解决?

UPDATE
我尝试过用 Python 实现 @Mikhail 编写的内容,使用numpy,正如@Thomas 推荐的那样。我觉得这个算法是正确的,但它并没有像希望的那样工作。 (代码如下。)PNG 库是PyPNG.

import png, numpy, Queue, operator, itertools

def is_white(coord, image):
  """ Returns whether (x, y) is approx. a white pixel."""
  a = True
  for i in xrange(3):
    if not a: break
    a = image[coord[1]][coord[0] * 3 + i] > 240
  return a

def bfs(s, e, i, visited):
  """ Perform a breadth-first search. """
  frontier = Queue.Queue()
  while s != e:
    for d in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
      np = tuple(map(operator.add, s, d))
      if is_white(np, i) and np not in visited:
        frontier.put(np)
    visited.append(s)
    s = frontier.get()
  return visited

def main():
  r = png.Reader(filename = "thescope-134.png")
  rows, cols, pixels, meta = r.asDirect()
  assert meta['planes'] == 3 # ensure the file is RGB
  image2d = numpy.vstack(itertools.imap(numpy.uint8, pixels))
  start, end = (402, 985), (398, 27)
  print bfs(start, end, image2d, [])

这是一个解决方案。

  1. 将图像转换为灰度(尚未二进制),调整颜色的权重,使最终的灰度图像大致均匀。您只需在 Photoshop 中的“图像”->“调整”->“黑白”中控制滑块即可完成此操作。
  2. 通过在 Photoshop 中的“图像”->“调整”->“阈值”中设置适当的阈值,将图像转换为二进制。
  3. 确保阈值选择正确。使用 0 容差、点采样、连续、无抗锯齿的魔棒工具。检查选择中断处的边缘不是由错误阈值引入的错误边缘。事实上,这个迷宫的所有内部点从一开始就可以访问。
  4. 在迷宫上添加人工边界,以确保虚拟旅行者不会绕过它:)
  5. 实施广度优先搜索(BFS) 用您最喜欢的语言编写并从头开始运行。我更喜欢MATLAB为了这个任务。正如@Thomas 已经提到的,没有必要搞乱图形的常规表示。您可以直接使用二值化图像。

下面是 BFS 的 MATLAB 代码:

function path = solve_maze(img_file)
  %% Init data
  img = imread(img_file);
  img = rgb2gray(img);
  maze = img > 0;
  start = [985 398];
  finish = [26 399];

  %% Init BFS
  n = numel(maze);
  Q = zeros(n, 2);
  M = zeros([size(maze) 2]);
  front = 0;
  back = 1;

  function push(p, d)
    q = p + d;
    if maze(q(1), q(2)) && M(q(1), q(2), 1) == 0
      front = front + 1;
      Q(front, :) = q;
      M(q(1), q(2), :) = reshape(p, [1 1 2]);
    end
  end

  push(start, [0 0]);

  d = [0 1; 0 -1; 1 0; -1 0];

  %% Run BFS
  while back <= front
    p = Q(back, :);
    back = back + 1;
    for i = 1:4
      push(p, d(i, :));
    end
  end

  %% Extracting path
  path = finish;
  while true
    q = path(end, :);
    p = reshape(M(q(1), q(2), :), 1, 2);
    path(end + 1, :) = p;
    if isequal(p, start) 
      break;
    end
  end
end

它确实非常简单和标准,在实施中应该不会有困难Python管他呢。

答案如下:

Enter image description here

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

表示并解决给定图像的迷宫 的相关文章

  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 将 Python Pandas DataFrame 写入 Word 文档

    我正在努力创建一个使用 Pandas DataFrames 的 Python 生成的报告 目前我正在使用DataFrame to string 方法 但是 这会作为字符串写入文件 有没有办法让我实现这一目标 同时将其保留为表格 以便我可以使
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 查找正在导入哪些 python 模块

    从应用程序中使用的特定包中查找所有 python 模块的简单方法是什么 sys modules是将模块名称映射到模块的字典 您可以检查其键以查看导入的模块 See http docs python org library sys html
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 如何从hdfs读取文件[重复]

    这个问题在这里已经有答案了 我在 project1目录下的hadoop文件系统中有一个文本文件名mr txt 我需要编写 python 代码来读取文本文件的第一行 而不将 mr txt 文件下载到本地 但我无法从 hdfs 打开 mr tx
  • 查找与另一列 Pandas 中的唯一值关联的列中的值的交集

    如果我有一个像这样的数据框 非常小的例子 col1 col2 0 a 1 1 a 2 2 b 1 3 b 2 4 b 4 5 c 1 6 c 2 7 c 3 我想要所有的交集col2当价值观与其独特性相关时col1值 因此在这种情况下 交集
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • 如何用正则表达式替换多个匹配/组?

    通常我们会编写以下内容来替换一场比赛 namesRegex re compile r is life re I replaced namesRegex sub r butter There is no life in the void pr
  • 为什么将模块级代码放入函数中然后调用该函数在Python中速度更快?

    在亚历克斯 马尔泰利的回应中使 Python 脚本面向对象 https stackoverflow com questions 1813117 making a python script object oriented 他提到在 Pyth
  • 在 Matlab 中保存 Kinect 深度图像?

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

    I have a big dataset with information about students And I have to build a graph of dependencies between different value
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • 如何在matplotlib中调整x轴

    I have a graph like this x轴上的数据表示小时 所以我希望x轴设置为0 24 48 72 而不是现在的值 很难看到 0 100 之间的数据 fig1 plt figure ax fig1 add subplot 11
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • Python 2.7 缩进错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to

随机推荐

  • jCarousel - 如何通过自动滚动在悬停时暂停?

    JCarousel 最近发生了变化 2011 年 1 月 它曾经有一种方法可以通过自动滚动实现悬停暂停 在新版本中 我无法解决如何让自动滚动在悬停时停止 我希望滚动在鼠标悬停时停止并在鼠标移出时重新开始 有什么建议么 示例代码在这里 htt
  • HTML 无法更改 Div 的高度

    所以我正在开发井字游戏 但由于某种原因我的 div 不会改变它们的高度 html background color black color white text align center cell border 1px solid whit
  • 在 SQL LIKE 子句中使用 SqlParameter 不起作用

    我有以下代码 const string Sql select distinct name from tblCustomers left outer join tblCustomerInfo on tblCustomers Id tblCus
  • Firebase OrderByKey 的 startAt 和 endAt 给出错误的结果

    我有 3 个带有键的对象 如下所示 它们的格式为 YYYYMMDD 我正在尝试获取一个月的数据 但我没有得到所需的输出 当我这样查询时 var ref db child KPXECP6a1pXaM4gEYe0 ref orderByKey
  • Bootstrap 模态框不显示

    我想测试 Bootstrap 的模式元素并创建了一个小测试页面 但什么也没有出现 我想知道为什么 有什么线索吗 我从引导页面获取了源代码 我的测试页面位于http ronhome no ip org bootstrap modal html
  • Woocommerce,根据运输类别隐藏运输方法

    我试图根据运输类别隐藏除一种运输方法之外的所有运输方法 本质上是在选择属于特定类别的产品时强制使用 FedEx 隔夜方法 我从这段代码 并将其修改如下 add filter woocommerce available shipping me
  • 如何更改Flutter Web应用程序的默认Web服务器IP(127.0.0.1)

    更改flutter web App的默认IP 127 0 0 1 我创建了一个 flutter Web 应用程序 当我运行该 Web 应用程序时 分配的 IP 是 127 0 0 1 但我无法通过 LAN 使用本地 IP 访问同一应用程序
  • 如何纠正 v4.DrawerLayout 中的 NullPointerException? [复制]

    这个问题在这里已经有答案了 我正在尝试实现一个导航抽屉 但由于某些原因我得到了这个空指针异常 我在这上面花了很多时间 但毫无结果 这是我的代码的一部分 我不明白为什么它返回空指针异常 我需要导入任何库吗 提前致谢 package com m
  • Spring data redis - 监听过期事件

    我想使用 KeyExpirationEventMessageListener 监听过期事件 但我找不到示例 有人知道如何使用 Spring boot 1 4 3 和 Spring Data Redis 来做到这一点吗 我目前正在做这个 Je
  • 在 Codename One 项目中本地保存图像

    我已按照此视频中创建相机捕获页面的教程进行操作 http www youtube com watch v nF4eqzVcsic 所以我现在的代码如下所示 protected void onCamera CaptureButtonActio
  • 通过命令提示符执行 PHP5 脚本时是否可以读取 cookie/session 值?

    当我使用命令提示符执行 php 脚本时 我需要从 cookie 或会话中读取一些值 我怎样才能做到这一点 如何从 Windows 命令提示符访问 cookie 或会话值 Cookie 是从用户的网络浏览器发送的 当您从命令行执行 php 脚
  • Python icmp 套接字服务器(不是 tcp\udp)

    我正在尝试用 Python 编写一个可以接收 ICMP 数据包的套接字服务器 这是我的代码 s socket socket socket AF INET socket SOCK RAW socket IPPROTO ICMP host so
  • Spark如何处理大于集群内存的数据

    如果我只有 1 个内存为 25 GB 的执行器 并且它一次只能运行一个任务 那么是否可以处理 转换和操作 1 TB 数据 如果是 那么它将如何读取以及中间数据将存储在哪里 同样对于相同的场景 如果 hadoop 文件有 300 个输入拆分
  • Angular 2 ng-bootstrap Modal:如何将数据传递到入口组件

    我正在尝试将数据发送到自定义模式内容组件 以便我可以从任何其他组件调用它 而不是重复代码 我是 Angular 2 的新手 并且遵循了 ng boostrap 的 组件作为内容 演示以及 Angular 文档中的 组件交互 但尚未找到使其工
  • 在 Angular 2 中动态创建查询参数

    我想实现查询参数可以动态地传递给它 现在我可以动态设置参数的值 但不能设置键 这是我的代码 onItemClick item FilterItem group FilterGroup i number let navigationExtra
  • EF 和存储库模式 - 最终在一个控制器中出现多个 DbContext - 有任何问题(性能、数据完整性)吗?

    我对 ASP NET MVC 3 的大部分了解来自于阅读 Adam Freeman 和 Steven Senderson 所著的 Pro ASP NET MVC 3 Framework 一书 对于我的测试应用程序 我尝试非常严格地遵循他们的
  • 几个 jar 中的 freemarker 模板

    如何配置 freemarker 来搜索多个 jar 中的模板 随着春天
  • 自定义 iPhone 振动强度

    这是一个相关的问题iOS 中有用于自定义振动的 API 吗 我能够创建自定义振动模式 但无法控制强度 这是从 Kevin Cao 的答案中复制的 该答案支持自定义振动模式 NSMutableDictionary dict NSMutable
  • C++ 预处理器条件参数

    请注意C 03 任何 C 11 解决方案都不适合我 但为了获取知识而发布它们 我知道预处理器可以执行以下操作 define FOO 4 if FOO 4 cout lt lt hi lt
  • 表示并解决给定图像的迷宫

    给定图像表示和解决迷宫的最佳方法是什么 给定一张 JPEG 图像 如上所示 读取它 将其解析为某种数据结构并解决迷宫的最佳方法是什么 我的第一直觉是逐像素读取图像并将其存储在布尔值列表 数组 中 True对于白色像素 以及False对于非白