我正在尝试使用Python获取图像的梯度矢量场(类似于此matlab问题)。
这是原始图像:
这是我的代码:
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()
结果如下:
问题在于向量似乎不正确。放大图像时,这一点变得更加清晰:
为什么某些向量按预期指向中心,而其他向量却没有指向中心?
致电的结果可能有问题np.gradient
吗?
我认为您的奇怪结果至少部分是因为p是type uint8
。即使是numpy diff,也明显导致此dtype数组的值不正确。如果通过将的定义替换p
为以下内容来转换为有符号整数:p = np.asarray(I).astype(int8)
那么diff的结果是正确的。以下代码为我提供了一个合理的字段,
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from PIL import ImageFilter
I = Image.open('./test.png')
I = I.filter(ImageFilter.BLUR)
p = np.asarray(I).astype('int8')
w,h = I.size
x, 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()
这给出了以下内容:
并关闭它,就像您期望的那样,
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句