2011-11-21 112 views
3

我遇到了OpenCV GaussianBlur函数和EmguCv CvInvoke.cvSmooth/Image.SmoothGaussian函数之间的不匹配。为什么EmguCV高斯模糊不能返回与OpenCV高斯模糊相同的结果?

的高斯模糊呼叫:

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的呼叫做同样的事情。在EmguCV和OpenCV中CV_GAUSSIAN被定义为2。结果非常接近,但EmguCV图像比OpenCV图像稍微模糊。有任何想法吗?我也转置了this question on the EmguCV forum

+1

您链接项目的库是否完全一样?也许其中一个被编译为使用GPU或流指令,另一个完全在CPU FP ALU中执行,因此可能存在舍入错误,在更快(更不准确)的实现中更明显 – fortran

+0

@fortran从我能用Process Explorer告诉,这两个应用程序都加载了相同的3个OpenCV DLL和1个TBB DLL。 –

回答

1

的问题是:

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

正在经过作为1.5 sigma1,和图1(BORDER_REPLICATE)为σ-2。将Emgu代码更改为

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

结果完美匹配。