exponenta event banner

imfindcircles

Поиск кругов с помощью кругового преобразования Хафа

Описание

centers = imfindcircles(A,radius) находит круги в изображении A радиусы которых приблизительно равны radius. Выходные данные, centers, - матрица из двух столбцов, содержащая координаты (x, y) центров окружностей на изображении.

[centers,radii] = imfindcircles(A,radiusRange) находит окружности с радиусами в диапазоне, указанном radiusRange. Дополнительный выходной аргумент, radii, содержит оценочные радиусы, соответствующие каждому центру окружности в centers.

пример

[centers,radii,metric] = imfindcircles(A,radiusRange) также возвращает вектор столбца, metric, содержащий величины пиков массива аккумуляторов для каждой окружности (в порядке убывания). Строки centers и radii соответствуют строкам metric.

пример

[___] = imfindcircles(___,Name,Value) указывает дополнительные параметры с одним или несколькими Name,Value парные аргументы, использующие любой из предыдущих синтаксисов.

Примеры

свернуть все

В этом примере показано, как найти все круги в изображении, а также как сохранить и отобразить самые сильные круги.

Считывание изображения в градациях серого в рабочую область и его отображение.

A = imread('coins.png');
imshow(A)

Figure contains an axes. The axes contains an object of type image.

Найти все окружности с радиусом r пикселы в диапазоне [15, 30].

[centers, radii, metric] = imfindcircles(A,[15 30]);

Сохраните пять наиболее сильных кругов в соответствии с метрическими значениями.

centersStrong5 = centers(1:5,:); 
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);

Нарисуйте пять самых сильных периметров окружности поверх исходного изображения.

viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');

Figure contains an axes. The axes contains 3 objects of type line, image.

Прочтите изображение в рабочую область и отобразите его.

A = imread('circlesBrightDark.png');
imshow(A)

Figure contains an axes. The axes contains an object of type image.

Определите диапазон радиуса.

Rmin = 30;
Rmax = 65;

Найдите все яркие круги на изображении в радиусе.

[centersBright, radiiBright] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','bright');

Найдите все темные круги на изображении в радиусе.

[centersDark, radiiDark] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','dark');

Нарисуйте синие линии вокруг краев ярких кругов.

viscircles(centersBright, radiiBright,'Color','b');

Figure contains an axes. The axes contains 3 objects of type line, image.

Нарисуйте красные пунктирные линии по краям темных кругов.

viscircles(centersDark, radiiDark,'LineStyle','--');

Figure contains an axes. The axes contains 5 objects of type line, image.

Входные аргументы

свернуть все

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

Типы данных: single | double | int16 | uint8 | uint16 | logical

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Диапазон радиусов для циклических объектов, которые требуется обнаружить, заданный как 2-элементный вектор положительных целых чисел вида [rmin rmax], где rmin меньше, чем rmax.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'ObjectPolarity','bright' указывает яркие круглые объекты на темном фоне.

Полярность объекта, заданная как разделенная запятыми пара, состоящая из 'ObjectPolarity' и одно из значений в таблице.

'bright'Круглые объекты ярче фона.
'dark'Круглые объекты темнее фона.

Метод вычисления - это метод, используемый для вычисления массива накопителей, определяемый как разделенная запятыми пара, состоящая из 'Method' и одно из значений в таблице.

'PhaseCode'Метод кодирования фазы Атертона и Кербайсона [1]. Это значение по умолчанию.
'TwoStage'Метод, используемый в двухступенчатом круговом преобразовании Хафа [2], [3].

Пример: 'Method','PhaseCode' задает метод фазового кодирования Атертона и Кербайсона.

Коэффициент чувствительности - это чувствительность для массива накопителей с циклическим преобразованием Хафа, определяемая как разделенная запятыми пара, состоящая из 'Sensitivity' и число в диапазоне [0,1]. По мере увеличения коэффициента чувствительности imfindcircles обнаруживает более круглые объекты, в том числе слабые и частично затемненные круги. Более высокие значения чувствительности также увеличивают риск ложного обнаружения.

Порог градиента кромки задает порог градиента для определения краевых пикселей в изображении, определяемый как пара, разделенная запятыми, состоящая из 'EdgeThreshold' и число в диапазоне [0, 1]. Определить 0 для установки порога на величину нулевого градиента. Определить 1 для установки порогового значения максимальной величины градиента. imfindcircles обнаруживает больше круглых объектов (со слабыми и сильными краями), если установить более низкое значение порога. Он обнаруживает меньшее количество окружностей со слабыми краями при увеличении значения порога. По умолчанию imfindcircles автоматически выбирает порог градиента кромки с помощью функции graythresh.

Пример: 'EdgeThreshold',0.5 устанавливает порог градиента кромки равным 0.5.

Выходные аргументы

свернуть все

Координаты центров окружности, возвращаемые в виде Pоколо-2 матрица, содержащая координаты X центров окружности в первом столбце и координаты Y во втором столбце. Количество строк, P, - количество обнаруженных кругов. centers сортируется по силе кругов.

Типы данных: double

Расчетные радиусы для центров окружности, возвращаемые в виде вектора столбца. Значение радиуса при radii(j) соответствует окружности с центром на centers(j,:).

Типы данных: double

Силы окружности - относительные силы для центров окружности, возвращаемые в виде вектора. Значение при metric(j) соответствует окружности с радиусом radii(j) по центру при centers(j,:).

Типы данных: double

