Найдите поворот изображения и шкалу Используя автоматизированное соответствие функции

Этот пример показывает, как автоматически выровнять два изображения, которые отличаются вращением и изменением шкалы. Это тесно параллельно другому названному примеру, Находят Поворот изображения и Шкалу. Вместо того, чтобы использовать ручной подход, чтобы указать два изображения, это использует основанные на функции методы, найденные в Системе Компьютерного зрения Toolbox™, чтобы автоматизировать процесс регистрации.

В этом примере вы будете использовать detectSURFFeatures и Системный объект vision.GeometricTransformEstimator, чтобы восстановить угол поворота и масштабный коэффициент искаженного изображения. Вы затем преобразуете искаженное изображение, чтобы восстановить оригинальное изображение.

Шаг 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;
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-средства-оценки (MSAC) алгоритм, который является вариантом алгоритма RANSAC. Это удаляет выбросы при вычислении матрицы преобразования. Можно видеть переменные результаты вычисления преобразования из-за случайной выборки, используемой алгоритмом MSAC.

[tform, inlierDistorted, inlierOriginal] = estimateGeometricTransform(...
    matchedDistorted, matchedOriginal, 'similarity');

Отобразите соответствие с парами точки, используемыми в вычислении матрицы преобразования.

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

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

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

Let sc = scale*cos(theta)
Let ss = scale*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);
scale_recovered = sqrt(ss*ss + sc*sc)
theta_recovered = atan2(ss,sc)*180/pi
scale_recovered =

  single

    0.7010


theta_recovered =

  single

   30.2351

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

Шаг 6: восстановите оригинальное изображение

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

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

Сравните recovered с original путем рассмотрения их бок о бок в монтаже.

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

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

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

| | | | | | | |