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

Why might EmguCV Gaussian blur not return identical results as OpenCV Gaussian blur?

本文关键字:高斯 模糊 结果 EmguCV 返回 为什么 OpenCV      更新时间:2023-10-16

我正在经历OpenCV GaussianBlur函数和EmguCv CvInvoke.cvSmooth/Image之间的不匹配。SmoothGaussian功能。

高斯模糊调用:

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并执行二进制diff)。

在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图像稍微模糊一些。什么好主意吗?我还在EmguCV论坛上交叉发布了这个问题

问题是:

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

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

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

结果为完美匹配。