Совет

  • Точность imfindcircles ограничено, когда значение radius (или rmin) меньше или равно 5.

  • Шаг оценки радиуса обычно быстрее, если используется (по умолчанию) 'PhaseCode' метод вместо 'TwoStage'.

  • Оба метода вычисления, 'PhaseCode' и 'TwoStage' ограничены по своей способности обнаруживать концентрические окружности. Результаты для концентрических окружностей могут изменяться в зависимости от входного изображения.

  • imfindcircles не находит кругов с центрами вне области изображения.

  • imfindcircles предварительно обрабатывает двоичные (логические) изображения для повышения точности результата. Он преобразует цветные изображения в градации серого с помощью функции rgb2gray перед их обработкой.

Алгоритмы

imfindcircles использует алгоритм Circular Hough Transform (CHT) для поиска кругов в изображениях. Этот подход используется из-за его надежности при наличии шума, окклюзии и различной освещенности.

CHT не является строго определенным алгоритмом, скорее существует ряд различных подходов, которые могут быть приняты при его реализации. Однако в целом существует три важных шага, которые являются общими для всех.

  1. Вычисление массива аккумуляторов

    Передние пиксели высокого градиента обозначаются как предполагаемые пиксели и разрешаются отдавать «голоса» в накопительной матрице. В классической реализации CHT пиксели-кандидаты голосуют по шаблону вокруг них, который образует полный круг фиксированного радиуса. На фиг.1а показан пример пикселя-кандидата, лежащего на реальном круге (сплошном круге), и классический шаблон голосования CHT (пунктирные круги) для пикселя-кандидата.

    Классическая схема голосования CHT

  2. Оценка центра

    Голоса пикселей-кандидатов, принадлежащих кругу изображения, имеют тенденцию накапливаться в ячейке массива накопителей, соответствующей центру круга. Следовательно, центры окружности оцениваются путем обнаружения пиков в накопительной матрице. На фиг.1b показан пример пикселей-кандидатов (сплошных точек), лежащих на реальном круге (сплошном круге), и их рисунков голосования (пунктирных кругов), которые совпадают в центре фактического круга.

  3. Оценка радиуса

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

imfindcircles предоставляет два алгоритма поиска кругов на изображениях: фазовое кодирование (по умолчанию) и двухступенчатое. У обоих есть общие вычислительные шаги, но у каждого из них есть свои уникальные аспекты.

Общими вычислительными функциями, совместно используемыми обоими алгоритмами, являются:

  • Использование массива аккумуляторов 2-D

    Классическое преобразование Хафа требует 3-D массива для хранения голосов для нескольких радиусов, что приводит к большим требованиям к хранению и длительному времени обработки. И фазовое кодирование, и двухступенчатый методы решают эту проблему, используя одну 2-D накопительную матрицу для всех радиусов. Хотя этот подход требует дополнительного этапа оценки радиуса, общая вычислительная нагрузка обычно ниже, особенно при работе в большом радиальном диапазоне. Это широко распространенная практика в современных реализациях CHT.

  • Использование краевых пикселов

    Общие требования к памяти и скорость сильно зависят от количества возможных пикселей. Чтобы ограничить их количество, величина градиента входного изображения является пороговой, так что в подсчет голосов включаются только пиксели высокого градиента.

  • Использование информации об ориентации кромок

    Другим способом оптимизации производительности является ограничение количества ячеек, доступных для возможных пикселей. Это достигается путем использования локально доступной краевой информации, позволяющей голосовать только в ограниченном интервале вдоль направления градиента (фиг.2).

    Режим голосования: несколько радиусов, вдоль направления градиента

rminМинимальный радиус поиска
rmaxМаксимальный радиус поиска
ractualРадиус круга, к которому принадлежит пиксель-кандидат
cminЦентр окружности радиуса rmin
cmaxЦентр окружности радиуса rmax
cactualЦентр окружности радиуса ractual

Два метода CHT, используемые функцией imfindcircles принципиально отличаются по способу вычисления радиусов окружности.

  • Двухступенчатый

    Радиусы явно оцениваются с использованием расчетных центров окружности вместе с информацией об изображении. Методика основана на вычислении радиальных гистограмм [2] .[3]

  • Фазовое кодирование

    Ключевой идеей в фазовом кодировании [1] является использование комплексных значений в накопительном массиве с радиусной информацией, закодированной в фазе элементов массива. Голоса, поданные краевыми пикселями, содержат информацию не только о возможных местоположениях центра, но и о радиусе окружности, связанной с расположением центра. В отличие от двухступенчатого метода, в котором радиус должен быть оценен явным образом с использованием радиальных гистограмм, в фазовом кодировании радиус может быть оценен простым декодированием информации о фазе из оцененного местоположения центра в матрице накопителей.

Вопросы совместимости

развернуть все

В R2019a изменилось поведение

Ссылки

[1] Ти Джей Атертон, Ди Джей Кербайсон. «Определение инвариантного круга размера». Вычисления изображения и зрения. Том 17, номер 11, 1999, стр. 795-803.

[2] Х.К. Юен, Дж. Принсен, Дж. Иллингворт и Дж. Киттлер. «Сравнительное исследование методов преобразования Хафа для поиска круга». Вычисления изображения и зрения. Том 8, номер 1, 1990, стр. 71-77.

[3] E.R. Davies, Machine Vision: теория, алгоритмы, практичности. Глава 10. 3-е издание. Morgan Kauffman Publishers, 2005.

Расширенные возможности

.
Представлен в R2012a