Поиск вращения и шкалы изображения

В этом примере показано, как выровнять или зарегистрировать два изображения, которые отличаются поворотом и изменением шкалы. Можно использовать 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: Выбор контрольных точек

Используйте Инструмент выбора контрольной точки (Control Point Selection Tool), чтобы выбрать по крайней мере две пары контрольных точек.

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' вместо 'NonreflectiveSimility'. Что происходит? Являются ли результаты такими же хорошими, как и с 'NonreflectiveSimility'?

Шаг 5: Решение для шкалы и угла

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

Давайте sc=scale*cos(theta)

Давайте ss=scale*sin(theta)

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

где 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.

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

См. также

| | | | |

Похожие темы

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