我可以使用numpy渐变功能与图像

时间:2016-08-07 00:30:09

标签: python numpy

我最近一直试图测试numpy.gradient函数。但是,它的行为对我来说有点奇怪。我已经创建了一个包含随机变量的数组,然后在其上应用了numpy.gradient,但这些值似乎很疯狂且无关紧要。但是当使用numpy.diff时,值是正确的。

因此,在查看了numpy.gradient的文档之后,我发现它在所需的维度上使用距离= 1。

这就是我的意思:

import numpy as np;

a= np.array([10, 15, 13, 24, 15, 36, 17, 28, 39]);
np.gradient(a)
"""
Got this: array([  5. ,   1.5,   4.5,   1. ,   6. ,   1. ,  -4. ,  11. ,  11. ])
"""
np.diff(a)
"""
Got this:  array([  5,  -2,  11,  -9,  21, -19,  11,  11])
"""

我不明白第一个结果的价值是如何产生的。如果默认距离应为1,那么我应该得到与numpy.diff相同的结果。

有人可以解释这里的距离意味着什么。它是相对于数组索引还是数组中的值?如果它取决于值,那么这是否意味着numpy.gradient不能与图像一起使用,因为相邻像素的值没有固定的值差异?

3 个答案:

答案 0 :(得分:3)

# load image
img = np.array([[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
                [21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
                [21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
                [21.0, 20.0, 22.0, 99.0, 18.0, 11.0, 23.0],
                [21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
                [21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
                [21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0]])
print "image =", img

# compute gradient of image
gx, gy = np.gradient(img)
print "gx =", gx
print "gy =", gy

# plotting
plt.close("all")
plt.figure()
plt.suptitle("Image, and it gradient along each axis")
ax = plt.subplot("131")
ax.axis("off")
ax.imshow(img)
ax.set_title("image")

ax = plt.subplot("132")
ax.axis("off")
ax.imshow(gx)
ax.set_title("gx")

ax = plt.subplot("133")
ax.axis("off")
ax.imshow(gy)
ax.set_title("gy")
plt.show()

答案 1 :(得分:0)

内部的中心差异和边界的第一个差异。

15 - 10
13 - 10 / 2
24 - 15 / 2
...
39 - 28

答案 2 :(得分:0)

对于边界点,np.gradient使用公式

f'(x) = [f(x+h)-f(x)]/h(左端点),以及 f'(x) = [f(x)-f(x-h)]/h用于正确的端点。

对于内部点,它使用公式

f'(x) = [f(x+h)-f(x-h)]/2h

第二种方法更准确-O(h ^ 2)vs O(h)。因此,在第二个数据点,np.gradient估计导数为(13-10)/ 2 = 1.5。

我制作了一段解释数学的视频:https://www.youtube.com/watch?v=NvP7iZhXqJQ