сглаживание по Гауссу с использованием opencv

Я создал следующее ядро ​​Гаусса в OpenCV и сравнил его с функцией GaussianBlur OpenCV. Однако я получаю черное изображение вместо гладкого изображения. Может ли кто-нибудь пролить свет на это?

Mat src, dst1,dst2;
Mat gaussiankrnl(3,3,CV_32F);
Point anchor;
double delta;
int ddepth;

anchor = Point( -1, -1 );
delta = 0;
ddepth = -1;

src = imread("coins.pgm");




gaussiankrnl.at<double>(0,0) = 1/16;
gaussiankrnl.at<double>(0,1) = 2/16;
gaussiankrnl.at<double>(0,2) = 1/16;
gaussiankrnl.at<double>(1,0) = 2/16;
gaussiankrnl.at<double>(1,1) = 4/16;
gaussiankrnl.at<double>(1,2) = 2/16;
gaussiankrnl.at<double>(2,0) = 1/16;
gaussiankrnl.at<double>(2,1) = 2/16;
gaussiankrnl.at<double>(2,2) = 1/16;


filter2D(src, dst1, ddepth , gaussiankrnl, anchor, delta, BORDER_DEFAULT );

GaussianBlur(src, dst2, Size(3,3), 1.0);

imshow("result1", dst1 );
imshow("result2", dst2 );

cvWaitKey(0);
return 0;

person Abhishek Thakur    schedule 20.11.2012    source источник


Ответы (1)


Вы делите целые числа и делаете нулевое ядро.

Измените 1/16 на 1.0/16.0, а также другие значения.

person Andrey Kamaev    schedule 20.11.2012
comment
Привет спасибо. подскажите почему результаты разные? Разве они не должны быть одинаковыми? Я разместил результаты здесь: i47.tinypic.com/2qn7br6.png - person Abhishek Thakur; 21.11.2012
comment
переход на 1.0/16.0 помог. Кроме того, я использовал CV_32F, что было неправильно. Вместо этого необходимо использовать CV_64F. - person Abhishek Thakur; 21.11.2012
comment
Если вы напишете 1/16 на С++, вы получите целочисленное деление, в результате чего 1/16 = 0, которое затем преобразуется в двойное. Вы должны сделать хотя бы одно из этих чисел двойным. Вы можете сделать это, приведя или добавив .0 (или только .) в конце одного из чисел. 1./16 тоже подойдет. - person Dimitar Slavchev; 21.11.2012