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的等效函数的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV中的Matlab'bridge''shrink'和'holes'等效形态学运算