exponenta event banner

Найти поворот изображения и масштаб

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

Шаг 1: Чтение изображения

Чтение изображения в рабочую область.

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')

Figure contains an axes. The axes contains 2 objects of type image, text.

Шаг 2: Изменение размера и поворот изображения

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)

Figure contains an axes. The axes contains an object of type image.

Шаг 3: Выбор контрольных точек

Инструмент «Выбор контрольной точки» используется для выбора по крайней мере двух пар управляющих точек.

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.

Шаг 4: Оценка трансформации

Подгоните нерефлекторное преобразование подобия к контрольным точкам.

tform = fitgeotrans(movingPoints,fixedPoints,'nonreflectivesimilarity');

После выполнения шагов 5 и 6 повторите шаги 4-6, но попробуйте использовать «affine» вместо «NonreflingSimilarity». Что будет? Являются ли результаты такими же хорошими, как и с 'NonreflingSimilarity'?

Шаг 5: Решение для масштаба и угла

Геометрическое преобразование, tform, содержит матрицу преобразования в tform.T. Поскольку известно, что преобразование включает только поворот и масштабирование, математика относительно проста для восстановления масштаба и угла.

Пусть sc = масштаб * cos (тета)

Пусть ss = масштаб * sin (тета)

Затем, Tinv = invert(tform), и Tinv.T = [sc-ss0ssc0txty1]

где 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: Изменить размер и повернуть изображение.

Шаг 6: Восстановление исходного образа

Восстановление исходного образа путем преобразования distorted, повернутое и масштабированное изображение, используя геометрическое преобразование tform и что вы знаете о пространственной привязке original. Пара имя-значение «OutputView» используется для задания разрешения и размера сетки повторно дискретизированного выходного изображения.

Roriginal = imref2d(size(original));
recovered = imwarp(distorted,tform,'OutputView',Roriginal);

Выдержать сравнение recovered кому original глядя на них бок о бок в монтаже.

montage({original,recovered})

Figure contains an axes. The axes contains an object of type image.

recovered (справа) качество изображения не соответствует original (слева) из-за процесса искажения и восстановления. В частности, уменьшение изображения вызывает потерю информации. Артефакты вокруг рёбер обусловлены ограниченной точностью преобразования. Если выбрать больше точек в шаге 3: Выбрать контрольные точки, преобразование будет более точным.

См. также

| | | | |

Связанные темы