C# 用希尔伯特曲线分析图像

C# 用希尔伯特曲线分析图像,c#,graphics,C#,Graphics,我想使用希尔伯特曲线的路径访问图像的每个像素。我发现了Hilbert cuve的递归实现,但我不知道如何将其应用于图像。 拥有宽度和高度相等的图片是否重要?否,但请确保曲线是自适应的或大于图像。自适应曲线非常复杂。这里有一个算法,可以为非方形阵列生成类似希尔伯特的曲线 其思想是递归地应用类似希尔伯特的模板,但在将域维度减半时避免奇数大小。如果维度恰好是2的幂,则生成经典的希尔伯特曲线 def gilbert2d(x, y, ax, ay, bx, by): """ General

我想使用希尔伯特曲线的路径访问图像的每个像素。我发现了Hilbert cuve的递归实现,但我不知道如何将其应用于图像。
拥有宽度和高度相等的图片是否重要?

否,但请确保曲线是自适应的或大于图像。自适应曲线非常复杂。

这里有一个算法,可以为非方形阵列生成类似希尔伯特的曲线

其思想是递归地应用类似希尔伯特的模板,但在将域维度减半时避免奇数大小。如果维度恰好是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))

更多信息、示例等,请参见此处:

@user234780:自适应曲线非常复杂。试试大一点的曲线。好吧,我会试试大一点的,但我仍然不知道如何设置希尔伯特曲线的大小。我链接的算法使用深度值来设置递归的深度。我还需要一个设置大小的值,例如:500 x 500px。@user234780:将坐标转换为二进制并交错。这容易多了。如果你不想尝试灰色代码,它可以帮助你找到它。你也可以用一张桌子试试蛮力。搜索nick hilbert空间索引四叉树。L-systems只是高兴而已。@user234780:您提到的链接和深度值意味着在每个深度处,曲线都要大4倍。所以它的力量是2。@ USSRES48080:如果我的答案是有用的,考虑接受或投票。谢谢!