gpt4 book ai didi

python - Python 中的图像梯度矢量场

转载 作者:太空狗 更新时间:2023-10-29 20:24:08 35 4
gpt4 key购买 nike

我正在尝试获取 Gradient Vector Field使用 Python 处理图像(类似于 this matlab question )。

这是原图: http:/ /dcc.fceia.unr.edu.ar/~rbaravalle/gradient/test.png

这是我的代码:

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()

这是结果: http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/result.png

问题是向量似乎不正确。当您放大图像时,这一点会变得更加清晰:

http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/result2.png

为什么一些向量如预期的那样指向中心,而另一些则没有?

可能调用np.gradient的结果有问题?

最佳答案

我认为你的奇怪结果至少部分是因为 p 是 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()

这给出了以下内容:

Solution

然后像您期望的那样关闭它,

enter image description here

关于python - Python 中的图像梯度矢量场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30079740/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com