Сравнение рукописных фигур с помощью анализа Procrustes

В этом примере показано, как использовать анализ 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]);

Figure contains an axes. The axes contains 22 objects of type line, text. These objects represent X = Target, Y = Comparison.

Вычислите лучшее преобразование

Используйте анализ 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]);

Figure contains an axes. The axes contains 33 objects of type line, text. These objects represent X = Target, Y = Comparison, Z = Transformed.

Исследуйте подобие двух форм

Используйте два разных числовых значения, меру неоднородности 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]);

Figure contains an axes. The axes contains 33 objects of type line, text. These objects represent X = Target, Y = Comparison, Z = Transformed.

Знаковые точки данных теперь находятся дальше от их целевых аналогов. Преобразованная тройка теперь является нежелательным зеркальным изображением целевой тройки.

Похоже, что формы могут быть лучше совпадать, если вы перевернули трансформированную форму вверх тормашками. Однако отражение форм сделает преобразование еще хуже, потому что знаковые точки данных будут дальше от их целевых аналогов. Из этого примера ясно, что ручная настройка параметров масштабирования и отражения обычно не оптимальна.

См. также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте