我的目标是创建和可视化图像的偏导数(2D).我将用第一个有限中心差分方程做到这一点
wikipedia
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
首先,我通过scolveyd(短路)的convolve2d函数为x和y创建第一个中心有限差分
kernel=array([[-1,0,1]]) #create first central finite difference kernel
pdx=sg.convolve2d(myImage,kernel,"same") #dI(x,y)/dx
现在我创建相同的使用循环
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))
我们来看看结果:
pdx – convolve2d的内核方法
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.]])
pdx – 循环的有限差分
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],但这在数学上是不正确的.
有人能帮我吗 ?