2017-04-30 12 views
1

私は遠近法でイメージを修正したい。私はコーナーのポイントを持っており、私は必要なものを完成させるアルゴリズムを持っていますが、それは本当に遅く実行されます。それは、 'imtransform'と 'maketform'関数を備えています。これらの関数は、MATLABがより高速な関数を持っています。だから私はそれらを置き換えることを試みたが、私はそれを正しくすることができなかった。どのような助けにも感謝します。ここでMatlabコーナーポイントを基準にしてイメージを整流する

は、この質問を明確にするイメージです。既知の座標(x、y)を持つ

入力画像:

Input Image With Known Coordinates

と所望の出力:

Oupput Image with (perspectival rectified)

このプロセスは2秒の間隔で実行され、私はこのプロセスを新しいmatlab fun私はそれを作ることができませんでした。

旧algorihmされました:

%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]); 

それは場合に役立ちます、ここで私は、 "A" 行列とU行列を生成する方法である:

組み込みMATLAB関数( fitgeotransimref2dを使用して

Out Link

答えて

4

imwarp)次のコードはノートパソコンで0.06秒で実行されます。

% 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

実際には速く実行され、約0.2秒です! 10倍速くありがとう – vslzl

+0

@vslzlもしこの答えがあなたの必要とするものなら、それを覚えておいてください –

関連する問題