eddy_em: (Default)
[personal profile] 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пиксель, можно будет говорить о состоятельности метода). Однако, и с этим методом можно провести "работу над ошибками": мы не учли смещения изображений от кадру к кадру. Если эти смещения носят стохастический характер, на результат влияния почти никакого бы не было, но если характер смещений систематический, результат значительно ухудшится. Поэтому можно после вычисления координат центра провести следующую итерацию - для установления значения смещений; затем по этим смещениям уточнить координаты центра и т.д.

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 24th, 2025 08:58 pm
Powered by Dreamwidth Studios