2011-11-21 119 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); 

結果完美匹配。