Sto cercando di ottenere Gradient Vector Field di un'immagine usando Python (simile a this matlab question).Sfumatura immagine Campo vettoriale in Python
Questa è l'immagine originale:
Ecco il mio codice:
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()
Questo è il risultato:
Il problema è che i vettori sembrano non essere corretto. Questo punto diventa più chiaro quando si ingrandisce l'immagine:
Perché alcuni dei vettori puntano verso il centro come previsto, mentre altri non lo fanno?
Forse c'è un problema con il risultato della chiamata a np.gradient
?
Grande cattura, '.astype ('int8')' funziona altrettanto bene. È il 'u' (non firmato) che sta creando problemi con gradienti negativi (tagliando valori negativi a valori positivi) – fhdrsdg
È la soluzione, grazie mille! In realtà, ho spostato la chiamata" trasposizione "a im = ax.imshow (I), ieim = ax.imshow (I.transpose (Image.FLIP_TOP_BOTTOM)), e quindi ho ottenuto esattamente lo stesso risultato dell'immagine. Se lo desideri, cambiala in modo che le persone possano utilizzare direttamente il tuo codice. Inoltre, sono d'accordo sul fatto che l'uso di np.int8 sia probabilmente meglio di float. Aggiornamento –
: Una versione "più morbida" può essere ottenuta usando un filtro gaussiano sui gradienti. es .: http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/resultSoft.png I risultati del codice: http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/test3. py –