Лапласиан гауссовского (LoG) детектора BLOB-объектов C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Лапласиан гауссовского (LoG) детектора BLOB-объектов C++

Сообщение Anonymous »

Я пишу детектор BLOB-объектов на основе LoG. Я использую библиотеку openCV. Задача — обнаружить светлые круги на темном фоне. Тип изображения CV_8UC1
Исходное изображение (специально зашумлено)
Изображение

Все началось с того, что минимальный отклик почему-то давал капля с большим радиусом, чем сам искомый круг. Дошёл до того, что ошибка заключается в совпадении размеров ядер 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);
Главный вопрос – как правильно согласовать размеры ядер с технической точки зрения? Какие значения следует указать в параметрах ksize для лапласиана и гаусса?

Подробнее здесь: https://stackoverflow.com/questions/783 ... detector-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»