Соответствие изображений с различными ориентациями и масштабами в MATLAB

У меня есть два изображения, которые похожи, но отличаются ориентацией и размером. Ниже приведен пример:

enter image description hereenter image description here

Есть ли способ сопоставить два изображения?

Я использовал анализ формы Procrustes, но есть ли другие способы?

+5
18 мар. '15 в 16:15
источник поделиться
4 ответа

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

enter image description here

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

+6
18 мар. '15 в 17:23
источник

Здесь что-то, чтобы вы начали. Что вы просите - это классическая проблема, известная как регистрация изображений. Регистрация изображений направлена ​​на поиск правильной гомографии, которая берет одно изображение и выравнивает его с другим. Это включает в себя поиск интереса или ключевых точек, которые являются общими между двумя изображениями, и определения того, какие ключевые точки совпадают между двумя изображениями. Когда у вас есть эти пары точек, вы определяете матрицу гомографии и деформируете одно из изображений так, чтобы они были выровнены с другим с указанной матрицей.

Я собираюсь предположить, что у вас есть компьютерные ящики для обработки изображений и обработки изображений, которые являются частью MATLAB. Если вы этого не сделаете, то ответ, который дал Мауриц, является хорошей альтернативой, а VLFeat Toolbox - это тот, который я также использовал.

Сначала давайте читаем изображения непосредственно из StackOverflow:

im = imread('http://i.stack.imgur.com/vXqe8.png');
im2 = imread('http://i.stack.imgur.com/Pd7pt.png');

im_gray = rgb2gray(im);
im2_gray = rgb2gray(im2);

Нам также нужно преобразовать в оттенки серого, поскольку для алгоритмов обнаружения ключевых точек требуется изображение в градациях серого. Затем мы можем использовать любой алгоритм обнаружения признаков, который является частью MATLAB CVST.... Я собираюсь использовать SURF, поскольку это по существу то же, что и SIFT, но с некоторыми незначительными, но ключевыми различиями. Вы можете использовать функцию detectSURFFeatures, которая является частью панели инструментов CVST, и она принимает изображения в оттенках серого. Вывод представляет собой структуру, которая содержит кучу информации о каждой точке объекта, которую алгоритм обнаружил для изображения. Пусть это применимо к обоим изображениям (в оттенках серого).

points = detectSURFFeatures(im_gray);
points2 = detectSURFFeatures(im2_gray);

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

[features1, validPoints1] = extractFeatures(im_gray, points);
[features2, validPoints2] = extractFeatures(im2_gray, points2);

Теперь пришло время сопоставить функции между двумя изображениями. Это можно сделать с помощью matchFeatures, и он использует функции между двумя изображениями:

indexPairs = matchFeatures(features1, features2);

indexPairs - это 2D-массив, в котором первый столбец сообщает вам, какая точка объекта из первого изображения совпадает с изображением второго изображения, сохраненного во втором столбце. Мы будем использовать это, чтобы индексировать наши действительные точки, чтобы определить, что на самом деле соответствует.

matchedPoints1 = validPoints1(indexPairs(:, 1), :);
matchedPoints2 = validPoints2(indexPairs(:, 2), :);

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

figure;
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage');

Это то, что я получаю:

enter image description here

Это не идеально, но он, безусловно, находит согласованные совпадения между двумя изображениями.

Теперь нам нужно сделать следующее: найти матрицу гомографии и деформировать изображения. Я собираюсь использовать estimateGeometricTransform, чтобы мы могли найти преобразование, которое искажает один набор точек другому. Как отметил Дима в своих комментариях ниже, этот надежный определяет лучшую матрицу гомографии через RANSAC. Мы можем назвать estimateGeometricTransform следующим образом:

tform = estimateGeometricTransform(matchedPoints1.Location,...
     matchedPoints2.Location, 'projective');

Первый вход принимает набор входных точек, которые являются точками, которые вы должны преобразовать. Второй вход принимает набор базовых точек, которые являются ссылкой. Эти моменты - это то, к чему мы хотим соответствовать.

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

Для совпадающих точек мы хотим ссылаться на поле Location, потому что они содержат координаты, где фактические точки совпадают между двумя изображениями. Мы также используем projective для учета масштаба, сдвига и вращения. Вывод - это структура, содержащая наше преобразование точек.

Что мы будем делать дальше, используйте imwarp в warp первое изображение, чтобы оно выравнивалось с второй.

out = imwarp(im, tform);

out будет содержать наше искаженное изображение. Если бы мы отобразили второе изображение и это выходное изображение бок о бок:

figure;
subplot(1,2,1);
imshow(im2);
subplot(1,2,2);
imshow(out);

Это то, что мы получаем:

enter image description here

Я бы сказал, что неплохо, не так ли?


Для вашего копирования и вставки удовольствия, вот что выглядит полный код:

im = imread('http://i.stack.imgur.com/vXqe8.png');
im2 = imread('http://i.stack.imgur.com/Pd7pt.png');

im_gray = rgb2gray(im);
im2_gray = rgb2gray(im2);

points = detectSURFFeatures(im_gray);
points2 = detectSURFFeatures(im2_gray);

[features1, validPoints1] = extractFeatures(im_gray, points);
[features2, validPoints2] = extractFeatures(im2_gray, points2);

indexPairs = matchFeatures(features1, features2);

matchedPoints1 = validPoints1(indexPairs(:, 1), :);
matchedPoints2 = validPoints2(indexPairs(:, 2), :);

figure;
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage');

tform = estimateGeometricTransform(matchedPoints1.Location,...
   matchedPoints2.Location, 'projective');

out = imwarp(im, tform);

figure;
subplot(1,2,1);
imshow(im2);
subplot(1,2,2);
imshow(out);

Помимо

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


Удачи и удачи!

+17
18 мар. '15 в 17:14
источник

Связанные вопросы


Похожие вопросы

Вы можете получить разумный результат, выполнив следующие действия:

  • Обнаружение точек SIFT на обоих изображениях. Например, с vlfeat lib.
  • Сопоставьте дескрипторы SIFT с использованием правила Лоу, реализуемого vlfeat с помощью vl_ubcmatch
  • Используйте RANSAC, чтобы найти подмножество совпадающих точек, которые придерживаются некоторой гомографии H. Пример использования точек зрения Харриса можно увидеть на сайте Peter Kovesi, рядом с самим RANSACK и другими полезными функциями.

Исходный результат:

enter image description here

+3
18 мар. '15 в 16:52
источник

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

  • Загрузите эталонное изображение (я буду называть его моделью) и изображение, которое вы хотите сравнить с моделью
  • Вычислить гистограммы двух изображений
  • Сравните две гистограммы. Есть много способов сделать это. Здесь я буду использовать пересечение и корреляцию.
  • Пересечение гистограммы: вычислить пересечение гистограммы и нормализовать ее, разделив ее на количество пикселей в модельной гистограмме. Это даст вам значение от 0 до 1.

    image = imread('Pd7pt.png');
    model = imread('vXqe8.png');
    grImage = rgb2gray(image);
    grModel = rgb2gray(model);
    hImage = imhist(grImage);
    hModel = imhist(grModel);
    
    normhistInterMeasure = sum(min(hImage, hModel))/sum(hModel)
    corrMeasure = corr2(hImage, hModel)
    
  • Для пересечения и корреляции я получаю 0.2492 и 0.9999 соответственно.

0
19 мар. '15 в 3:44
источник

Посмотрите другие вопросы по меткам или Задайте вопрос