Matlabでアフィン変換(Affine Transform)、射影変換(ホモグラフィ、Homography Transform)を効率的に処理する方法
Matlabで2次元データ配列である画像を処理する際の,コーディングテクニックをご紹介します.
Matlabで,C言語等と同じようにforループで1画素1画素処理するとものすごく遅い.C言語でコーディングした計算時間と比較して,数百倍といった計算時間を要することもあります.
meshgridを使って,forループを使わずに一括処理すれば計算も早く.プログラムも短くて済みます.正に一石二鳥!
-------------------------------------------------------------------------------------------------------------------------
% 画像を読み込み
im=imread('test.jpg');
% 0.1 [rad] 回転し,横10pix,縦5pix平行移動
theta = 0.1;
tx = 10;
ty = 5;
% affine matrix
affine_mat = [ cos(theta) -sin(theta) tx;
sin(theta) cos(theta) ty;
0 0 1];
% 処理領域を設定
sx = 100; width = 200; sy = 50; height = 150;
% 処理領域の各画素の座標をmeshgridで一括生成
[xim,yim] = meshgrid(sx:sx+width-1, sy:sy+height-1);
points = [xim(:)';yim(:)'; ones(1, size(xim(:),1))];
% 変換後の座標を一気に計算 ※※ forループを使わない ※※
points_warped = (affine_mat)*points;
% 画像と同じように2次元配列に変換
x_warped = reshape(points_warped(1,:),[height width]);
y_warped = reshape(points_warped(2,:),[height width]);
% 元の画像の各画素の座標をmeshgridで一括生成
[xim,yim] = meshgrid(1:size(im,2),1:size(im,1));
% 各画素の輝度値を取得.下記の例ではバイリニア('linear')
im_warped = interp2(xim,yim,double(im),x_warped,y_warped,'linear');
% 結果を表示
imshow(im_warped);
-------------------------------------------------------------------------------------------------------------------------
射影変換の場合は,アフィン変換を射影変換にすればOK.