imfindcircles

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

Описание

centers = imfindcircles(A,radius) находит круги в изображении A чьи радиусы приблизительно равны radius. Выход, centers, матрица 2D столбца, содержащая (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)

Найдите все круги с радиусом 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');

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

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

Задайте область значений радиуса.

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');

Проведите красные пунктирные линии вокруг ребер темных кругов.

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

Входные параметры

свернуть все

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

Типы данных: 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'Метод используется в круговом Преобразовании Хафа 2D этапа [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 использует основанный на Круговом преобразовании Хафа (CHT) алгоритм в нахождении кругов в изображениях. Этот подход используется из-за его робастности в присутствии шума, поглощения газов и различного освещения.

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

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

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

    Классический избирательный шаблон CHT

  2. Центральная оценка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 2D этап

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

  • Кодирование фазы

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

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

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

Поведение изменяется в R2019a

Ссылки

[1] T.J Атертон, Д.Дж. Кербизон. "Инвариант размера круговое обнаружение". Изображение и Вычисление Видения. Объем 17, Номер 11, 1999, стр 795-803.

[2] Х.К Юэн.J. Princen, Дж. Иллингуорт и Дж. Киттлер. "Сравнительное исследование методов Преобразования Хафа для открытия круга". Изображение и Вычисление Видения. Объем 8, Номер 1, 1990, стр 71–77.

[3] Э.Р. Дэвис, машинное зрение: теория, алгоритмы, практичность. Глава 10. 3-й выпуск. Издатели Моргана Кауфмана, 2005.

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

Представленный в R2012a