Как стать автором
Обновить

Программа поиска эллипсов и определения их параметров МНК

Время на прочтение3 мин
Количество просмотров1.8K

Привет! Я новичок на Харбре. Меня зацепила статья от 2011 года: «Детектирование эллиптических частиц на микрофотографии. Новый алгоритм поиска эллипсов на изображении».

Вот комментарий к этой статье (Mrrl 27 дек 2011 в 07:49): «А почему эллипс строится по 6 точкам? Уравнение ведь однородное. Для кривой второго порядка всегда хватало 5 точек, коэффициенты ищутся решением однородного уравнения. В качестве шестой точки есть смысл добавить точку, которая эллипсу заведомо не принадлежит, и записать для нее F(x,y)=1 — тогда придется решать более привычное неоднородное уравнение. А если действительно нужен точный результат, то нужно брать все точки, лежащие вдоль линии приблизительно найденного эллипса (лучше бы с весами), и подать их на вход метода наименьших квадратов. Он позволит определить параметры с точностью до десятых долей пикселя (а то и точнее)».

Мной разработана программа на Матлаб в которой реализована схема, предложенная Mrrl.

Краткое описание программы и результатов ее применения к конкретному примеру из цитированной выше статьи.

Загружаем RGB картинку из статьи:

Превращаем в серое изображение:

Фильтруем DOG фильтром и переводим серое в бинарное, не заморачиваясь с порогом. Просто порог больше ноля.

На картинке много мусора, зато нет разрывов в эллипсе и весь эллипс здесь представлен целиком. С помощью морфологических операций удаляем пиксели на контурах объектов, не позволяя объектам разбиться. Остающиеся пиксели составляют скелет изображений.

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

С помощью функции cyclebasis находим замкнутые фигуры и их координаты. Мелкие отбрасываем. Получили несколько кандидатов на звание «Эллипс». Подключаем к делу МНК.

 

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

xi, yi – столбцы координат i-го объекта.

Общее уравнение кривой 2-го порядка

A*xi2 + 2*B*xi*yi+C*yi2 + 2*D*xi+ 2*E*yi+ 1 = 0

Для нахождения коэффициентов уравнения решаем переопределенную систему линейных уравнений методом МНК

ab=[xi.^2   xi.*yi   yi.^2   xi   yi]; b=ones(size(xi',2),1); sb=ab\b;

A=sb(1); B=sb(2)/2; C=sb(3); D=sb(4)/2; E=sb(5)/2; F=-1;

С помощью функции h=fimplicit(@(xh,yh) sb(1)*xh.^2+sb(3)*yh.^2+…); находим координаты приближающего эллипса

xhh=h.XData'; yhh=h.YData';

Для отбраковки кандидатов вычисляем дисперсию приближения данных [xi   yi] вычисленными значениями [xhh   yhh].

dst=dist([xhh yhh],[xi yi]’);

mdst=min(dst’)’;

disper=sum(mdst.^2)/(max(size(mdst))-1)

В качестве эллипса оставляем фигуру с минимальной дисперсией.

Вычисляем параметры эллипса методом инвариантов:

http://www.mathprofi.ru/kak_privesti_uravnenie_linii_2_poryadka_k_kanonicheskomu_vidu.html

ab1 и ab2 – полуоси эллипса, x0 и y0 – координаты центра, alfa – угол наклона оси.

  ab1             ab2             x0            y0               alfa 

 66.051        74.004       129.63    83.043      -63.906

 

Вычисляем периметр эллипса

perimetr=sum( sqrt(diff(xhh).^2+diff(yhh).^2))= 440.3419

Площадь эллипса S = π * ab1 *ab2= 15356

Проверка точности вычисления параметров

Для проверки точности вычисления периметра параметрически зададим окружность

(частный случай эллипса с равными осями)

t=(0:.001:1)*2*pi; x=80*cos(t)+300; y=80*sin(t)+300;

Найдем параметры эллипсов с помощью нашей программы

Точность определения полуосей и координат центра вполне удовлетворительна.

Программа вычислила perimetr =  502.7046

Проверим точность  perimetr = 2*pi*R;   R =80.01

Отсюда pi=perimeter/(2*R)= 502.7046/(2*80.01)= 3.1415. (Точное pi=3.1416….)

Оценим влияние размеров фигуры на точность вычисления дисперсии.

Параметрически зададим 5 эллипсов с полуосями a=(5, 10, 20, 40, 80) и с отношением осей 2:1.

t=(0:.001:1)*2*pi; x=a*cos(t)+x0; y=a/2*sin(t)+y0;

Вычислим дисперсии

Повернем эллипсы на 45 градусов и повторим вычисления

Дисперсия немного погуливает в зависимости от размеров эллипса и от ориентации. Возможно это обусловлено тем что данные xy принимают только целочисленные значения, а вычисленные xy представлены с точностью double. Замечено что дисперсии далеких по форме от эллипсов при не больших размерах сравниваются с дисперсиями эллипсов. Возможно причина похожая.

Теги:
Хабы:
Всего голосов 11: ↑11 и ↓0+11
Комментарии13

Публикации

Ближайшие события