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

  • Чем бы таким заменить STM32F072C8T6?

    Полез сейчас на али цены посмотреть, а там… В среднем уже по 600-700 рублей за штучку просят! Вообще охамели. И это - гарантированно БУшные ведь!.. А…

  • Понаблюдал, блин!

    Опять у нас что-то с сетью поломали. Хотел было протестировать, как наша подвесная часть оптоволоконного спектрографа работает, а из дома связь с…

  • Липовые STM32F303CBT6

    Купили недавно на али на работу десяток вышеупомянутых МК (причем, недешево: около 600р за штучку при красной цене в 200р!). И вот, сижу, на своей…

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