отображение координат такое же, как отображение пикселей в Matlab для триангуляции Делоне

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

Теперь мне нужно определить большую сетку и назначить ей пиксели из базового изображения. Например, если базовое изображение 20 в (1,1), в большей сетке у меня будет 20 в (1,1). и присвоить нули всем незаполненным значениям сетки. Затем я должен сопоставить линейно переведенное изображение с базовым изображением и написать свой собственный алгоритм, основанный на «триангуляции Делоне», для интерполяции между изображениями.

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

(w,z)=inv(T).*(x,y)  
A=inv(T).*B  

где (w,z) — координаты базового изображения, (x,y) — координаты транслируемого изображения, A — матрица, содержащая координаты (w z 1), а B — матрица, содержащая координаты (x y 1).

Если я использую следующий код, я получаю новые координаты, но как мне связать эти вещи с изображением? Мои пиксели со второго изображения также переносятся на первое изображение? Если нет, то как я могу это сделать?

close all; clc; clear all;

image1_gray=imread('C:\Users\Javeria Farooq\Desktop\project images\a.pgm');
figure; imshow(image1_gray); axis on; grid on;
title('Base image');
impixelinfo
hold on

image2_gray =imread('C:\Users\Javeria Farooq\Desktop\project images\j.pgm');
figure(2); imshow(image2_gray); axis on; grid on;
title('Unregistered  image1');
impixelinfo

% Detect and extract features from both images
points_image1= detectSURFFeatures(image1_gray, 'NumScaleLevels', 100, 'NumOctaves', 5,  'MetricThreshold', 500 );
points_image2 = detectSURFFeatures(image2_gray, 'NumScaleLevels', 100, 'NumOctaves', 12,  'MetricThreshold', 500 );

[features_image1, validPoints_image1] = extractFeatures(image1_gray, points_image1);
[features_image2, validPoints_image2] = extractFeatures(image2_gray, points_image2);

% Match feature vectors
indexPairs = matchFeatures(features_image1, features_image2, 'Prenormalized', true) ;

% Get matching points
matched_pts1 = validPoints_image1(indexPairs(:, 1));
matched_pts2 = validPoints_image2(indexPairs(:, 2));

figure; showMatchedFeatures(image1_gray,image2_gray,matched_pts1,matched_pts2,'montage');
legend('matched points 1','matched points 2'); 
figure(5); showMatchedFeatures(image1_gray,image3_gray,matched_pts4,matched_pts3,'montage');
legend('matched points 1','matched points 3'); 

% Compute the transformation matrix using RANSAC
[tform, inlierFramePoints, inlierPanoPoints, status] = estimateGeometricTransform(matched_pts1, matched_pts2, 'projective')
figure(6); showMatchedFeatures(image1_gray,image2_gray,inlierPanoPoints,inlierFramePoints,'montage');
[m n] = size(image1_gray);
image1_gray = double(image1_gray);
[x1g,x2g]=meshgrid(m,n) % A MESH GRID OF 2X2
k=imread('C:\Users\Javeria Farooq\Desktop\project images\a.pgm');
ind = sub2ind( size(k),x1g,x2g);

%[tform1, inlierFramepPoints, inlierPanopPoints, status] = estimateGeometricTransform(matched_pts4, matched_pts3, 'projective')
%figure(7); showMatchedFeatures(image1_gray,image3_gray,inlierPanopPoints,inlierFramepPoints,'montage');
%invtform=invert(tform)
%x=invtform
%[xq,yq]=meshgrid(1:0.5:200.5,1:0.5:200.5);

r=[];
A=[];
k=1;

%i didnot know how to refer to variable tform so i wrote the transformation
%matrix from variable structure tform
T=[0.99814272,-0.0024304502,-1.2932052e-05;2.8876773e-05,0.99930143,1.6285858e-06;0.029063907,67.809265,1]

%lets take i=1:400 so my r=2 and resulting grid is 400x400
for i=1:200
    for j=1:200
        A=[A; i j 1];
        z=A*T;
        r=[r;z(k,1)/z(k,3),z(k,2)/z(k,3)];
        k=k+1;
    end
end

%i have transformed the coordinates but how to assign values??
%r(i,j)=c(i,j)
d1=[];
d2=[];
for l=1:40000
    d1=[d1;A(l,1)];
    d2=[d2;r(l,1)];
    X=[d1 d2];
    X=X(:);
end

