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, содержащая величины peaks массива аккумуляторов для каждого круга (в порядке убывания). Строки 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-by- 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 выполняет предварительную обработку двоичных (логических) изображений для повышения точности результата. Он преобразует изображения truecolor в полутоновые с помощью функции rgb2gray перед их обработкой.

Алгоритмы

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

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

  1. Матрица аккумуляторов Расчета

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

    Классический шаблон голосования CHT

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

    Голоса пикселей кандидата, принадлежащих кругу изображения, имеют тенденцию накапливаться в интервале массива аккумулятора, соответствующем центру круга. Поэтому центры окружностей оцениваются путем обнаружения peaks в массиве аккумуляторов. Фигура показывает пример пикселей кандидата (твердых точек), лежащих на фактическом круге (твердом круге), и их шаблонов голосования (штриховых кругов), которые совпадают в центре фактического круга.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

расширить все

Поведение изменено в R2019a

Ссылки

[1] T.J Atherton, D.J. Kerbyson. «Определение размера инвариантного круга». Image and Vision Computing. Том 17, № 11, 1999, с. 795-803.

[2] H.K Yuen, .J. Принсен, Дж. Иллингворт и Дж. Киттлер. Сравнительное исследование методов преобразования Хафа для нахождения круга. Image and Vision Computing. Том 8, № 1, 1990, с. 71-77.

[3] E.R. Davies, Machine Vision: Theory, Algorithms, Practicalities. Глава 10. 3-е издание. Morgan Kauffman Publishers, 2005.

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

.
Введенный в R2012a