Комментарии 13
Я бы использовал Преобразование Хафа (в 5 измерений!) для поиска начального приближения эллипсов и Ransac для уточнения. Будет заметно тяжелее но надежнее .Ваш метод будет иметь неплохой precision но низкий recall изза шумов на изображении...
Я проверил влияние шумов на результаты метода. Например, нам необходимо найти как можно точнее параметры эллипсов, аппроксимирующие очертание глаз у различных животных. Зверушки имеют разнообразный окрас (разные типы шумов) и различное очертание глаз. Благодаря щадящей предварительной обработке изображения (фильтрация DOG и морфологические операции) все замкнутые границы остаются неповрежденными. Зато появляются замкнутые фигуры по форме далекие от эллипсов. Т.е. вопреки Вашим утверждениям метод имеет плохой precision но неплохой recall по крайней мере для этой проверочной модели. Лишние замкнутые циклы имеют более высокую дисперсию что и позволяет их отсеивать.
Иногда попадаются лишние циклы с низкой дисперсией
Тогда можно (увы, только в рамках этой проверочной модели) создать маску и поискать зрачки. Они почти черные и на фоне белков глаз легко обнаруживаются. И чтобы окончательно убедиться в правильности выбора можно еще сравнить расстояние между зрачками и расстоянием между центрами эллипсов.
Благодарю Вас за наводку на работу в паре Преобразования Хафа (в 5 измерений!) и Ransac. Хотя ходят слухи что, когда число параметров большое (больше 3) алгоритм должен использоваться с большой осторожностью. Попробую разобраться. Спасибо.
Ransac по любому стоит использовать. Очень мощный метод.
Спасибо. Погружаюсь в тему. Очень интересно!
Решил проверить возможность применения Ransac для повышения точности вычисления параметров эллипса.
Вычисления Ransac проводились с помощью функции Матлаб:
[model,inlierIdx] = ransac(data,fitFcn,distFcn,sampleSize,maxDistance).
Полное ее описание и пример по адресу:
https://docs.exponenta.ru/vision/ref/ransac.html
Зададим параболу y=x^2:
xx = -10: .2: 10; yy = xx . ^ 2; %__101 точка__
Проверка:
МНК справился идеально. Ransac нечего улучшать.
Добавим несколько выбросов:
yy([20,40,60,80]) = [yy(20)+120,yy(40)-120,yy(60)+330, yy(80)-230];
Убираем выбросы и добавляем нормальный шум:
yy = yy + 5 * randn(1, max(size(yy)));
Ransac конечно мощный инструмент для отбраковки из выборки выбросов для дальнейшей статистической обработки.
Ransac не помощник в моей программе. Применение графов для выявления циклов заодно позволяет избавиться от несвязных изолированных точек.
Ransac тоже нужно настраивать. LS работает только с нормальным распределением ошибок, без outliers.
Вы прокомментировали: «LS работает только с нормальным распределением ошибок, без outliers.» Да, как мы убедились outliers сильно мешает LS. Но Ransac идеально спасает ситуацию.
Но почему «LS работает только с нормальным распределением ошибок»?
Проведем эксперимент. Добавим к параболе какой ни будь экзотический шум:
xx = -10 : .2: 10;
yy = xx .^2;
yy = yy + 15*(sin(xx*2));
Вторая попытка. Задаем шум:
Прибавляем к параболе и на анализ:
Вполне возможно, что я чего-то не учитываю. Но на этих двух примерах LS справляется с задачей при анализе сигнала с шумами распределения которых и близко не похожи на нормальные.
А как же python!? Хочу на питоне!
Подробное объяснение использования пакета python, сравнимого с matlab при обработке изображений, пакет scikit-image (skimage) есть здесь:
https://russianblogs.com/article/6003851490/
Алгоритм нахождения фундаментального набора циклов графа (аналог матлабовской функции cyclebasis ) на Питоне есть здесь:
Возникнут вопросы - постараюсь ответить. Удачи!!!
Мне нужно как раз инвариантное преобразование -то есть уравнение получили, а теперь его к простейшему. И угол поворота эллипса относительно выбранных координат. Спасибо!
В статье есть ссылка в которой приведен пример в котором подробнейшим образом разобрано как из конкретных параметров уравнения получить координаты центра эллипса, длины полуосей и угол поворота. Вот эта ссылка:
http://www.mathprofi.ru/kak_privesti_uravnenie_linii_2_poryadka_k_kanonicheskomu_vidu.html
Прочитав этот материал можно легко написать программу на любом языке (да хоть на Питоне :--)))))))) шутка).
На матлабе у меня получилось так:
function regpro=kanon(sb)
%sb=[13 18 37 -26 -18]
%__A*xi^2 + 2*B*xi*yi+C*yi^2 + 2*D*xi+ 2*E*yi+ 1 = 0
A=sb(1);
B=sb(2)/2;
C=sb(3);
D=sb(4)/2;
E=sb(5)/2;
F=-1;%_______!!!!!!!!!
%__Инварианты
S=A+C;
d=det([A B;B C]);
del=det([A B D;B C E;D E F]);
%__Оси эллипса ________________________
De=double(S)^2-41double(d);
a111=(S-sqrt(De))/2;
c111=S-a111;
a112=(S+sqrt(De))/2;
c112=S-a112;
f111=del/d;
ab1=abs(sqrt(-f111./a111));%__полуось 1
ab2=abs(sqrt(-f111./a112));%__полуось 2
%______________________________________
%__Координаты центра _________________
a=[A B;B C];
b=-[D;E];
s=a\b;
x0=s(1);y0=s(2);%__кординаты центра
%Elapsed time is 0.002392 seconds.
%Угол наклона осей_______________
tg=double((a112-A)/B);
alfa=atan(tg)*180/pi;
%____________________________________
%__формируем табличку из результатов
regpro=table;
regpro.ab1=ab1;
regpro.ab2=ab2;
regpro.x0=x0;
regpro.y0=y0;
regpro.alfa=alfa;
regpro;
Программа поиска эллипсов и определения их параметров МНК