Math 关于dx的离散数值导数>;1.

Math 关于dx的离散数值导数>;1.,math,opencv,image-processing,numerical-methods,Math,Opencv,Image Processing,Numerical Methods,如何为d/d(n*x)运算符生成模具 我正在写一个程序,需要计算图像中的线导数。如果我们想要计算关于d/dx的最简单导数近似值,我们可以运行以下操作: diff[x] = -1.0 * image[x] + image[x+1] 如果我想要更精确地计算导数,我可以增加模具的大小,并可能重新计算为: diff[x] = -3./2 * image[x] + 2*image[x+1] - 1./2 * image[x+2] 我一直在使用有限差分法来获得这些系数 现在假设我想对d/d(3*x)求导

如何为d/d(n*x)运算符生成模具

我正在写一个程序,需要计算图像中的线导数。如果我们想要计算关于d/dx的最简单导数近似值,我们可以运行以下操作:

diff[x] = -1.0 * image[x] + image[x+1]
如果我想要更精确地计算导数,我可以增加模具的大小,并可能重新计算为:

diff[x] = -3./2 * image[x] + 2*image[x+1] - 1./2 * image[x+2]
我一直在使用有限差分法来获得这些系数

现在假设我想对d/d(3*x)求导数,我可以简单地拉伸原始模板,如下所示:

diff[x] = -1.0 * image[x] + image[x+3]

然而,这里我没有使用来自图像[x+1]和图像[x+2]的信息,因此导数近似可以大大改进。如何生成使用此信息从而更准确的模具?

根据我对您问题的理解,我建议propoise以所需分辨率(例如除以3)生成二次采样图像,然后应用原始导数计算方法。子采样程序应首先在图像上应用低通滤波器(例如,使用方框或高斯模糊)来进行适当的抗失真处理。

两个建议:

  • 首先,一般来说,使用中心计算。因此,高阶一阶导数是
    0.5*(image[x+1]-image[x-1])

  • 其次,使用链公式推导“关于3x”。在其最简单的形式中,形式上,
    df/dy=df/dx*dx/dy
    ,这意味着
    dImage/d(3x)=dImage/dx*(1/3)
    简而言之,就是除以3


为什么不使用d/d(n*x)=d/d(x)/n?取d/dx(4x^2),然后用y=2*x,取d/dy(y^2),你就已经回答了你的问题。d/dx(4x^2)=8*x;d/dy(y^2)=2*y=4*x=d/dx(4x^2)/2So,在这种情况下它是有效的。哎呀,这个公式乍一看似乎是有效的。无论如何,使用d/dx主要只依赖于2或3个像素,容易受到噪声的影响,而且,在重新缩放图像时,结果会有所不同。这是一个不一致的结果。数学堆栈交换的人也无法理解,所以我使用了你的方法。我不是对图像进行下采样,而是对内核进行上采样,在非零滤波器系数之间添加零填充。即使这不是一个理想的解决方案,它也可以很好地工作。在这种情况下,您也可以尝试傅立叶对导数的解释(将FFT乘以j*omega)。