В этом примере показано, как выровнять или зарегистрировать два изображения, которые отличаются поворотом и изменением шкалы. Можно использовать 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)
Используйте Инструмент выбора контрольной точки (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
.
Подгонка нерефлективного преобразования подобия к управляющим точкам.
tform = fitgeotrans(movingPoints,fixedPoints,'nonreflectivesimilarity');
После того, как вы сделали шаги 5 и 6, повторите шаги 4-6, но попробуйте использовать 'affine' вместо 'NonreflectiveSimility'. Что происходит? Являются ли результаты такими же хорошими, как и с 'NonreflectiveSimility'?
Геометрическое преобразование, 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})
The recovered
(справа) качество изображения не соответствует original
(слева) изображение из-за процесса искажения и восстановления. В частности, уменьшение изображения вызывает потерю информации. Программные продукты по ребра обусловлены ограниченной точностью преобразования. Если бы вы выбрали больше точек в шаге 3: Выбор контрольных точек, преобразование было бы более точным.
cpselect
| fitgeotrans
| imref2d
| imresize
| imrotate
| imwarp