shi*_*www 3 geometry feature-extraction computational-geometry
Hilbert空间/平面填充曲线是否有任何扩展,将非正方形表面映射到矢量/线[用于图像映射到矢量]?
我今天自己就是这样做的.我在Lutz Tautenhahn找到了这个页面:
该算法没有名称,他没有引用任何其他人,草图表明他自己想出了它.所以,直到有关于这个主题的更多知识的人出现,我们称之为Tautenhahn曲线?对于2的幂,它变回希尔伯特曲线!
仍然在挖掘凌乱的源代码,不知道Big-O开销会是什么样的结果.
看起来他从上到下尽可能"均匀地"划分空间,所以假设开销不是太大,它可能是你想要做的事情的一个很好的候选者.
编辑:虽然我怀疑你这么多年后会看到这个,但我最近发现了一篇2000年的论文,其他方法在你的具体情况下可能真的有用:
Revital Dafner,Daniel Cohen-Or和Yossi Matias的"基于上下文的空间填充曲线"
这是一种构建空间填充曲线的方法,该曲线对于底层图像数据的变化是"最佳的".
小智 7
我编写了一个算法,可以为 2D 和 3D 中任意大小的矩形生成类希尔伯特曲线。55x31 示例:curve55x31
这个想法是递归地应用类似 Hilbert 的模板,但在将域维度减半时避免奇数大小。如果维度恰好是 2 的幂,则会生成经典的 Hilbert 曲线。
def gilbert2d(x, y, ax, ay, bx, by):
"""
Generalized Hilbert ('gilbert') space-filling curve for arbitrary-sized
2D rectangular grids.
"""
w = abs(ax + ay)
h = abs(bx + by)
(dax, day) = (sgn(ax), sgn(ay)) # unit major direction
(dbx, dby) = (sgn(bx), sgn(by)) # unit orthogonal direction
if h == 1:
# trivial row fill
for i in range(0, w):
print x, y
(x, y) = (x + dax, y + day)
return
if w == 1:
# trivial column fill
for i in range(0, h):
print x, y
(x, y) = (x + dbx, y + dby)
return
(ax2, ay2) = (ax/2, ay/2)
(bx2, by2) = (bx/2, by/2)
w2 = abs(ax2 + ay2)
h2 = abs(bx2 + by2)
if 2*w > 3*h:
if (w2 % 2) and (w > 2):
# prefer even steps
(ax2, ay2) = (ax2 + dax, ay2 + day)
# long case: split in two parts only
gilbert2d(x, y, ax2, ay2, bx, by)
gilbert2d(x+ax2, y+ay2, ax-ax2, ay-ay2, bx, by)
else:
if (h2 % 2) and (h > 2):
# prefer even steps
(bx2, by2) = (bx2 + dbx, by2 + dby)
# standard case: one step up, one long horizontal, one step down
gilbert2d(x, y, bx2, by2, ax2, ay2)
gilbert2d(x+bx2, y+by2, ax, ay, bx-bx2, by-by2)
gilbert2d(x+(ax-dax)+(bx2-dbx), y+(ay-day)+(by2-dby),
-bx2, -by2, -(ax-ax2), -(ay-ay2))
def main():
width = int(sys.argv[1])
height = int(sys.argv[2])
if width >= height:
gilbert2d(0, 0, width, 0, 0, height)
else:
gilbert2d(0, 0, 0, height, width, 0)
Run Code Online (Sandbox Code Playgroud)
https://github.com/jakubcerveny/gilbert提供 3D 版本和更多文档