1

я написал реализацию Гильберта-пеановского кривой заполнения пространства в Python (от Matlab один), чтобы сгладить мой 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 

Тем не менее, классическая Кривая Гильберта-Пеано работает только для многомерного массива, форма которого имеет силу двух (например: 256 * 256 или 512 * 512 в случае 2D-массива (изображение)).

Кто-нибудь знает, как расширить это до массива произвольного размера?

ответ

0

я, наконец, выбрать, как это было предложено Betterdev, как адаптивные кривые не то, что straigthforward [1], чтобы вычислить большую кривую, а затем избавиться от координат, которые находятся вне моей формы изображения:

# compute the needed order 
order = np.max(np.ceil([np.log2(M), np.log2(N)])) 
# Hilbert curve to scan a 2^order * 2^order image 
x, y = hilbert_peano(order) 
mat = np.zeros((2**order, 2**order)) 
# curve as a 2D array 
mat[x, y] = np.arange(0, x.size, dtype=np.uint) 
# clip the curve to the image shape 
mat = mat[:M, :N] 
# compute new indices (from 0 to M*N) 
I = np.argsort(mat.flat) 
x_new, y_new = np.meshgrid(np.arange(0, N, dtype=np.uint), np.arange(0, M, dtype=np.uint)) 
# apply the new order to the grid 
x_new = x_new.flat[I] 
y_new = y_new.flat[I] 

[1] Zhang J., Камата С. и Ueshige Y., "псевдо-Гильберта Scan Алгоритм Произвольно размера Rectangle области"

1

Я нашел эту страницу по Lutz Tautenhahn:

«Нарисовать заполняющей пространство кривой произвольного размера» (http://lutanho.net/pic2html/draw_sfc.html)

алгоритм не имеет имя, он не ссылается на кого-либо еще и набросок предполагает, что он сам придумал это.

Интересно, возможно ли это для кривой z-порядка и как?

[1] Draw A Space-Filling Curve of Arbitrary Size

+0

вы пробовали его реализации? – floflo29

+0

Хотя его истинная классическая кривая гильберта основана на мощности 2, так как это фрактал, вы можете также игнорировать за небольшую плату. Но чтобы ответить на ваш вопрос. № – Bytemain

+0

Как бы вы изменили исходную кривую, чтобы избавиться от мощности 2 гипотезы? – floflo29