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

Комментарии 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];

 

МНК заметно «скис», но Ransac идеально исправил ситуацию!!! Из 101 точки осталось:
МНК заметно «скис», но Ransac идеально исправил ситуацию!!! Из 101 точки осталось:
101-97=4. Т.е. Ransac аккуратно убрал 4 выброса и выдал идеальный результат!
101-97=4. Т.е. Ransac аккуратно убрал 4 выброса и выдал идеальный результат!

Убираем выбросы и добавляем нормальный шум:

yy = yy + 5 * randn(1, max(size(yy)));

Синяя линия и точки – исходные данные. Красные точки – результат МНК. Зеленые кружки с синими точками внутри – исходные точки, оставленные Ransac для улучшения результатов МНК.
Синяя линия и точки – исходные данные. Красные точки – результат МНК. Зеленые кружки с синими точками внутри – исходные точки, оставленные Ransac для улучшения результатов МНК.
МНК «вытащил» не плохой результат, Ransac пытался помочь, но не смог :--((((. Ransac убрал:
МНК «вытащил» не плохой результат, Ransac пытался помочь, но не смог :--((((. Ransac убрал:
101-24= 77 неугодных ему точек, но результат МНК не улучшил.
101-24= 77 неугодных ему точек, но результат МНК не улучшил.

Ransac конечно мощный инструмент для отбраковки из выборки выбросов для дальнейшей статистической обработки.

Ransac не помощник в моей программе. Применение графов для выявления циклов заодно позволяет избавиться от несвязных изолированных точек.

 

 

Ransac тоже нужно настраивать. LS работает только с нормальным распределением ошибок, без outliers.

Вы прокомментировали: «LS работает только с нормальным распределением ошибок, без outliers.» Да, как мы убедились outliers сильно мешает LS. Но Ransac идеально спасает ситуацию.

Но почему «LS работает только с нормальным распределением ошибок»?

Проведем эксперимент. Добавим к параболе какой ни будь экзотический шум:

xx = -10 : .2: 10;

yy = xx .^2;

yy = yy + 15*(sin(xx*2));

Синяя линия и точки – исходные данные. Красные точки – результат МНК. Зеленые кружки с синими точками внутри – исходные точки, оставленные Ransac для улучшения результатов МНК.
Синяя линия и точки – исходные данные. Красные точки – результат МНК. Зеленые кружки с синими точками внутри – исходные точки, оставленные Ransac для улучшения результатов МНК.
LS идеально справился с этим шумом хотя распределение шума далеко от нормального:
LS идеально справился с этим шумом хотя распределение шума далеко от нормального:

 Вторая попытка. Задаем шум:

yy=15*sign(sin(xx*2+5*rand(101,1)')).*exp(-xx*.09);
yy=15*sign(sin(xx*2+5*rand(101,1)')).*exp(-xx*.09);

Прибавляем к параболе и на анализ:

LS тоже справился. Правда с точностью 0.98.
LS тоже справился. Правда с точностью 0.98.
Распределение этого шума тоже далеко от нормального – скорее всего это похоже на экспоненциальное распределение.
Распределение этого шума тоже далеко от нормального – скорее всего это похоже на экспоненциальное распределение.

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

А как же python!? Хочу на питоне!

Подробное объяснение использования пакета python, сравнимого с matlab при обработке изображений, пакет scikit-image (skimage) есть здесь:

https://russianblogs.com/article/6003851490/

Алгоритм нахождения фундаментального набора циклов графа (аналог матлабовской функции cyclebasis ) на Питоне есть здесь:

https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.cycles.cycle_basis.html

Возникнут вопросы - постараюсь ответить. Удачи!!!

Мне нужно как раз инвариантное преобразование -то есть уравнение получили, а теперь его к простейшему. И угол поворота эллипса относительно выбранных координат. Спасибо!

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

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;

Прошу прощения. Перечитывая мое сообщение обнаружил ошибку. Это не моя ошибка. Она возникла при переносе текста из редактора Матлаб. Надо было просто скопировать изображение и переслать. Должно быть так:

Я на Харбре новичок. Теперь буду знать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации