Нарисуйте совмещенные точки между двумя изображениями в MATLAB

Я работаю над системой распознавания отпечатков пальцев и выполнил этап извлечения признаков.

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

Заранее спасибо.

2 ответа

Решение

Вы можете использовать showMatchedFeatures функция, которая встроена в MATLAB. Функция может принимать либо пару features структуры, если вы использовали какой-либо из их встроенных алгоритмов обнаружения признаков или две матрицы размера N x 2, Два из них требуются, поскольку каждый из них описывает, какие пары координат между двумя изображениями соответствуют друг другу. Функция также требует двух изображений, для которых вы обнаружили ключевые точки.

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

Проверьте документацию MATLAB для более подробной информации:

http://www.mathworks.com/help/vision/ref/showmatchedfeatures.html

Если вы хотите увидеть пример кода и вывод, проверьте здесь:

http://www.mathworks.com/help/vision/ref/showmatchedfeatures.html

ДРУГОЙ ВАРИАНТ

NB. Вам понадобится набор инструментов Computer Vision, чтобы запустить showMatchedFeatures функция. Я не уверен, какие наборы инструментов у вас есть. Если у вас нет набора инструментов Computer Vision, то вы можете сложить два изображения рядом, а затем выполнить цикл по каждой паре точек и провести через них линию. Предполагается, что оба изображения одного типа (uint8, uint16 и т. д.) и в оттенках серого.

Предполагая, что у вас есть набор инструментов для обработки изображений, вы можете сделать что-то вроде этого:

% Assuming im1 and im2 are already loaded into your environment
% im1 and im2 are the two images you are comparing to
% points1 and points2 are M x 2 matrices of corresponding points
% between im1 and im2
% The co-ordinates in the ith row of points1 correspond to the
% ith row of points2
% Important Note: Each row assumes co-ordinates in (x,y) format
% x - horizontal, y - vertical
% y is assumed to be y-down (i.e. downwards is positive)

figure;
stackedImage = cat(2, im1, im2); % Places the two images side by side
imshow(stackedImage);
width = size(im1, 2);
hold on;
numPoints = size(points1, 1); % points2 must have same # of points
% Note, we must offset by the width of the image
for i = 1 : numPoints
    plot(points1(i, 1), points1(i, 2), 'y+', points2(i, 1) + width, ...
         points2(i, 2), 'y+');
    line([points1(i, 1) points2(i, 1) + width], [points1(i, 2) points2(i, 2)], ...
         'Color', 'yellow');
end

Это должно примерно достичь того, что showMatchedFeatures делает.


Что делать, если оба изображения имеют разные размеры?

Если у вас есть ситуация, когда оба изображения, которые вы хотите сравнить, не имеют одинаковых размеров (то есть оба изображения не имеют одинакового количества строк и / или столбцов), вы просто создаете выходное изображение, которое сначала пустое, так что общее количество строк для вывода является максимумом строк между двумя, а общее количество столбцов - суммой их вместе. Поэтому вы просто делаете это. Это предполагает, что оба изображения имеют один и тот же тип и имеют оттенки серого, как и раньше:

figure;
[rows1,cols1] = size(im1);
[rows2,cols2] = size(im2);

%// Create blank image
stackedImage = zeros(max([rows1,rows2]), cols1+cols2);
stackedImage = cast(stackedImage, class(im1)); %// Make sure we cast output
%// Place two images side by side
stackedImage(1:rows1,1:cols1) = im1;
stackedImage(1:rows2,cols1+1:cols1+cols2) = im2;

%// Code from before
imshow(stackedImage);
width = size(im1, 2);
hold on;
numPoints = size(points1, 1); % points2 must have same # of points
% Note, we must offset by the width of the image
for i = 1 : numPoints
    plot(points1(i, 1), points1(i, 2), 'y+', points2(i, 1) + width, ...
         points2(i, 2), 'y+');
    line([points1(i, 1) points2(i, 1) + width], [points1(i, 2) points2(i, 2)], ...
         'Color', 'yellow');
end

Мне лично нужно было работать с цветными изображениями, поэтому я решил опубликовать код от rayryeng для изображений разных размеров, но адаптированных для реализации цветных изображений (обратите внимание, что точки теперь имеют формат строки xy вместо формата столбца xy)

figure;
[rows1,cols1] = size(im1(:,:,1));
[rows2,cols2] = size(im2(:,:,1));
%// Create blank image
stackedImage = uint8(zeros(max([rows1,rows2]), cols1+cols2,3));
%// Place two images side by side
stackedImage(1:rows1,1:cols1,:) = im1;
stackedImage(1:rows2,cols1+1:cols1+cols2,:) = im2;
%// Code from before
imshow(stackedImage);
width = size(im1(:,:,1), 2);
hold on;
numPoints = size(points1, 2); % points2 must have same # of points
% Note, we must offset by the width of the image
for i = 1 : numPoints
    plot(points1(1, i), points1(2, i), 'b*', points2(1, i) + width, ...
         points2(2, i), 'r*');
    line([points1(1, i) points2(1, i) + width], [points1(2, i) points2(2, i)], ...
         'Color', 'green');
end
Другие вопросы по тегам