scipy.ndimage.

affine_transform#

scipy.ndimage.affine_transform(input, matrix, offset=0.0, output_shape=None, output=None, order=3, mode='constant', cval=0.0, prefilter=True)[Quelle]#

Wendet eine affine Transformation an.

Gegeben einen Ausgabe-Pixelindexvektor o, wird der Pixelwert aus dem Eingabebild an der Position np.dot(matrix, o) + offset bestimmt.

Dies führt ein „Ziehen“ (oder „rückwärtsgerichtetes“) Resampling durch, bei dem der Ausgaberaum in die Eingabe transformiert wird, um Daten zu lokalisieren. Affine Transformationen werden oft in der „Schub“- (oder „vorwärtsgerichteten“) Richtung beschrieben, bei der die Eingabe in die Ausgabe transformiert wird. Wenn Sie eine Matrix für die „Schub“-Transformation haben, verwenden Sie deren Inverse (numpy.linalg.inv) in dieser Funktion.

Parameter:
inputarray_like

Das Eingabearray.

matrixndarray

Die inverse Koordinatentransformationsmatrix, die Ausgabekoordinaten in Eingabekoordinaten abbildet. Wenn ndim die Anzahl der Dimensionen von input ist, muss die gegebene Matrix eine der folgenden Formen haben:

  • (ndim, ndim): die lineare Transformationsmatrix für jede Ausgabekoordinate.

  • (ndim,): es wird angenommen, dass die 2-D-Transformationsmatrix diagonal ist und die Diagonale durch den gegebenen Wert spezifiziert wird. Ein effizienterer Algorithmus wird dann verwendet, der die Trennbarkeit des Problems ausnutzt.

  • (ndim + 1, ndim + 1): es wird angenommen, dass die Transformation mittels homogener Koordinaten spezifiziert ist [1]. In diesem Fall wird jeder Wert, der an offset übergeben wird, ignoriert.

  • (ndim, ndim + 1): wie oben, aber die unterste Zeile einer homogenen Transformationsmatrix ist immer [0, 0, ..., 1] und kann weggelassen werden.

offsetfloat oder Sequenz, optional

Der Offset in das Array, auf das die Transformation angewendet wird. Wenn es sich um einen Float handelt, ist offset für jede Achse gleich. Wenn es sich um eine Sequenz handelt, sollte offset einen Wert für jede Achse enthalten.

output_shapeTupel von ints, optional

Formtupel.

outputarray oder dtype, optional

Das Array, in das die Ausgabe platziert werden soll, oder der Datentyp des zurückgegebenen Arrays. Standardmäßig wird ein Array mit demselben Datentyp wie input erstellt.

orderint, optional

Die Ordnung der Spline-Interpolation, Standard ist 3. Die Ordnung muss im Bereich 0-5 liegen.

mode{‘reflect’, ‘grid-mirror’, ‘constant’, ‘grid-constant’, ‘nearest’, ‘mirror’, ‘grid-wrap’, ‘wrap’}, optional

Der Parameter mode bestimmt, wie das Eingabearray über seine Grenzen hinaus erweitert wird. Standard ist ‘constant’. Das Verhalten für jeden gültigen Wert ist wie folgt (weitere Plots und Details zu Randmodi)

‘reflect’ (d c b a | a b c d | d c b a)

Die Eingabe wird erweitert, indem über den Rand des letzten Pixels gespiegelt wird. Dieser Modus wird auch manchmal als halb-Sample-symmetrisch bezeichnet.

‘grid-mirror’

Dies ist ein Synonym für ‘reflect’.

‘constant’ (k k k k | a b c d | k k k k)

Die Eingabe wird erweitert, indem alle Werte außerhalb des Rands mit demselben konstanten Wert gefüllt werden, der durch den Parameter cval definiert ist. Außerhalb der Grenzen der Eingabe wird keine Interpolation durchgeführt.

‘grid-constant’ (k k k k | a b c d | k k k k)

Die Eingabe wird erweitert, indem alle Werte außerhalb des Rands mit demselben konstanten Wert gefüllt werden, der durch den Parameter cval definiert ist. Die Interpolation erfolgt auch für Abtastpunkte außerhalb des Umfangs der Eingabe.

