Почему размытие EmguCV Gaussian Blur не может дать результаты, идентичные размытию OpenCV Gaussian Blur? - PullRequest
3 голосов
/ 21 ноября 2011

Я обнаружил несоответствие между функцией 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 является 3-канальным изображением 32F.Я проверил, что содержимое src идентично (сохранил их как bmp и сделал бинарный diff).

Вызов cvSmooth в opencv выглядит так:

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 определяется как 2 в EmguCV и OpenCV.Результаты в конечном итоге очень близки, но изображение EmguCV получается немного более размытым, чем изображение OpenCV.Есть идеи?Я также вставил этот вопрос на форуме EmguCV .

1 Ответ

1 голос
/ 21 ноября 2011

Проблема в том, что:

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

приводит к идеальному совпадению.

...