NumPy 渐变在图像上的工作方式不同吗?

Is NumPy gradient works differently on images?

我尝试在python中实现梯度函数。我的函数在矩阵上给出了与 NumPy 实现相同的结果,但是当我尝试使用图像时,结果不同。 NumPy 有哪些不同之处?

麻木

我的实现

来源

  def own_gradientX(g):
  img=np.zeros((g.shape[0],g.shape[1]))
  for x in range(g.shape[0]):
    for y in range(g.shape[1]):
      if (x == 0):
        img[x][y] = g[x+1][y] - g[x][y]
      elif (x == g.shape[0]-1):
        img[x][y] = g[x][y] - g[x-1][y]
      else:
        img[x][y]=(g[x+1][y]-g[x-1][y])/2
  return img

由于您未能提供 MWE,我只能猜测您做了这样的事情:

import numpy as np
from PIL import Image
from matplotlib import pyplot as plt

img = Image.open('lena.jpg')
img = np.array(img)

其中 imguint8 数据类型。现在,如果您直接在第一轴上的图像的第一通道上计算梯度:

def own_gradientX(g):
    img=np.zeros((g.shape[0],g.shape[1]))
    for x in range(g.shape[0]):
      for y in range(g.shape[1]):
        if (x == 0):
          img[x][y] = g[x+1][y] - g[x][y]
        elif (x == g.shape[0]-1):
          img[x][y] = g[x][y] - g[x-1][y]
        else:
          img[x][y]=(g[x+1][y]-g[x-1][y])/2
    return img


own_gradient = own_gradientX(img[...,0])
np_gradient_x, np_gradient_y = np.gradient(img[...,0])

np.allclose(own_gradient, np_gradient_x)
>>> False

现在,如果您在计算之前投射到 float64 您的图像:

img = np.array(img).astype(np.float64)

你会得到预期的结果:

np.allclose(own_gradient, np_gradient_x)
>>> True

所以你的实现没有任何问题:)!您只需要在任何计算之前仔细检查输入的 dtype