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)
其中 img
是 uint8
数据类型。现在,如果您直接在第一轴上的图像的第一通道上计算梯度:
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
。
我尝试在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)
其中 img
是 uint8
数据类型。现在,如果您直接在第一轴上的图像的第一通道上计算梯度:
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
。