Обнаружение множества маленьких кружков в непосредственной близости с помощью cv :: HoughCircles ()

Я пытаюсь обнаружить большое количество маленьких кружков, которые находятся относительно близко друг к другу (всего около 20 пикселей друг от друга), используя OpenCV, Мне удалось создать эту маску, используя cv::inRange() а также cv::Canny(),

Исходное изображение

введите описание изображения здесь

маскировать

круговая маска

Тем не менее, когда я использую cv::HoughCircles() только некоторые круги обнаруживаются точно. В настоящее время я использую cv::HoughCircles() со следующими параметрами:

cv::HoughCircles(mat, circles, CV_HOUGH_GRADIENT, 2, mat.rows / 256, 100, 8, 2, 8);

Является ли этот метод недостаточно эффективным для обнаружения таких маленьких и близких окружностей, или мне просто нужно изменить параметры cv :: HoughCircles ()?

Кроме того, было бы полезно избавиться от «шума», окружающего массив окружностей в середине маски, потому что некоторые «ложные круги» обнаруживаются по краям маски. Есть ли простой способ сделать это?

2

Решение

Избавиться от шума:

Если вы можете быть уверены, что всегда будете иметь одинаковые параметры среды (например, расстояние от круга, яркость …), то вы можете замаскировать свое изображение сразу после обнаружения края Canny с помощью cvAnd; вот как будет выглядеть маска:

введите описание изображения здесь

Обнаружение крутых кругов:

Теперь о HoughCircle. Во-первых, эта функция выполняет собственное обнаружение края Канни. Вы тоже делаете это перед звонком в HoughCircle. Это может повлиять на форму ваших кругов, потому что как работает Canny (то есть градиент интенсивности на бинарном изображении …).

Говоря о форме ваших кругов, ниже приведен крупный план того, как выглядят ваши «круги»; Я был бы очень впечатлен, если бы HoughCircle действительно обнаружил все или даже некоторые из них. Это не может дать ничего хорошего в Хаф пространство. Просто чтобы убедиться, установите последние два параметра в 0 (минимальный / максимальный радиус) и попытайтесь уменьшить минимальное расстояние между центрами. Но, честно говоря, я думаю, что вам нужно найти другой подход к вашей проблеме.

[РЕДАКТИРОВАТЬ]

Возможным подходом было бы выполнить маркировка подключенных компонентов (например, обнаружение BLOB-объектов). Насколько я знаю, это невозможно сделать просто с одним OpenCV, вам понадобится что-то вроде cvblob, это очень хорошая библиотека BLOB-объектов на основе OpenCV. В частности, вы можете быть заинтересованы в cvCentroid(CvBlob *blob),

ура

введите описание изображения здесь

3

Другие решения

Хм, тебе действительно нужно определять их как круги? (в отличие от модели их в виде кругов).

Если это какой-то тип калибровочного шаблона, и вас интересует только оценка положения изображений центров, может быть гораздо эффективнее сначала обнаружить их как точечные объекты, а затем обработать каждый обнаруженный в отдельности — например, подгонка круга к капле белых пикселей в окрестности каждого обнаруженного объекта.

1

По вопросам рекламы [email protected]