1

ich eine Implementierung von Hilbert-Peano raumfüllende Kurve in Python geschrieben habe (von Matlab ein) mein 2D-Bild zu glätten:Hilbert-Peano-Kurve Bild beliebiger Größe scannen

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 

jedoch die klassischen Hilbert-Peano-Kurve funktioniert nur für multi-dimensionale Arrays, deren Form eine Zweierpotenz ist (zB: 256 * 256 oder 512 * 512 bei einem 2D-Array (Bild)).

Weiß jemand, wie man das auf ein Array beliebiger Größe ausdehnt?

Antwort

0

ich schließlich wählen, wie Betterdev vorgeschlagen als adaptive Kurven sind nicht so straigthforward [1], eine größere Kurve zu berechnen und dann von Koordinaten loszuwerden, die außerhalb meiner Bildform sind:

# 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., Kamata S. und Ueshige Y., "Ein Pseudo-Hilbert Scan-Algorithmus für Willkürlich-Sized Rectangle Region"

1

fand ich diese Seite von Lutz Tautenhahn:

„Zeichnen Sie eine raumfüllende Kurve beliebiger Größe“ (http://lutanho.net/pic2html/draw_sfc.html)

Der Algorithmus hat keinen Namen, er ist nicht jemand anderes verweisen nicht und die Skizze deutet darauf hin, dass er selbst darauf gekommen ist.

Ich frage mich, ob dies für eine z-Auftragskurve möglich ist und wie?

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

+0

Haben Sie versucht, es zu implementieren? – floflo29

+0

Während es wahr ist, basiert die klassische Hilbert-Kurve auf der Potenz von 2, da es sich um ein Fraktal handelt, das man auch um jeden Preis ignorieren kann. Aber um deine Frage zu beantworten. Nr. – Bytemain

+0

Wie würden Sie die ursprüngliche Kurve modifizieren, um die Potenz der 2 Hypothese loszuwerden? – floflo29

Verwandte Themen