В этом примере показано, как выровнять или указать два изображения, которые отличаются вращением и изменением шкалы. Можно использовать 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, затем Точки сохранения к опции Рабочей области. Сохраните точки, перезаписав переменные movingPoints
и fixedPoints
.
Соответствуйте неотражающему преобразованию подобия к своим контрольным точкам.
tform = fitgeotrans(movingPoints,fixedPoints,'nonreflectivesimilarity');
После того, как вы сделаете Шаги 5 и 6, повторите Шаги 4 - 6, но попытайтесь использовать 'affine'
вместо 'NonreflectiveSimilarity'
. Что происходит? Результаты, столь же хорошие, как они были с 'NonreflectiveSimilarity'
?
Геометрическое преобразование, 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: Выберите Control Points, преобразование было бы более точным.
imresize
| imrotate
| cpselect
| fitgeotrans
| imwarp
| imref2d