Емельянов Эдуард Владимирович (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

  • Хеши строковых команд для МК

    Долго я к этому шел, но, похоже, пора уже: однобуквенные команды сложно запоминать (особенно если команд толпа, и большая часть с этими буквами…

  • OBS studio

    В общем, надоумили меня попробовать трансляцию в youtube. Напрямую скринкасты он писать не умеет, но может забирать поток с промежуточного…

  • M$ teams…

    Начал с сегодняшнего дня студентам ЮФУ удаленно лекции читать. У них все завязано на различные корпорации зла. И базовая работа - через teams. ОК,…

promo eddy_em september 3, 12:13 8
Buy for 10 tokens
Уже больше полугода занимаюсь разработкой, вот, наконец-то в мастерских взялись за меня и начали выдавать первые детали. Сегодня сделал тестовую сборку (как обычно, местами пришлось "доработать напильником"): Пока прибор без названия (да и как-то не лезет в голову ничего, у меня нет…
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments