C ++中的拉普拉斯矩阵计算[关闭]

Posted

技术标签:

【中文标题】C ++中的拉普拉斯矩阵计算[关闭]【英文标题】:Laplacian Matrix Calculation in C++ [closed] 【发布时间】:2012-11-23 13:15:15 【问题描述】:

我一直在尝试实现名为Learning Based Digital Matting 的研究论文中描述的数字抠图算法。

它的 MATLAB 代码在here 可用。我正在尝试使用 OpenCV 2.4.3 和 UMFPACK 将 MATLAB 代码转换为 C++。

问题是名为getLap_iccv09_overlapping(计算输入图像的拉普拉斯矩阵)的函数在 OpenCV 中没有现成的可用,我必须在 cpp 中编写自己的实现。我的实施结果不正确。

是否有任何 C/C++ 库提供矩阵/图像的Laplacian Matrix calculation?

【问题讨论】:

有趣的是,拉普拉斯矩阵是为图计算的。 CV 中图像如何表示为图形? 拉普拉斯算子是一个稀疏矩阵。该函数将图像和背景掩码作为输入,并给出稀疏拉普拉斯矩阵作为输出。 图的拉普拉斯矩阵计算并不是一件复杂的事情。这里真正的问题是 - 这两个图像如何表示为图形?必须有一些算法步骤来分析这些图像,提取一些特征并将它们表示为图形。从这里拉普拉斯矩阵计算是微不足道的。 (似乎有计算图像/特征图的中间关键步骤,但我可能错了。) 这方面有什么进展吗? 【参考方案1】:

我最近不得不将几个 Matlab 函数“翻译”成 C++(使用 OpenCV),不幸的是你找不到完全相同的函数。有一些类似的函数,但结果并不完全相同,尤其是矩阵的边界。 我建议您阅读并理解您的 Matlab 函数使用的算法(对矩阵的运算)并用 C++ 编写(Opencv 非常适合矩阵运算)。 您可以使用一个小矩阵(例如 4 x 4)并逐步进行测试,首先使用矩阵内的元素,然后使用边缘和边框(我发现边框条件更难理解) 祝你好运!

【讨论】:

实际上我已经完成了你提到的所有事情,但我没有得到正确的输出。此外,该算法会跳过图像边界。 你能把原始的matlab algorithme和你用c++翻译的那个发上来吗? 可以发,但是C++代码很大。【参考方案2】:

this function不够用吗?

【讨论】:

此函数将拉普拉斯算子应用于图像。 Applying Laplace Operator 和 Calculating Laplacian Matrix 是两个不同的东西。 啊好吧,我误会了。我在这里真的帮不上忙,但也许this question 毕竟可以帮助你找到这个函数的用途,因为拉普拉斯矩阵似乎是拉普拉斯算子的离散模拟。祝你好运!【参考方案3】:

您的 Matlab 和 C++ 版本的函数有多相似?听起来您可能只需要逐步检查各个阶段,检查各种中间结果是否相同,然后尝试以这种方式找到错误。

您可能会发现writeMat.cpp 的用途,这是一个可用于获取您的 OpenCV cv::Mat 矩阵并将其保存为 Matlab .m 文件的函数,这应该使比较更容易 - 在您的各个点写出一个 .m cpp 代码,将它们加载到 Matlab 中,运行 Matlab 脚本并在适当的点进行比较。

【讨论】:

以上是关于C ++中的拉普拉斯矩阵计算[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

计算/翻译R中二进制矩阵/向量中的数字向量

c_cpp 计算存储在一维点阵列中的矩阵的特征值和特征向量

matlab求解指派问题

如何以非线性方式在C ++中保存矩阵

MapReduce实现二阶矩阵相乘

在c中的结构中初始化多维数组