distance_transform_cdt#
- scipy.ndimage.distance_transform_cdt(input, metric='chessboard', return_distances=True, return_indices=False, distances=None, indices=None)[Quelle]#
Distanztransformation für Chamfer-artige Transformationen.
Diese Funktion berechnet die Distanztransformation des input, indem jedes Vordergrundelement (nicht-Null) durch seine kürzeste Distanz zum Hintergrund (jedes Null-wertige Element) ersetzt wird.
Zusätzlich zur Distanztransformation kann die Merkmals-Transformation berechnet werden. In diesem Fall wird der Index des nächstgelegenen Hintergrundelements zu jedem Vordergrundelement in einem separaten Array zurückgegeben.
- Parameter:
- inputarray_like
Eingabe. Werte von 0 werden als Hintergrund behandelt.
- metric{‘chessboard’, ‘taxicab’} oder array_like, optional
Das metric bestimmt die Art des Chamferings. Wenn das metric gleich ‘taxicab’ ist, wird eine Struktur mithilfe von
generate_binary_structuremit einer quadrierten Distanz von 1 generiert. Wenn das metric gleich ‘chessboard’ ist, wird ein metric mithilfe vongenerate_binary_structuremit einer quadrierten Distanz gleich der Dimensionalität des Arrays generiert. Diese Auswahl entspricht den gängigen Interpretationen der Distanzmetriken ‘taxicab’ und ‘chessboard’ in zwei Dimensionen. Ein benutzerdefiniertes Metrik kann in Form einer Matrix bereitgestellt werden, wobei jede Dimension eine Länge von drei hat. ‘cityblock’ und ‘manhattan’ sind ebenfalls gültig und werden auf ‘taxicab’ abgebildet. Der Standardwert ist ‘chessboard’.- return_distancesbool, optional
Ob die Distanztransformation berechnet werden soll. Standard ist True.
- return_indicesbool, optional
Ob die Merkmals-Transformation berechnet werden soll. Standard ist False.
- distancesint32 ndarray, optional
Ein Ausgabe-Array zum Speichern der berechneten Distanztransformation anstelle ihrer Rückgabe. return_distances muss True sein. Es muss die gleiche Form wie input haben.
- indicesint32 ndarray, optional
Ein Ausgabe-Array zum Speichern der berechneten Merkmals-Transformation anstelle ihrer Rückgabe. return_indicies muss True sein. Seine Form muss
(input.ndim,) + input.shapesein.
- Rückgabe:
- distancesint32 ndarray, optional
Die berechnete Distanztransformation. Wird nur zurückgegeben, wenn return_distances True ist und distances nicht angegeben wurde. Sie hat die gleiche Form wie das Eingabe-Array.
- indicesint32 ndarray, optional
Die berechnete Merkmals-Transformation. Sie hat ein Array von der Form der Eingabe für jede Dimension der Eingabe. Siehe Dokumentation von distance_transform_edt für ein Beispiel. Wird nur zurückgegeben, wenn return_indices True ist und indices nicht angegeben wurde.
Siehe auch
distance_transform_edtSchnelle Distanztransformation für die euklidische Metrik
distance_transform_bfDistanztransformation für verschiedene Metriken mithilfe eines langsameren Brute-Force-Algorithmus
Beispiele
Importieren Sie die notwendigen Module.
>>> import numpy as np >>> from scipy.ndimage import distance_transform_cdt >>> import matplotlib.pyplot as plt >>> from mpl_toolkits.axes_grid1 import ImageGrid
Erstellen Sie zuerst ein Spiel-Binärbild.
>>> def add_circle(center_x, center_y, radius, image, fillvalue=1): ... # fill circular area with 1 ... xx, yy = np.mgrid[:image.shape[0], :image.shape[1]] ... circle = (xx - center_x) ** 2 + (yy - center_y) ** 2 ... circle_shape = np.sqrt(circle) < radius ... image[circle_shape] = fillvalue ... return image >>> image = np.zeros((100, 100), dtype=np.uint8) >>> image[35:65, 20:80] = 1 >>> image = add_circle(28, 65, 10, image) >>> image = add_circle(37, 30, 10, image) >>> image = add_circle(70, 45, 20, image) >>> image = add_circle(45, 80, 10, image)
Richten Sie als Nächstes die Figur ein.
>>> fig = plt.figure(figsize=(5, 15)) >>> grid = ImageGrid(fig, 111, nrows_ncols=(3, 1), axes_pad=(0.5, 0.3), ... label_mode="1", share_all=True, ... cbar_location="right", cbar_mode="each", ... cbar_size="7%", cbar_pad="2%") >>> for ax in grid: ... ax.axis('off') >>> top, middle, bottom = grid >>> colorbar_ticks = [0, 10, 20]
Das obere Bild enthält das ursprüngliche Binärbild.
>>> binary_image = top.imshow(image, cmap='gray') >>> cbar_binary_image = top.cax.colorbar(binary_image) >>> cbar_binary_image.set_ticks([0, 1]) >>> top.set_title("Binary image: foreground in white")
Das mittlere Bild enthält die Distanztransformation unter Verwendung der
taxicab-Metrik.>>> distance_taxicab = distance_transform_cdt(image, metric="taxicab") >>> taxicab_transform = middle.imshow(distance_taxicab, cmap='gray') >>> cbar_taxicab = middle.cax.colorbar(taxicab_transform) >>> cbar_taxicab.set_ticks(colorbar_ticks) >>> middle.set_title("Taxicab metric")
Das untere Bild enthält die Distanztransformation unter Verwendung der
chessboard-Metrik.>>> distance_chessboard = distance_transform_cdt(image, ... metric="chessboard") >>> chessboard_transform = bottom.imshow(distance_chessboard, cmap='gray') >>> cbar_chessboard = bottom.cax.colorbar(chessboard_transform) >>> cbar_chessboard.set_ticks(colorbar_ticks) >>> bottom.set_title("Chessboard metric") >>> plt.tight_layout() >>> plt.show()