python scipy convolve2d似乎不正确
我的目标是创建和可视化图像(2D)的偏导数。我将用第一个有限中心差分方程来做这个 F对x的偏导数是 df(x,y)/dx=f(x+1,y)-f(x-1,y) 我们可以把它写成一个卷积内核H=[-1,0,1],应该得到相同的结果 通过将图像与内核卷积 dfx=F*H 以下是我的源代码:python scipy convolve2d似乎不正确,python,python-2.7,scipy,convolution,Python,Python 2.7,Scipy,Convolution,我的目标是创建和可视化图像(2D)的偏导数。我将用第一个有限中心差分方程来做这个 F对x的偏导数是 df(x,y)/dx=f(x+1,y)-f(x-1,y) 我们可以把它写成一个卷积内核H=[-1,0,1],应该得到相同的结果 通过将图像与内核卷积 dfx=F*H 以下是我的源代码: from numpy import * from pylab import * from PIL import * from scipy import signal as sg #create artifica
from numpy import *
from pylab import *
from PIL import *
from scipy import signal as sg
#create artifical image with constant positive slope
myImage=zeros((5,5),dtype=float)
for y in range(5):
for x in range(5):
myImage[y,x]=y+x
首先,我从scipy模(短路径)通过卷积2D-函数为x和y创建第一个中心有限差分
现在我使用循环创建相同的
H,W=myImage.shape[0:2]
pdx=zeros((H,W),dtype=float)
for y in range(1,H-1):
for x in range(1,W-1):
pdx.itemset(y,x,im.item(y,x+1)-im.item(y,x-1))
让我们看看结果:
基于卷积2D的pdx核方法
array([[-1., -2., -2., -2., 3.],
[-2., -2., -2., -2., 4.],
[-3., -2., -2., -2., 5.],
[-4., -2., -2., -2., 6.],
[-5., -2., -2., -2., 7.]])
循环有限差分法
array([[ 0., 0., 0., 0., 0.],
[ 0., 2., 2., 2., 0.],
[ 0., 2., 2., 2., 0.],
[ 0., 2., 2., 2., 0.],
[ 0., 0., 0., 0., 0.]])
我对结果感到困惑。为什么内核方法具有负斜率?
为了得到相同的结果,我必须将内核翻转到H=[1,0,-1],但这在数学上是不正确的。
有人能帮我吗 f和g的卷积是f(x’)g(x-x’)对dx’的积分。这样做的效果是内核被翻转。要么使用翻转的内核,要么使用不执行f(x’)g(x+x’)的scipy.ndimage.correlate
,这样内核与输入方向保持一致
有关更多信息,请参阅。有关有限差分的一些信息,请参阅。产生差异的原因有两个:
scipy.signal
scipy.ndimage.convolve
而不是scipy.signal.convolve2d
。ndimage
的默认设置用于处理图像,对于有限精度的整数数据更有效,这是图像的标准
要使用
scipy.signal
复制循环版本,您需要反转内核,正如您所注意到的那样
这是卷积的数学定义。内核在被“扫描”之前被翻转。例如:
其次,
scipy.signal.convolve2d
默认情况下用零填充边界,而您只是不在边界上操作。要使用scipy.signal.convolve2d
再现边界条件,请使用boundary='symm'
(无论如何,对于这个特定的内核……一般来说,您只是忽略了边界,而convolve2d
没有相应的选项。)
最后,出于您的目的(图像处理),使用
scipy.ndimage.convalve
效率更高。在本例中(1D内核),使用scipy.ndimage.convalve1D是最有效的。例如,scipy.ndimage.convalve1d(数据[1,0,-1],轴=0)
+1击败我!我将离开我,仅仅因为我正在编写它:)作为一个旁侧,你可以用广播来更快地创建<代码> MyIsIG/<代码>:<代码> x= NP.AGANGE(5)<代码> MySimult= x[[,NON] +x >旁白:注意你的卷积核H=(1, 0,-1)是一个改进的Pywitt算子()。为此,scipy.ndimage有一个方便的电话。谢谢您的提问:D
array([[ 0., 0., 0., 0., 0.],
[ 0., 2., 2., 2., 0.],
[ 0., 2., 2., 2., 0.],
[ 0., 2., 2., 2., 0.],
[ 0., 0., 0., 0., 0.]])