Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Сравнение алгоритмов определения координат центра

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

Здесь я опишу реализацию алгоритмического метода и сравню его с методом определения центра вращения по пересечениям радиусов окружности.

Второй алгоритм

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

function [Xc Yc] = matr_center(i0, i1, treshold, dR, dPhi)
%
%		[Xc Yc] = matr_center(i0, i1, treshold, dR, dPhi)
% Вычисляет координаты центра кадра, исходя из матричных операций
% Вход:
%   i1, in - начальный и конечный номера изображений
%   treshold - порог для поиска пятен
%	dR, dPhi - допуск по полярным координатам (чтобы считать точки близкими)
% Выход:
%	Xc, Yc - центр кадра
%
	n = 0; i_start = i0;
	im1 = 0;
	Xc = []; Yc = [];
	do
		[CC xc yc] = get_tree(treshold, i_start);
		im1 = i_start;
		i_start++;
	until(!isempty(CC) || i_start > i1)
	for i = i_start:i1
		[CC1 xc1 yc1] = get_tree(treshold, i);
		if(isempty(CC1)) continue; endif
		printf("pair %d: images %d and %d\n", ++n, im1, i);
		im1 = i;
		indexes = find_cluster_c(CC, CC1, dR, dPhi);
		% выделяем координаты одних и тех же объектов
		X0 = xc(indexes(:,1));
		X1 = xc1(indexes(:,2));
		Y0 = yc(indexes(:,1));
		Y1 = yc1(indexes(:,2));
		% получаем матрицу геометрического преобразования
		A = [X1;Y1;ones(size(X1))]/[X0;Y0;ones(size(X1))];
		% вычисляем примерные координаты центра
		CRDS = (eye(2)-A(1:2,1:2)) \ A(1:2,3);
		Xc = [Xc CRDS(1)]; Yc = [Yc CRDS(2)]; % накапливаем центры
		printf("Center: (%g, %g)\n", CRDS(1), CRDS(2));
		CC = CC1; xc = xc1; yc = yc1;% передаем параметры для следующей пары
	endfor
endfunction

Сравнение алгоритмов

Я провел вычисления на основе 146 изображений. В результате получилось следующее: первый метод (по пересечениям радиусов) дал медианные значения Xc=1502.4, Yc=1355.5, но при этом получился жуткий разброс результатов: σx=3259.8, σy=3663.0 - больше размера изображения!

Приведу графики распределения вычисленных при помощи первого метода "центров":

Первый метод

разброс просто поражает! Вот увеличенная область вокруг медианного значения:
Первый метод, увеличение

Второй метод (матричный) дал медианные значения Xc=1507.1, Yc=1349.7, погрешность его σx=365.41 и σy=290.29 значительно меньше, чем у первого метода. Но все еще слишком велика.

Приведу графики:

Второй метод

и увеличенный:
Второй метод, увеличено

Заключение

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

Матричный метод вычисления дал значительно меньшую погрешность, но все еще слишком большую (когда среднеквадратичное отклонение вычислений не будет превышать 1-3пиксель, можно будет говорить о состоятельности метода). Однако, и с этим методом можно провести "работу над ошибками": мы не учли смещения изображений от кадру к кадру. Если эти смещения носят стохастический характер, на результат влияния почти никакого бы не было, но если характер смещений систематический, результат значительно ухудшится. Поэтому можно после вычисления координат центра провести следующую итерацию - для установления значения смещений; затем по этим смещениям уточнить координаты центра и т.д.

Tags: octave, обработка изображений, отождествление объектов
Subscribe

  • Набросок лекции

    В этом году первая сессия второго набора АФШ, к сожалению, пройдет в "дистанционном режиме". Меня попросили подготовить лекцию по БТА. Впервые я пишу…

  • Тебе скучно? Обнови генту!

    После обновления генты отчет обсерватории (он на скриншоте в предыдущей заметке) перестал компилироваться. Латех ругался на непонятные ошибки (знак…

  • Вычисления в латехе? Да запросто!

    Те, кому приходится верстать тексты посложнее служебок, знают, что латех — удобная надстройка над техом — на данный момент является чуть ли не…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments