Bild Farbverlauf-Vektor-Feld in Python
Ich versuche, das Gradienten-Vektorfeld ein Bild mit Python (ähnlich dieses matlab Frage).
Dies ist das ursprüngliche Bild:
Hier ist mein code:
import numpy as np
import matplotlib.pyplot as plt
import Image
from PIL import ImageFilter
I = Image.open('test.png').transpose(Image.FLIP_TOP_BOTTOM)
I = I.filter(ImageFilter.BLUR)
p = np.asarray(I)
w,h = I.size
y, x = np.mgrid[0:h:500j, 0:w:500j]
dy, dx = np.gradient(p)
skip = (slice(None, None, 3), slice(None, None, 3))
fig, ax = plt.subplots()
im = ax.imshow(I, extent=[x.min(), x.max(), y.min(), y.max()])
ax.quiver(x[skip], y[skip], dx[skip], dy[skip])
ax.set(aspect=1, title='Quiver Plot')
plt.show()
Dies ist das Ergebnis:
Das problem ist, dass die Vektoren scheinen falsch zu sein. Dieser Punkt wird klarer, wenn Sie Heranzoomen des Bildes:
Warum einige der Vektoren Punkt, um das Zentrum als erwartet, während andere dies nicht tun?
Vielleicht gibt es ein Problem mit dem Ergebnis des Aufrufs np.gradient
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, deine seltsame Ergebnisse sind, zumindest teilweise, weil p vom Typ
uint8
. Sogar numpy diff führt zu deutlich falsche Werte für ein array von diesem dtype. Wenn Sie die Konvertierung zu integer, mit Vorzeichen durch einsetzen der definition vonp
mit den folgenden:p = np.asarray(I).astype(int8)
dann die Ergebnisse von diff korrekt sind. Der folgende code gibt mir, was aussieht wie eine vernünftige Feld,Dieser gibt die folgenden:
und schließen, bis diese aussieht wie man erwarten würde,
.astype('int8')
funktioniert genauso gut. Es ist dieu
(unsigned), das die Schaffung Probleme mit negativen Verläufen (clipping negativen Werten zu positiven Werten)