В этом примере показано, как автоматически определить геометрическое преобразование между парой изображений. Когда одно изображение искажается относительно другого поворотом и шкалой, используйте detectSURFFeatures
и estimateGeometricTransform2D
для поиска угла поворота и масштабного коэффициента. Затем можно преобразовать искаженное изображение, чтобы восстановить оригинальное изображение.
Пронесите изображение в рабочую область.
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; J = imresize(original, scale); % Try varying the scale factor. theta = 30; distorted = imrotate(J,theta); % Try varying the angle, theta. figure, imshow(distorted)
Можно экспериментировать, варьируя шкалу и поворот входного изображения. Однако обратите внимание, что существует предел на величину, которую вы можете изменить шкалу, прежде чем детектор функции не найдет достаточные функции.
Обнаружение функций в обоих изображениях.
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)');
Найдите преобразование, соответствующее совпадающим парам точек, используя статистически надежный алгоритм 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');
Используйте геометрическое преобразование 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: Изменить размер и повернуть изображение.
Восстановите оригинальное изображение путем преобразования искаженного изображения.
outputView = imref2d(size(original));
recovered = imwarp(distorted,tform,'OutputView',outputView);
Сравнение recovered
на original
глядя на них бок о бок в монтаже.
figure, imshowpair(original,recovered,'montage')
The recovered
(справа) качество изображения не соответствует original
(слева) изображение из-за процесса искажения и восстановления. В частности, уменьшение изображения вызывает потерю информации. Программные продукты по ребра обусловлены ограниченной точностью преобразования. Если бы вы обнаружили больше точек в шаге 3: Найти совпадающие функции между изображениями, преобразование было бы более точным. Например, мы могли бы использовать детектор углов, detectFASTFeatures, чтобы дополнить детектор функций SURF, который находит blobs. Содержимое изображения и размер изображения также влияют на количество обнаруженных признаков.