Die anderen Antworten funktionieren für Fließkommazahlen, berechnen aber nicht korrekt den Abstand für Integer-D-Typen, bei denen es zu Über- und Unterläufen kommt. Beachten Sie, dass auch scipy.distance.euclidean
hat dieses Problem:
>>> a1 = np.array([1], dtype='uint8')
>>> a2 = np.array([2], dtype='uint8')
>>> a1 - a2
array([255], dtype=uint8)
>>> np.linalg.norm(a1 - a2)
255.0
>>> from scipy.spatial import distance
>>> distance.euclidean(a1, a2)
255.0
Dies ist üblich, da viele Bildbibliotheken ein Bild als ndarray mit dtype="uint8" darstellen. Das heißt, wenn Sie ein Graustufenbild haben, das aus sehr dunkelgrauen Pixeln besteht (sagen wir, alle Pixel haben die Farbe #000001
) und Sie diffundieren es gegen ein schwarzes Bild ( #000000
), kann es zu folgenden Ergebnissen kommen x-y
bestehend aus 255
in allen Zellen, was sich dadurch bemerkbar macht, dass die beiden Bilder sehr weit voneinander entfernt sind. Für Integer-Typen ohne Vorzeichen (z. B. uint8) können Sie den Abstand in Numpy sicher wie folgt berechnen:
np.linalg.norm(np.maximum(x, y) - np.minimum(x, y))
Bei vorzeichenbehafteten Integer-Typen können Sie zunächst in eine Fließkommazahl umwandeln:
np.linalg.norm(x.astype("float") - y.astype("float"))
Speziell für Bilddaten können Sie die Norm-Methode von opencv verwenden:
import cv2
cv2.norm(x, y, cv2.NORM_L2)