Python中的图像渐变矢量场

问题描述 投票:9回答:1

我试图使用Python(类似于Gradient Vector Field)获取图像的this matlab question

这是原始图片:

这是我的代码:

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的结果有问题?

python image image-processing numpy gradient
1个回答
7
投票

我认为你的奇怪结果至少部分是因为p是uint8类型。即使numpy diff也会导致此dtype数组的值明显不正确。如果通过用以下代码替换p的定义来转换为有符号整数:p = np.asarray(I).astype(int8)则diff的结果是正确的。以下代码给了我一个合理的字段,

import numpy as np
import matplotlib.pyplot as plt
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()

这给出了以下内容:

并关闭这看起来像你期望的,

© www.soinside.com 2019 - 2024. All rights reserved.