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

В этом примере показано, как автоматически определить геометрическое преобразование между парой изображений. Когда одно изображение искажается относительно другого поворотом и шкалой, используйте 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: Оценка преобразования

Найдите преобразование, соответствующее совпадающим парам точек, используя статистически надежный алгоритм M-estimator 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')

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