![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Здесь я опишу реализацию алгоритмического метода и сравню его с методом определения центра вращения по пересечениям радиусов окружности.
Второй алгоритм
Реализация алгоритма вычисления центра вращения на основе матричных преобразований почти полностью идентична вычислению координат пересечения радиусов окружности, только после идентификации объектов мы сразу вычисляем координаты центра. Вот код:
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пиксель, можно будет говорить о состоятельности метода). Однако, и с этим методом можно провести "работу над ошибками": мы не учли смещения изображений от кадру к кадру. Если эти смещения носят стохастический характер, на результат влияния почти никакого бы не было, но если характер смещений систематический, результат значительно ухудшится. Поэтому можно после вычисления координат центра провести следующую итерацию - для установления значения смещений; затем по этим смещениям уточнить координаты центра и т.д.