2013-11-22 5 views
1

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

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

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

(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); 
+0

извините я забыл добавить код – Jav

+0

, как добавить код – Jav

+0

Вы можете добавить кодоблок отредактировав свой ответ и отступов каждую строку кода на четыре пробела, или выделив весь код и нажав Ctrl + K – nispio

ответ

1

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

команд
  1. Использования transformPointsForward для преобразования координат изображения, используя объект TFORM возвращенного estimateGeometrcTransform

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

F = scatteredInterpolant (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(:) 

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

0

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

+0

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

+0

Из любопытства, в чем проблема что вы пытаетесь решить? Я действительно не могу представить себе случай проективного преобразования, где билинейная или бикубическая интерполяция недостаточна. Вот пример стереоректификации, где 'imwarp' отлично справляется: http://www.mathworks.com/help/vision/examples/stereo-image-rectification.html – Dima

+0

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