c1=[];
c2=[];
for l=1:40000
    c1=[c1;A(l,2)];
    c2=[c2;r(l,2)];
    Y=[c1 c2];
    Y=Y(:);
end

%this delaunay triangulation is of vertices as far as i understand it
%doesnot have any pixel value of any image
DT=delaunayTriangulation(X,Y);
triplot(DT,X,Y);

person Jav    schedule 22.11.2013    source источник
comment
извините, я забыл добавить код   -  person Jav    schedule 22.11.2013
comment
Вы можете добавить кодовый блок, отредактировав свой ответ и изменив каждую строку кода на четыре пробела, или выделив весь код и нажав Ctrl+k.   -  person nispio    schedule 22.11.2013
comment
спасибо, я сделал это. кто-нибудь, пожалуйста, помогите мне   -  person Jav    schedule 22.11.2013
comment
Я обновил ваш вопрос и код для удобочитаемости, поскольку чем проще его понять, тем больше вероятность, что вы получите ответы. Пожалуйста, просмотрите мои правки, чтобы убедиться, что они по-прежнему точно передают ваш вопрос.   -  person nispio    schedule 22.11.2013
comment
@nispio спасибо, сэр, это передает мой вопрос, теперь я ищу ответ   -  person Jav    schedule 23.11.2013
comment
Прочитав ваш вопрос, я все еще не уверен, что понятно, о чем вы спрашиваете. Если пиксель (1,1) на первом изображении сопоставляется с пикселем (1,1) на втором изображении, то это вряд ли можно считать переводом/трансформацией.   -  person nispio    schedule 23.11.2013
comment
сэр, с первого изображения я копирую значения пикселей, как они есть, в большую сетку. моя проблема в том, что когда я применяю преобразование ко второму изображению и переношу его в большую сетку, мое (1,1) второго изображения становится (1.6,67.3) большей сетки. координаты отображаются правильно. я не могу использовать команду округления, потому что мне нужно использовать координаты с плавающей запятой для построения триангуляции Делоне. мой вопрос заключается в том, как присвоить значения pxel из второго изображения координатам с плавающей запятой на большей сетке   -  person Jav    schedule 23.11.2013
comment
Мне очень жаль, но я до сих пор не могу понять, что ты делаешь. Если вы не найдете более четкого объяснения своей проблемы (возможно, с использованием изображений), я не смогу вам помочь. Возможно, вы могли бы изменить свое название, включив в него Триангуляцию Делоне, и кто-то, кто более знаком с этим, сможет понять вашу проблему. Удачи.   -  person nispio    schedule 23.11.2013
comment
хорошо, сэр, я собираюсь отредактировать это   -  person Jav    schedule 24.11.2013


Ответы (2)


Я решил эту проблему, выполнив следующие два шага:

  1. Используйте команду transformPointsForward для преобразования координат изображения, используя объект tform, возвращаемый оценкой GeometrcTransform.

  2. Используйте класс разбросанныйИнтерполант в Matlab и используйте команду разбросанныйИнтерполант, чтобы присвоить преобразованным координатам соответствующие значения пикселей.

F = рассеянный интерполянт (P, z)

здесь матрица P=nx2, содержащая все преобразованные координаты

z=nx1 matrix containing pixel values of image that is transformed,it is obtained by converting image to column vector using image=image(:)

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

person Jav    schedule 07.12.2013

Вы делаете здесь слишком много работы, и я не думаю, что вам вообще нужна триангуляция Делоне. Используйте функцию imwarp из Image Processing Toolbox, чтобы преобразовать изображение. Он принимает исходное изображение и объект tform, возвращенный estimateGeometricTransform.

person Dima    schedule 03.12.2013
comment
Функция imwarp не может использоваться, потому что она будет линейно интерполировать преобразованные значения пикселей на сетке, однако я хочу использовать триангуляцию Делоне и выполнять интерполяцию с помощью аппроксимации поверхности - person Jav; 07.12.2013
comment
Из любопытства, какую проблему вы пытаетесь решить? Я действительно не могу представить случай проективного преобразования, где билинейной или бикубической интерполяции недостаточно. Вот пример ректификации стерео, где imwarp работает отлично: mathworks. com/help/vision/examples/ - person Dima; 08.12.2013
comment
на самом деле я должен делать сверхвысокое разрешение изображений после проективного преобразования. Мне не нужно делать только интерполяцию, поэтому мне не требуется такая интерполяция, которую делает imwarp, иначе вы правы в том, что говорите. - person Jav; 11.12.2013