python区域增长算法_区域增长算法

本文作者作为编程初学者,探讨如何在Python中实现区域增长算法,特别是在Drawbot环境中。提出了随机行走、扫描模式和4/8连通邻域三种可能的解决方案,但分别存在效率、遗漏形状和实现复杂性等问题。作者寻求建议并提及对迷宫生成算法的研究,但不确定其适用性。
摘要由CSDN通过智能技术生成

嘿大家好。我真的很难搞清楚这个逻辑,希望你能帮我。在我继续之前,我只想告诉你,我是业余程序员,也是一个初学者,没有任何形式的正式计算机科学培训,所以请容忍我。:D另外,我使用的是Python,但我可以使用Java或类似的工具。

不管怎样,我希望实现一个地区的增长,在一个初步的Drawbot使用。

这里有一篇关于区域增长的文章:http://en.wikipedia.org/wiki/Region_growing

按照我的设想,绘图所基于的图像将满足以下条件:在任意颜色深度下,图像大小最多为3x3英寸

图像将是白色背景上的黑色连续形状

形状可以位于背景上的任何位置。

我已经考虑过这个问题的下列解决办法。虽然有些工作在一定程度上,但它们在性能或可行性上都有一些相当大的缺陷(至少在我看来是不可行的)。此外,由于这是一个Drawbot,这需要用一条连续的线来完成。但这并不意味着我不能回溯,它只是消除了多个起点(种子)的可能性。

考虑的方法:

随机行走:

我的第一直觉是用随机行走来解决这个问题。我想,实现这一点的随机行走程序应该是这样的:

伪python。。。Cells To Visit = Number of Black Cells

Cells Visited = 0

MarkColor = red

While Cells Visited < Cells To Visit:

if currentcell is black:

Mark Current Cell As Visited #change pixel to red

Cells Visited +=1

neighbors = Get_Adjacent_Cells() #returns cells either black or red

next cell = random.choose(neighbors)

currentCell = next cell

虽然我认为这是可行的,但在我看来,这是非常无效的,并不能保证良好的结果,但为了实际完成一些事情,我可能最终尝试这个。。。我在伪代码中的逻辑是不是还模模糊糊地正确?

扫描模式:

在我看来,这个方法是最容易实现的。我的想法是我可以在形状的一个极端选择一个起点(例如,最左下点)。从那里开始,它会向右移动,只在x轴上移动,直到它碰到一个白色像素。从这里开始,它将在y轴上向上移动一个像素,然后在x轴上向左移动,直到达到一个白色像素。如果正上方的像素碰巧是白色,则在x轴上回溯,直到在其上方找到一个黑色像素。

经进一步检验,这种方法有一些主要缺点。

当面对这样的形状时:

RKUVj.png

结果如下:

KyuKy.png

即使我告诉它过一段时间后开始清扫,中腿仍然会被忽略。

4/8连通邻域:

在我看来,这种方法是最强大和最有效的,但在这一点上,我无法完全搞清楚,我也无法考虑如何在不可能留下一些被忽视的领域的情况下实现它

在每一个单元中,我都会查看相邻的黑单元,设计一些方法来排列我应该首先访问哪个单元,访问所有的黑单元,然后重复这个过程,直到所有的单元都被覆盖。

我在这里看到的问题首先是处理实现这一点所必需的数据结构,而且仅仅是找出其背后的逻辑。

这些是我能想到的最好的解决办法。谢谢你花时间读这篇文章,我意识到它很长,但我想我应该尽可能地把它说清楚。任何和所有的建议将非常感谢。。。谢谢!

编辑:

我也研究了迷宫生成和求解算法,但不知道如何在这里实现。我对迷宫求解算法的理解是,它们依赖于迷宫通道的宽度相等。我当然可能错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值