В этом примере показано, как использовать анализ 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
'to false увеличивает вычисленное значение 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]);
Знаковые точки данных теперь находятся дальше от их целевых аналогов. Преобразованная тройка теперь является нежелательным зеркальным изображением целевой тройки.
Похоже, что формы могут быть лучше совпадать, если вы перевернули трансформированную форму вверх тормашками. Однако отражение форм сделает преобразование еще хуже, потому что знаковые точки данных будут дальше от их целевых аналогов. Из этого примера ясно, что ручная настройка параметров масштабирования и отражения обычно не оптимальна.