Этот пример показывает, как использовать анализ Procrustes, чтобы сравнить две рукописных тройки номера. Визуально и аналитически исследуйте эффекты принуждения размера и отражательных изменений.
Введите знаменательные данные для двух рукописных троек номера.
A = [11 39;17 42;25 42;25 40;23 36;19 35;30 34;35 29;... 30 20;18 19]; B = [15 31;20 37;30 40;29 35;25 29;29 31;31 31;35 20;... 29 10;25 18];
Создайте X
и Y
от A
и B
, переместив B
в сторону, чтобы сделать каждую форму более видимой.
X = A; Y = B + repmat([25 0], 10,1);
Постройте формы, с помощью букв, чтобы определять поворотные моменты. Строки в фигуре соединяют точки, чтобы указать на путь к рисунку каждой формы.
plot(X(:,1), X(:,2),'r-', Y(:,1), Y(:,2),'b-'); text(X(:,1), X(:,2),('abcdefghij')') text(Y(:,1), Y(:,2),('abcdefghij')') legend('X = Target','Y = Comparison','location','SE') xlim([0 65]); ylim([0 55]);
Используйте анализ Procrustes, чтобы найти преобразование, которое минимизирует расстояния между знаменательными точками данных.
[d,Z,tr] = procrustes(X,Y);
Выходными параметрами функции является d
(стандартизированная мера по несходству), Z
(матрица преобразованных ориентиров), и tr
(массив структур вычисленного преобразования с полями T
, b
и c
, которые соответствуют уравнению преобразования).
Визуализируйте преобразованную форму, Z
, с помощью пунктирной синей строки.
plot(X(:,1), X(:,2),'r-', Y(:,1), Y(:,2),'b-',... Z(:,1),Z(:,2),'b:'); text(X(:,1), X(:,2),('abcdefghij')') text(Y(:,1), Y(:,2),('abcdefghij')') text(Z(:,1), Z(:,2),('abcdefghij')') legend('X = Target','Y = Comparison',... 'Z = Transformed','location','SW') xlim([0 65]); ylim([0 55]);
Используйте два различных численных значения, мера по несходству d
и масштабирующаяся мера b
, чтобы оценить подобие целевой формы и преобразованной формы.
Мера по несходству d
дает номер между 0 и 1 описанием различия между целевой формой и преобразованной формой. Значения около 0 подразумевают более подобные формы, в то время как значения около 1 подразумевают несходство.
d
d = 0.1502
Маленькое значение d
в этом случае показывает, что две формы подобны. procrustes
вычисляет d
путем сравнения суммы отклонений в квадрате между набором точек с суммой отклонений в квадрате исходных точек от их средних значений столбца.
numerator = sum(sum((X-Z).^2))
numerator = 166.5321
denominator = sum(sum(bsxfun(@minus,X,mean(X)).^2))
denominator = 1.1085e+03
ratio = numerator/denominator
ratio = 0.1502
Получившаяся мера d независима от шкалы размера форм и учитывает только подобие знаменательных данных.
Исследуйте подобие размера форм.
tr.b
ans = 0.9291
Размеры цели и форм сравнения в предыдущей фигуре кажутся подобными. Это визуальное впечатление укреплено значением b
= % 0.93, который подразумевает, что лучшее преобразование приводит к уменьшению формы сравнения фактором.93 (только 7%).
Исследуйте эффекты ручной корректировки масштабирования и отражательных коэффициентов.
Обеспечьте b
, чтобы равняться 1 (установите 'Scaling'
на ложь) исследовать сумму несходства в размере цели и преобразованных фигур.
ds = procrustes(X,Y,'Scaling',false)
ds = 0.1552
В этом случае установка 'Scaling
'ко лжи увеличивает расчетное значение d
только 0,0049, который дальнейшие поддержки подобие в размере двух троек номера. Большее увеличение d
указало бы на большее несоответствие размера.
Этот пример требует, чтобы только вращение, не отражение, выровняло формы. Можно показать это путем замечания, что детерминант матричного T
1 в этом анализе.
det(tr.T)
ans = 1.0000
Если вам нужно отражение в преобразовании, детерминант T
-1. Можно обеспечить отражение в преобразование можно следующим образом.
[dr,Zr,trr] = procrustes(X,Y,'Reflection',true);
dr
dr = 0.8130
D повышения стоимости существенно, указывая, что принудительное отражение приводит к плохому преобразованию поворотных моментов. График преобразованной формы показывает подобный результат.
plot(X(:,1), X(:,2),'r-', Y(:,1), Y(:,2),'b-',... Zr(:,1),Zr(:,2),'b:'); text(X(:,1), X(:,2),('abcdefghij')') text(Y(:,1), Y(:,2),('abcdefghij')') text(Zr(:,1), Zr(:,2),('abcdefghij')') legend('X = Target','Y = Comparison',... 'Z = Transformed','Location','SW') xlim([0 65]); ylim([0 55]);
Знаменательные точки данных теперь еще дальше от их целевых дубликатов. Преобразованные три являются теперь нежелательным зеркальным отображением цели три.
Кажется, что формы могут быть лучше соответствующими, если вы инвертировали преобразованную форму вверх тормашками. Зеркальное отражение форм сделало бы преобразование еще хуже, однако, потому что знаменательные точки данных будут еще дальше от их целевых дубликатов. От этого примера ясно, что вручную корректировка масштабирования и отражательных параметров обычно не оптимальна.