Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python scipy convolve2d似乎不正确_Python_Python 2.7_Scipy_Convolution - Fatal编程技术网

python scipy convolve2d似乎不正确

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

我的目标是创建和可视化图像(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 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.]])