c++ - sepFilter2D Opencv 意外结果

标签 c++ matlab opencv image-processing

我正在尝试在图像上应用 8X8 可分离均值滤波器 过滤器是二维可分离的。

我正在从 Matlab 转换以下代码,

Kernel = ones(n);
% for conv 2 without zeropadding
LimgLarge = padarray(Limg,[n n],'circular');
LimgKer = conv2(LimgLarge,Kernel,'same')/(n^2);
LKerCorr = LimgKer(n+1:end-n,n+1:end-n);

首先,我用过滤器大小填充图像,然后关联 2d,最后裁剪图像区域。

现在,我正在尝试使用 opencv 在 C++ 中实现同样的事情

我已经加载了图像,然后调用了以下命令:

m_kernelSize = 8;   
m_kernelX = Mat::ones(m_kernelSize,1,CV_32FC1);
m_kernelX = m_kernelX / m_kernelSize;

m_kernelY = Mat::ones(1,m_kernelSize,CV_32FC1);
m_kernelY = m_kernelY / m_kernelSize;

sepFilter2D(m_logImage,m_filteredImage,m_logImage.depth(),m_kernelX,m_kernelY,Point(-1,-1),0,BORDER_REPLICATE);

我希望得到相同的结果,但我仍然从 Matlab 得到完全不同的结果。

我宁愿不填充图像,进行相关并最终再次裁剪图像,我希望使用 BORDER_REPLICATE 参数得到相同的结果。

顺便说一句,我知道 copyMakeBorder 函数,但没有使用它,因为 sepFilter2D 会自行处理区域。

最佳答案

既然你说你只是在你显示的代码片段之前加载图像,我可以看到两个潜在的缺陷。

首先,如果您在加载源图像和代码片段之间什么都不做,那么您的源图像将是一个 8 位图像,并且由于您设置了函数参数 ddepthm_logImage.depth(),您还请求 8 位目标图像。

然而,看完documentation of sepFilter2D之后,我不确定这是 src.depth()ddepth 的有效组合。

您可以尝试使用以下行吗:

sepFilter2D(m_logImage,m_filteredImage,CV_32F,m_kernelX,m_kernelY,Point(-1,-1),0,BORDER_REPLICATE);

其次,检查您是否使用标志 CV_LOAD_IMAGE_GRAYSCALE 加载源图像,以便它只有一个 channel 而不是三个。

关于c++ - sepFilter2D Opencv 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21917077/

相关文章:

c++ - 什么时候实例化 constexpr 函数模板?

c++ - 在 C++ 中将一个数组复制到另一个数组

matlab - MATLAB 中的高效 3D 逐元素运算

matlab - 在 matlab 绘图的标记内插入字符串

matlab - 如何将 64 位 MATLAB mex 文件链接到 OpenCV 库

c++ - 我是否必须在函数实现中重复内联关键字

c++ - 是否将正确对齐和大小的数组转换和访问到未构造的平凡类型未定义行为?

matlab - 如何使用 max 或 min 返回的多维索引?

python-2.7 - 从图像的边缘检测制作蒙版?

opencv - 使用OpenCV进行形状检测