В этом примере показано, как выровнять или зарегистрировать два изображения, отличающихся поворотом и изменением масштаба. Вы можете использовать fitgeotrans для определения угла поворота и масштабного коэффициента после выбора соответствующих точек вручную. Затем можно преобразовать искаженное изображение для восстановления исходного изображения.
Чтение изображения в рабочую область.
original = imread('cameraman.tif'); imshow(original) text(size(original,2),size(original,1)+15, ... 'Image courtesy of Massachusetts Institute of Technology', ... 'FontSize',7,'HorizontalAlignment','right')

scale = 0.7; distorted = imresize(original,scale); % Try varying the scale factor. theta = 30; distorted = imrotate(distorted,theta); % Try varying the angle, theta. imshow(distorted)

Инструмент «Выбор контрольной точки» используется для выбора по крайней мере двух пар управляющих точек.
movingPoints = [151.52 164.79; 131.40 79.04]; fixedPoints = [135.26 200.15; 170.30 79.30];
Можно выполнить остальную часть примера с этими предварительно выбранными точками, но попытаться выбрать собственные точки, чтобы увидеть, как результаты различаются.
cpselect(distorted,original,movingPoints,fixedPoints);
Сохраните управляющие точки, выбрав пункт меню Файл (File), а затем пункт Сохранить точки в рабочей области (Save Points to Workspace). Сохранение точек, перезапись переменных movingPoints и fixedPoints.
Подгоните нерефлекторное преобразование подобия к контрольным точкам.
tform = fitgeotrans(movingPoints,fixedPoints,'nonreflectivesimilarity');После выполнения шагов 5 и 6 повторите шаги 4-6, но попробуйте использовать «affine» вместо «NonreflingSimilarity». Что будет? Являются ли результаты такими же хорошими, как и с 'NonreflingSimilarity'?
Геометрическое преобразование, tform, содержит матрицу преобразования в tform.T. Поскольку известно, что преобразование включает только поворот и масштабирование, математика относительно проста для восстановления масштаба и угла.
Пусть тета)
Пусть тета)
Затем, Tinv = invert(tform), и Tinv.T =
где tx и ty являются трансляциями x и y соответственно.
tformInv = invert(tform); Tinv = tformInv.T; ss = Tinv(2,1); sc = Tinv(1,1); scale_recovered = sqrt(ss*ss + sc*sc)
scale_recovered = 0.7000
theta_recovered = atan2(ss,sc)*180/pi
theta_recovered = 29.3741
Восстановленные значения scale_recovered и theta_recovered должны соответствовать значениям, заданным на шаге 2: Изменить размер и повернуть изображение.
Восстановление исходного образа путем преобразования distorted, повернутое и масштабированное изображение, используя геометрическое преобразование tform и что вы знаете о пространственной привязке original. Пара имя-значение «OutputView» используется для задания разрешения и размера сетки повторно дискретизированного выходного изображения.
Roriginal = imref2d(size(original));
recovered = imwarp(distorted,tform,'OutputView',Roriginal);Выдержать сравнение recovered кому original глядя на них бок о бок в монтаже.
montage({original,recovered})
recovered (справа) качество изображения не соответствует original (слева) из-за процесса искажения и восстановления. В частности, уменьшение изображения вызывает потерю информации. Артефакты вокруг рёбер обусловлены ограниченной точностью преобразования. Если выбрать больше точек в шаге 3: Выбрать контрольные точки, преобразование будет более точным.
cpselect | fitgeotrans | imref2d | imresize | imrotate | imwarp