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

为君一笑 提交于 2019-12-13 14:17:59

问题


I'm experiencing a mismatch between the OpenCV GaussianBlur function and the EmguCv CvInvoke.cvSmooth/Image.SmoothGaussian functions.

The GaussianBlur call:

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

The EmguCV call:

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

In both cases, src is a 32F, 3 channel image. I have verified that the contents of src are identical (saved them as bmp and did binary diff).

The cvSmooth call in opencv looks like this:

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 );
}

...which seems to be doing the same thing my original OpenCV call is doing. CV_GAUSSIAN is defined as 2 in both EmguCV and OpenCV. The results end up very close, but the EmguCV image comes out a little bit blurrier than the OpenCV image. Any ideas? I also crossposted this question on the EmguCV forum.


回答1:


The problem is that:

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

Is passing 1.5 as sigma1, and 1 (BORDER_REPLICATE) as sigma2. Changing the Emgu code to

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

results in a perfect match.



来源:https://stackoverflow.com/questions/8214222/why-might-emgucv-gaussian-blur-not-return-identical-results-as-opencv-gaussian-b

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!