‘nearest’ (a a a a | a b c d | d d d d)

Die Eingabe wird erweitert, indem das letzte Pixel wiederholt wird.

‘mirror’ (d c b | a b c d | c b a)

Die Eingabe wird erweitert, indem über die Mitte des letzten Pixels gespiegelt wird. Dieser Modus wird auch manchmal als ganz-Sample-symmetrisch bezeichnet.

‘grid-wrap’ (a b c d | a b c d | a b c d)

Die Eingabe wird erweitert, indem zum gegenüberliegenden Rand umgebrochen wird.

‘wrap’ (d b c d | a b c d | b c a b)

Die Eingabe wird durch Umwickeln zum gegenüberliegenden Rand erweitert, jedoch so, dass der letzte und der erste Punkt genau übereinanderliegen. In diesem Fall ist nicht eindeutig definiert, welcher Abtastpunkt am Überlappungspunkt gewählt wird.

cvalskalar, optional

Wert, mit dem die Ränder der Eingabe gefüllt werden, wenn mode ‘constant’ ist. Standard ist 0.0.

prefilterbool, optional

Bestimmt, ob das Eingabearray vor der Interpolation mit spline_filter vorfiltert wird. Der Standardwert ist True, was ein temporäres float64-Array mit gefilterten Werten erstellt, wenn order > 1. Wenn dieser Wert auf False gesetzt wird, wird die Ausgabe leicht unscharf, wenn order > 1, es sei denn, die Eingabe wird vorfiltert, d.h. sie ist das Ergebnis des Aufrufs von spline_filter auf die ursprüngliche Eingabe.

Rückgabe:
affine_transformndarray

Die transformierte Eingabe.

Hinweise

Die gegebene Matrix und der Offset werden verwendet, um für jeden Punkt in der Ausgabe die entsprechenden Koordinaten in der Eingabe durch eine affine Transformation zu finden. Der Wert der Eingabe an diesen Koordinaten wird durch Spline-Interpolation der angeforderten Ordnung bestimmt. Punkte außerhalb der Grenzen der Eingabe werden entsprechend dem gegebenen Modus gefüllt.

Geändert in Version 0.18.0: Zuvor hing die genaue Interpretation der affinen Transformation davon ab, ob die Matrix als 1-D- oder 2-D-Array übergeben wurde. Wenn ein 1-D-Array an den Matrixparameter übergeben wurde, wurde der Pixelwert der Ausgabe am Index o aus dem Eingabebild an der Position matrix * (o + offset) bestimmt.

Für komplexwertige input transformiert diese Funktion die reellen und imaginären Komponenten unabhängig voneinander.

Hinzugefügt in Version 1.6.0: Unterstützung für komplexe Werte hinzugefügt.

Referenzen

Beispiele

Verwenden Sie affine_transform, um ein Bild zu dehnen

>>> from scipy.ndimage import affine_transform
>>> from scipy.datasets import face
>>> from matplotlib import pyplot as plt
>>> import numpy as np
>>> im = face(gray=True)
>>> matrix = (0.5, 2)
>>> im2 = affine_transform(im, matrix)
>>> plt.imshow(im2)
>>> plt.show()
../../_images/scipy-ndimage-affine_transform-1_00_00.png

Bild um 90 Grad drehen und auf eine erweiterte Leinwand projizieren

>>> matrix = ((0, 1), (1, 0))
>>> im3 = affine_transform(im, matrix, output_shape=(1024, 1024))
>>> plt.imshow(im3)
>>> plt.show()
../../_images/scipy-ndimage-affine_transform-1_01_00.png

Rotation verschieben, damit das Bild zentriert ist

>>> output_shape = (1200, 1200)
>>> offset = (np.array(im.shape) - output_shape) / 2
>>> im4 = affine_transform(im, matrix, offset=offset, output_shape=output_shape)
>>> plt.imshow(im4)
>>> plt.show()
../../_images/scipy-ndimage-affine_transform-1_02_00.png