Image Gradient Vector Field in Python Image Gradient Vector Field in Python numpy numpy

Image Gradient Vector Field in Python


I think your strange results are, at least in part, because p is of type uint8. Even numpy diff results in clearly incorrect values for an array of this dtype. If you convert to signed integer by replacing the definition of p with the following: p = np.asarray(I).astype(int8) then the results of diff are correct. The following code gives me what looks like a reasonable field,

import numpy as npimport matplotlib.pyplot as pltfrom PIL import Imagefrom PIL import ImageFilterI = Image.open('./test.png')I = I.filter(ImageFilter.BLUR)p = np.asarray(I).astype('int8')w,h = I.sizex, y = 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.transpose(Image.FLIP_TOP_BOTTOM),                extent=[x.min(), x.max(), y.min(), y.max()])plt.colorbar(im)ax.quiver(x[skip], y[skip], dx[skip].T, dy[skip].T)ax.set(aspect=1, title='Quiver Plot')plt.show()

This gives the following:

Solution

and close up this looks like you'd expect,

enter image description here