2D 离散拉普拉斯 (del2) in C++.

2D Discrete laplacian (del2) in C++

本文关键字:del2 in C++ 普拉斯 2D      更新时间:2023-10-16

我正在尝试弄清楚如何将 matlab 中的 del2() 函数移植到 C++。

我有几个我正在使用的掩码是 1 和 0,所以我写了像他的代码:

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)]);
    }
}

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

但是,我认为我在此处发布的代码中的这些值对于内部点是正确的,但似乎 del2 结果是不同的!

深入研究了 del2 源代码,我想我没有足够的 matlab 向导来弄清楚内部计算的一些代码是怎么回事

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

问题是你那里的行:

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)]);  

根本不是离散的拉普拉斯人。

您拥有的是 (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出于某种原因使用这个定义(即使这在数学上不是标准的)。

我认为使用 Matlab 编译器可以将 m 代码转换为 C 代码。你试过吗?

我找到了这个链接,其中解释了另一个要转换为 C 的 methot。

http://www.kluid.com/mlib/viewtopic.php?t=337

祝你好运。