Объединение двух изображений с соответствующими характеристиками

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

Я посмотрел пример панорамы, но по какой-то причине он не работает.

clear all;
close all;
I1 = rgb2gray(imread('q2.jpg'));
I2 = rgb2gray(imread('q20.jpg'));

points1 = detectSURFFeatures(I1);
points2 = detectSURFFeatures(I2);

[f1, vpts1] = extractFeatures(I1, points1);
[f2, vpts2] = extractFeatures(I2, points2);

indexPairs = matchFeatures(f1, f2) ;
matchedPoints1 = vpts1(indexPairs(:, 1));
matchedPoints2 = vpts2(indexPairs(:, 2));

figure; ax = axes;
showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2,'Parent',ax);
title(ax, 'Putative point matches');
legend(ax,'Matched points 1','Matched points 2');

% Create new Image ... 
% joinedImg = Combined image where matched points overlap

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


person rostacko1    schedule 22.05.2019    source источник
comment
Вопрос требует уточнения - что вы пытались сделать (ваш код) и где это не удалось (что он делает неправильно). Пример того, что вы считаете похожим, не считается. Конкретно для того, что вы пытаетесь выполнить, вам нужно рассчитать проекцию одного изображения на другое, затем создать более крупное изображение, включающее оба, где в точке пересечения вам нужно решить, какое изображение сэмплировать - первое, второе или функция двух, например. в среднем.   -  person Danny Varod    schedule 22.05.2019
comment
Я не знаю, как это сделать, я знаю, что мне, вероятно, придется где-то использовать imwarp и изменить размер, но я не знаю, как это сделать.   -  person rostacko1    schedule 22.05.2019
comment
Я не использовал Matlab в течение многих лет, однако обработка изображений связана с математикой, вам действительно не нужна библиотека, просто подумайте о двух изображениях как о простых точках и используйте линейную математику. P.S. Не забывайте, что пиксели состоят из субпикселей RGB и что строки часто заканчиваются отступом, так что они делятся на 4 байта (или было 8?). Если и это вам не поможет, попробуйте прочитать/посмотреть/пройти курс по практической обработке изображений.   -  person Danny Varod    schedule 22.05.2019


Ответы (1)


Я думаю, вы выбрали неправильный пример из документации MATLAB.

Вы можете использовать пример estimateGeometricTransform.

Следующий код дает вам преобразование tform:

[tform,inlierPtsDistorted,inlierPtsOriginal] = ...
    estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal,...
    'similarity');

Код деформации: Ir = imwarp(distorted,tform,'OutputView',outputView);

Для объединения изображений вы можете использовать функцию imfuse.

Следующий код объединяет пример estimateGeometricTransform с примером imfuse:

%https://www.mathworks.com/help/vision/ref/estimategeometrictransform.html
original  = imread('cameraman.tif');
%imshow(original);
%title('Base image');
distorted = imresize(original,0.7); 
distorted = imrotate(distorted,31);
%figure; imshow(distorted);
%title('Transformed image');
ptsOriginal  = detectSURFFeatures(original);
ptsDistorted = detectSURFFeatures(distorted);
[featuresOriginal,validPtsOriginal] = extractFeatures(original,ptsOriginal);
[featuresDistorted,validPtsDistorted] = extractFeatures(distorted,ptsDistorted);
index_pairs = matchFeatures(featuresOriginal,featuresDistorted);
matchedPtsOriginal  = validPtsOriginal(index_pairs(:,1));
matchedPtsDistorted = validPtsDistorted(index_pairs(:,2));
%figure; 
%showMatchedFeatures(original,distorted, matchedPtsOriginal,matchedPtsDistorted);7
%title('Matched SURF points,including outliers');
[tform,inlierPtsDistorted,inlierPtsOriginal] = estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal, 'similarity');
%figure; 
%showMatchedFeatures(original,distorted, inlierPtsOriginal,inlierPtsDistorted);
%title('Matched inlier points');
outputView = imref2d(size(original));
Ir = imwarp(distorted,tform,'OutputView',outputView);
%figure; imshow(Ir); 
%title('Recovered image');

%https://www.mathworks.com/help/images/ref/imfuse.html
C = imfuse(original, Ir, 'falsecolor', 'Scaling', 'joint', 'ColorChannels', [1 2 0]);
figure; imshow(C); 
title('fuse image');

%Write result image to file.
imwrite(C, 'fused.png');

Было бы полезно, если бы вы прикрепили исходные изображения: 'q2.jpg' и 'q20.jpg'.

person Luna    schedule 23.05.2019