Найдите поворот изображения и шкалу

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

Шаг 1: Readimage

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

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

Шаг 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)

Шаг 3: выберите Control Points

Используйте Инструмент Выбора Контрольной точки, чтобы выбрать по крайней мере две пары контрольных точек.

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.

Шаг 4: оцените преобразование

Соответствуйте неотражающему преобразованию подобия к своим контрольным точкам.

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

После того, как вы сделаете Шаги 5 и 6, повторите Шаги 4 - 6, но попытайтесь использовать 'аффинно' вместо 'NonreflectiveSimilarity'. Что происходит? Действительно ли результаты так же хороши, как они были с 'NonreflectiveSimilarity'?

Шаг 5: решите для шкалы и угла

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

Пусть кв/см=шкала*потому что(тета)

Пусть ss=шкала*sin(тета)

Затем Tinv = invert(tform) и Tinv.T = [кв/см-ss0ssкв/см0txty1]

где 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})

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

Смотрите также

| | | | |

Похожие темы