Исходное изображение (специально зашумлено)

Все началось с того, что минимальный отклик почему-то давал капля с большим радиусом, чем сам искомый круг. Дошёл до того, что ошибка заключается в совпадении размеров ядер cv::GaussianBlur и cv::Laplacian.
Например, первая картинка со всеми найденными блобами (отсортировано для исключения ложных срабатываний), вторая картинка — брошенные блобы с минимальным откликом. Чтобы найти капли разных размеров, я использую пирамиду масштаба cv::pyrDown и нормализацию ответа LoG sigma^2.
[img]https: //i.stack.imgur.com/sjxDl.jpg[/img]

Из документации я не понял, какой размер нужно указывать в параметрах функций - размер крыла или реальный размер ядра. Например, если я укажу в параметрах ksize=5. Будет ли размер ядра Гаусса равен 5? А размер ядра Лапласа будет равен 11 - по формуле 2*n + 1?
Я пытался найти ответ путем получения ядер. То есть я использовал функции cv::getGaussianKernel и cv::getDerivKernels. Но по какой-то причине результат применения cv::Laplacian к полученному ядру Гаусса дает немного другой результат. А именно, в случае использования cv::GaussianBlur и cv::Laplacian я получил минимальный ответ в точке [155, 710] со значением -144004136960.000000, а в случае использования cv::getGaussianKernel и cv:: Полученный мною лапласовский минимум ответа находился в точке [155, 710] со значением -9097119744.000000. Я использовал те же размеры сердечников. Я умножил полученное cv::getGaussianKernel ядро на транспонированное ядро, так как функция cv::getGaussianKernel дает одномерное ядро.
Причины такого поведения мне не понятны .
Первое изображение получено с использованием классического метода, а второе — путем применения cv::Лапласиана к ядру Гаусса, полученному из cv::getGaussianKernel.

[img]https:// i.stack.imgur.com/oIJ95.png[/img]
Вот как выглядит LoG при поиске ядра Гаусса с помощью cv::getGaussianKernel.

Далее я попытался получить ядро Лапласа. Для этого я использовал
Код: Выделить всё
cv::getDerivKernels(sobelKernelX, sobelKernelY, 2, 2, kernelsizes);
cv::Mat sobelKernel = sobelKernelX * sobelKernelX.t() + sobelKernelY * sobelKernelY.t();
[img]https://i .stack.imgur.com/plXBP.png[/img]
Вот как выглядел LoG.
[img]https:/ /i.stack.imgur.com/EmL4x.png[/img]
Код: Выделить всё
//values used
double sigmakz = 3.2;
int kernelsizes = static_cast(6*sigmakz);
//classic version
image.convertTo(temprrrr_reverse, CV_32F);
cv::GaussianBlur(temprrrr_reverse, tryinguff, cv::Size(kernelsizes, kernelsizes), sigmakz);
cv::Laplacian(tryinguff, outtt, CV_32F, kernelsizes);
//option to obtain a Gaussian kernel
cv::Mat gausKernel = cv::getGaussianKernel(kernelsizes, sigmakz, CV_32F);
cv::Mat temprrrr = gausKernel * gausKernel.t();
cv::Mat smth;
cv::Laplacian(temprrrr, smth, CV_32F, kernelsizes);
cv::Mat hrrr;
cv::filter2D(image, hrrr, CV_32F, smth);
//option to obtain the kernel of the second derivative
cv::Mat sobelKernelX;
cv::Mat sobelKernelY;
cv::getDerivKernels(sobelKernelX, sobelKernelY, 2, 2, kernelsizes);
cv::Mat sobelKernel = sobelKernelX * sobelKernelX.t() + sobelKernelY * sobelKernelY.t();
cv::Mat tryinguff;
//temprr = gausKernel * gausKernel.t();
cv::filter2D(temprrrr, tryinguff, CV_32F, sobelKernel);
cv::Mat outtt;
cv::filter2D(image, outtt, CV_32F, tryinguff);
Подробнее здесь: https://stackoverflow.com/questions/783 ... detector-c