exponenta event banner

Поиск поворота изображения и масштабирования с помощью автоматического согласования элементов

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

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

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

scale = 0.7;
J = imresize(original, scale); % Try varying the scale factor.

theta = 30;
distorted = imrotate(J,theta); % Try varying the angle, theta.
figure, imshow(distorted)

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

Шаг 3: Поиск соответствующих функций между изображениями

Обнаружение функций на обоих изображениях.

ptsOriginal  = detectSURFFeatures(original);
ptsDistorted = detectSURFFeatures(distorted);

Извлечь дескрипторы элементов.

[featuresOriginal,  validPtsOriginal]  = extractFeatures(original,  ptsOriginal);
[featuresDistorted, validPtsDistorted] = extractFeatures(distorted, ptsDistorted);

Сопоставьте элементы с помощью их дескрипторов.

indexPairs = matchFeatures(featuresOriginal, featuresDistorted);

Извлеките местоположения соответствующих точек для каждого изображения.

matchedOriginal  = validPtsOriginal(indexPairs(:,1));
matchedDistorted = validPtsDistorted(indexPairs(:,2));

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

figure;
showMatchedFeatures(original,distorted,matchedOriginal,matchedDistorted);
title('Putatively matched points (including outliers)');

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

Найдите преобразование, соответствующее парам точек согласования, используя статистически надежный алгоритм SAmple Consensus (MSAC), который является вариантом алгоритма RANSAC. Он удаляет отклонения при вычислении матрицы преобразования. Вы можете видеть различные результаты вычисления преобразования из-за случайной выборки, используемой алгоритмом MSAC.

[tform, inlierIdx] = estimateGeometricTransform2D(...
    matchedDistorted, matchedOriginal, 'similarity');
inlierDistorted = matchedDistorted(inlierIdx, :);
inlierOriginal  = matchedOriginal(inlierIdx, :);

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

figure;
showMatchedFeatures(original,distorted,inlierOriginal,inlierDistorted);
title('Matching points (inliers only)');
legend('ptsOriginal','ptsDistorted');

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

Используйте геометрическое преобразование tform для восстановления масштаба и угла. Поскольку мы рассчитали преобразование из искаженного в исходное изображение, нам нужно вычислить его обратное для восстановления искажения.

Let sc = s*cos(theta)
Let ss = s*sin(theta)
Then, Tinv = [sc -ss  0;
              ss  sc  0;
              tx  ty  1]
where tx and ty are x and y translations, respectively.

Вычислите матрицу обратного преобразования.

Tinv  = tform.invert.T;

ss = Tinv(2,1);
sc = Tinv(1,1);
scaleRecovered = sqrt(ss*ss + sc*sc)
thetaRecovered = atan2(ss,sc)*180/pi
scaleRecovered =

  single

    0.7010


thetaRecovered =

  single

   30.2351

Восстановленные значения должны совпадать со значениями масштаба и угла, выбранными на шаге 2: Изменить размер и повернуть изображение.

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

Восстановите исходное изображение путем преобразования искаженного изображения.

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

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

figure, imshowpair(original,recovered,'montage')

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