C++中的2D离散拉普拉斯(del2)

Der*_*rek 5 c++ matlab

我试图弄清楚如何将matlab中的del2()函数移植到C++.

我有几个我正在使用的面具是零和零,所以我写了代码:

for(size_t i = 1 ; i < nmax-1 ; i++)

{
    for(size_t j = 1 ; j < nmax-1 ; j++)

    {
        transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]);

    }
}
Run Code Online (Sandbox Code Playgroud)

计算拉普拉斯的内部点.我认为根据matlab中"doc del2"中的一些信息,边界条件只是使用可用的信息来计算,对吧?所以我想我只需要为i,j = 0和nmax的边界条件写出个案

但是,我认为我在这里发布的代码中的这些值对于内部点是正确的,但看起来del2结果是不同的!

我挖掘了del2源码,我想我还不够matlab向导来弄清楚内部计算的一些代码是怎么回事

Mem*_*ing 5

你可以看到的代码del2通过edit del2type del2.请注意,del2在边界上进行三次插值.


Chr*_* A. 4

问题是你那里的行:

transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]);  
Run Code Online (Sandbox Code Playgroud)

根本不是离散拉普拉斯算子。

你所拥有的是 (I(i+1,j) + I(i-1,j) + I(i,j+1) + I(i,j-1) ) / 4

我不知道这个掩码是什么,但是离散拉普拉斯算子(假设每个维度中每个像素之间的间距为 1)是:

(-4 * I(i,j) + I(i+1,j) + I(i-1,j) + I(i,j+1) + I(i,j-1) )

所以基本上,您错过了一个术语,并且不需要除以 4。我建议返回并根据其定义重新推导离散拉普拉斯算子,即图像的二阶 x 导数加上图像的二阶 y 导数。

编辑:我知道你从哪里得到的/4,因为Matlab出于某种原因使用这个定义(即使这在数学上不是标准的)。