我试图弄清楚如何将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向导来弄清楚内部计算的一些代码是怎么回事

最佳答案

问题是您所在的行:

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

08-16 19:54