为什么EmguCV高斯模糊不会返回与OpenCV高斯模糊相同的结果?

时间:2011-11-21 15:32:32

标签: c# c++ image-processing opencv emgucv

我遇到OpenCV GaussianBlur函数与EmguCv CvInvoke.cvSmooth / Image.SmoothGaussian函数不匹配。

GaussianBlur调用:

GaussianBlur(src, dest, Size(13,13), 1.5, BORDER_REPLICATE);

EmguCV电话:

CvInvoke.cvSmooth(src, dst, SMOOTH_TYPE.CV_GAUSSIAN, 13, 13, 1.5, 0);

在这两种情况下,src都是32F,3通道图像。我已经验证了src的内容是相同的(将它们保存为bmp并执行二进制差异)。

opencv中的cvSmooth调用如下所示:

CV_IMPL void
cvSmooth( const void* srcarr, void* dstarr, int smooth_type,
          int param1, int param2, double param3, double param4 )
{
    cv::Mat src = cv::cvarrToMat(srcarr), dst0 = cv::cvarrToMat(dstarr), dst = dst0;

    if( smooth_type == CV_GAUSSIAN )
        cv::GaussianBlur( src, dst, cv::Size(param1, param2), param3, param4, cv::BORDER_REPLICATE );
}

...这似乎与我原来的OpenCV调用正在做同样的事情。 CV_GAUSSIAN在EmguCV和OpenCV中定义为2。结果非常接近,但EmguCV图像比OpenCV图像有点模糊。有任何想法吗?我还转发了this question on the EmguCV forum

1 个答案:

答案 0 :(得分:1)

问题在于:

GaussianBlur(src, dest, Size(13,13), 1.5, BORDER_REPLICATE);

将1.5作为sigma1传递,将1(BORDER_REPLICATE)作为sigma2传递。将Emgu代码更改为

CvInvoke.cvSmooth(src, dst, SMOOTH_TYPE.CV_GAUSSIAN, 13, 13, 1.5, 1);

完美匹配。