gpt4 book ai didi

algorithm - Hilbert-Peano 曲线扫描任意大小的图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:47 25 4
gpt4 key购买 nike

我已经用 Python(来自 Matlab 的)编写了 Hilbert-Peano 空间填充曲线的实现来展平我的 2D 图像:

def hilbert_peano(n):
if n<=0:
x=0
y=0
else:
[x0, y0] = hilbert_peano(n-1)
x = (1/2) * np.array([-0.5+y0, -0.5+x0, 0.5+x0, 0.5-y0])
y = (1/2) * np.array([-0.5+x0, 0.5+y0, 0.5+y0, -0.5-y0])

return x,y

但是,经典的 Hilbert-Peano 曲线仅适用于形状为 2 的幂的多维数组(例如:256*256 或 512*512 二维数组(图像))。

有人知道如何将其扩展到任意大小的数组吗?

最佳答案

我遇到了同样的问题,并编写了一个算法,为 2D 和 3D 中任意大小的矩形生成类 Hilbert 曲线。 55x31 示例:curve55x31

这个想法是递归地应用类似 Hilbert 的模板,但在将域维度减半时避免奇数大小。如果维度恰好是2的幂,则生成经典的希尔伯特曲线。

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)

3D 版本和更多文档可在 https://github.com/jakubcerveny/gilbert 获得。

关于algorithm - Hilbert-Peano 曲线扫描任意大小的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38463130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com