Python-sobelx导数

Python-sobelx导数,python,numpy,Python,Numpy,通过这里的帮助,我找到了一个函数,它似乎将索贝尔导数应用于X方向的图像F(X,y)=F(X+1,y)-F(X,y) 我不能使用任何OpenCV函数,我需要2D输出数组比2D输入数组短1列 但是,我不明白为什么它仍然不返回短1列的输出数组。有人能指出问题和/或告诉我这是否在正确的轨道上吗?多谢 output = input[:-1,:] r,c = input.shape for i in range(0, r - 1): output[i] = np.abs(input[i+1] -

通过这里的帮助,我找到了一个函数,它似乎将索贝尔导数应用于X方向的图像
F(X,y)=F(X+1,y)-F(X,y)
我不能使用任何OpenCV函数,我需要2D输出数组比2D输入数组短1列

但是,我不明白为什么它仍然不返回短1列的输出数组。有人能指出问题和/或告诉我这是否在正确的轨道上吗?多谢

output = input[:-1,:]

r,c = input.shape

for i in range(0, r - 1):
    output[i] = np.abs(input[i+1] - input[i])

return output

我不确定您是否打算这样创建输出数组。您正在将输出创建为对输入子数组的引用,因此,如果您修改输入,也会修改输出,反之亦然。见:

也就是说,运行您提供的
input=np.ones([5,5])
,并在返回后打印output.shape,我会得到
(4,5)
,这似乎是您想要的?

您可以使用numpy的diff()函数。看

以及一段代码片段来说明其用法:

import numpy as np
a = np.ones([5, 4])
b = np.diff(a, axis=1)
结果b是一个(5,3)满零的数组

如果要保持循环,可以执行以下操作:

r,c = input.shape
output = np.zeros([r-1, c])

for i in range(0, r - 1):
    output[i] = np.abs(input[i+1] - input[i])

print output
编辑:“数学”x对应于第二个轴(垂直),y对应于第一个轴(水平)。因此,要获得F(x+1,y)-F(x,y),必须执行以下操作:

r,c = input.shape
output = np.zeros([r, c -1])

for j in range(0, c - 1):
    output[:, j] = np.abs(input[:, j+1] - input[:, j])

print output

我将向数组分配添加副本。是的,当我自己运行它时,它给了我我想要的
.size
,但是当我对它运行这个单元测试时,它声称大小不等于-1
self.assertEqual(type(test\u output),type(self.testInput))self.assertEqual(test\u output.shape[0],self.testInput.shape[0])self.assertEqual(test_output.shape[1],self.testInput.shape[1]-1)
M.Massias,我感谢您的帮助,但我现在需要坚持这个简单的循环。@yodish在您的单元测试中,[1]个形状应该相等(列数相同),[0]个形状必须相距1(输出少1行),对吗?你不是在断言。马西亚斯,谢谢,我会尽快尝试,希望a能解决这个问题。我还需要创建一个函数,在Y方向上应用索贝尔导数
F(x,Y)=F(x,Y+1)-F(x,Y)
,(减去行)你可能不知道如何循环并执行此操作,是吗?M.Massias,我需要创建两个函数(我已经布置好了),并且我已经得到了两个单元测试。我想我可能换了。是的,我想你换了。您希望保持相同的列数,但您并没有断言这一点。