OpenCV中Matlab的filter2的等效函数

Posted

技术标签:

【中文标题】OpenCV中Matlab的filter2的等效函数【英文标题】:Equivalent function of Matlab's filter2 in OpenCV 【发布时间】:2015-03-23 14:33:37 【问题描述】:

我需要将下面的 matlab 代码转换成 OpenCV 并获得完全相同的结果。

在matlab中:

A = [1 2 3];
f = [4 5 6];
result = filter2(f, A);

这给出了:

result = [17    32    23]

在 OpenCV 中,我尝试了以下几行:

cv::Mat A = (cv::Mat_<float>(1, 3) << 1, 2, 3);
cv::Mat f = (cv::Mat_<float>(1, 3) << 4, 5, 6);
cv::Mat result;
cv::filter2D(A, result, -1, f, cv::Point(-1, -1), 0, cv::BORDER_REPLICATE);

这给了我:

result = [21 32 41]

如何获得与 Matlab 相同的结果?我怀疑 OpenCV 中的锚点会导致这种差异,但我不知道如何改变它。提前致谢。

【问题讨论】:

ddepth参数你一直保持为-1即和src一样,你试过改成CV_64F吗? 我试过了,但它给了我错误提示“源格式 (=5) 和目标格式 (=6) 的组合不受支持 ...”。 【参考方案1】:

使用cv::BORDER_CONSTANT,用零填充数组而不是复制相邻元素:

cv::filter2D(A, result, -1, f, cv::Point(-1, -1), 0, cv::BORDER_CONSTANT);

结果是:

result = [17, 32, 23]

【讨论】:

这正是我要发布的内容。 +1。 @rayryeng 谢谢,我希望我能拿出一些文档来支持这一观察,但在 Matlab 和 OpenCV 方面都严重缺乏。 :( 对于 MATLAB,它有点意味着边界是零填充的:mathworks.com/help/matlab/ref/filter2.html。如果您查看valid 标志,它会告诉您它对边界进行了零填充,但实际上并没有告诉您它是在valid 标志之外进行的。我的猜测是它实际上是不管你使用什么标志,并且根据标志,一些元素被丢弃。尽管如此,零填充仍然完成。对于 OpenCV:docs.opencv.org/modules/imgproc/doc/filtering.html#filter2d - 它告诉你默认是 BORDER_DEFAULT,它会进行零填充。 @rayryeng 我明白你对 Matlab 的 valid 标志的意思,但是如果我使用 BORDER_DEFAULT 我会得到 [25, 32, 35] 这意味着它会因为某种原因被 2 填充?我能找到的唯一地方是 BORDER_CONSTANT 填充为零的地方是这里的教程:docs.opencv.org/doc/tutorials/imgproc/imgtrans/copyMakeBorder/… 糟糕...我认为BORDER_DEFAULT 会进行零填充。哎呀。我讨厌 OpenCV 文档,因为它不一致,而且它让你跳过箍只是为了弄清楚一个标志的含义!......即使那样它也不可靠!

以上是关于OpenCV中Matlab的filter2的等效函数的主要内容,如果未能解决你的问题,请参考以下文章

OpenCv2.2 C++ filter2D

OpenCV中Matlab的radon()等效函数

OpenCV 中的 Matlab 最小等效项

OpenCV中的Matlab'bridge''shrink'和'holes'等效形态学运算

详解OpenCV的函数filter2D(),并提醒大家它做的运算并不是卷积运算而是相关运算

手撕OpenCV源码之filter2D