2017-04-30 7 views
1

Ich möchte ein Bild mit perspektivischer Verzerrung korrigieren. Ich habe Punkte der Ecken und ich habe auch einen Algorithmus, der erfüllt, was ich brauche, aber er führt wirklich langsam aus. Es hat 'imtransform' und 'maketform' Funktionen, die Matlab hat schnellere Funktionen für diese Aktionen. Also habe ich versucht, sie zu ersetzen, aber ich konnte es nicht richtig machen. Irgendwelche Hilfen werden geschätzt.Matlab Bild mit Bezug auf Eckpunkte korrigieren

Hier sind die Bilder dieser Frage klarer zu machen:

Eingangsbild mit bekannten Koordinaten (x, y):

Input Image With Known Coordinates

und gewünschte Ausgabe:

Oupput Image with (perspectival rectified)

Dieser Prozess wird im Abstand von 2 Sekunden ausgeführt, ich muss diesen Prozess durch neuen Matlab-Spaß ersetzen Aber ich konnte es nicht schaffen.

Old algorihm war:

%X has the clockwise X coordinates %Y has the clockwise Y coordinates  
A=zeros(8,8); 
A(1,:)=[X(1),Y(1),1,0,0,0,-1*X(1)*x(1),-1*Y(1)*x(1)]; 
A(2,:)=[0,0,0,X(1),Y(1),1,-1*X(1)*y(1),-1*Y(1)*y(1)]; 

A(3,:)=[X(2),Y(2),1,0,0,0,-1*X(2)*x(2),-1*Y(2)*x(2)]; 
A(4,:)=[0,0,0,X(2),Y(2),1,-1*X(2)*y(2),-1*Y(2)*y(2)]; 

A(5,:)=[X(3),Y(3),1,0,0,0,-1*X(3)*x(3),-1*Y(3)*x(3)]; 
A(6,:)=[0,0,0,X(3),Y(3),1,-1*X(3)*y(3),-1*Y(3)*y(3)]; 

A(7,:)=[X(4),Y(4),1,0,0,0,-1*X(4)*x(4),-1*Y(4)*x(4)]; 
A(8,:)=[0,0,0,X(4),Y(4),1,-1*X(4)*y(4),-1*Y(4)*y(4)]; 

v=[x(1);y(1);x(2);y(2);x(3);y(3);x(4);y(4)]; 

u=A\v; 
%transfer fonksiyonumuz 

U=reshape([u;1],3,3)'; 

w=U*[X';Y';ones(1,4)]; 
w=w./(ones(3,1)*w(3,:)); 

T=maketform('projective',U'); 

%transform uygulayıp resmi düzleştiriyoruz 
P2=imtransform(I,T,'XData',[1 n],'YData',[1 m]); 

, wenn es hilft, hier ist, wie ich "A" Matrix und U-Matrix erzeugt:

Out Link

Antwort

4

die eingebaute MATLAB-Funktionen verwenden (fitgeotrans, imref2d , und imwarp) der folgende Code läuft in 0.06 Sekunden auf meinem Laptop:

% read the image 
im = imread('paper.jpg'); 
tic 
% set the moving points := the original image control points 
x = [1380;2183;1282;422]; 
y = [727;1166;2351;1678]; 
movingPoints = [x,y]; 
% set the fixed points := the desired image control points 
xfix = [1;1000;1000;1]; 
yfix = [1;1;1000;1000]; 
fixedPoints = [xfix,yfix]; 
% generate geometric transform 
tform = fitgeotrans(movingPoints,fixedPoints,'projective'); 
% generate reference object (full desired image size) 
R = imref2d([1000 1000]); 
% warp image 
outputImage = imwarp(im,tform,'OutputView',R); 
toc 
% show image 
imshow(outputImage); 

enter image description here

+0

wow wirklich schneller ausgeführt, es ist etwa 0,2 Sekunden! 10x schneller Danke – vslzl

+0

@vslzl Wenn diese Antwort genau das tut, was Sie brauchen, denken Sie bitte daran, es als akzeptiert zu markieren –

Verwandte Themen