あるエンジニアのひとり旅

大企業を辞めたエンジニア、研究者のちょっとした日記

E-mail: miraimage.lab@gmail.com, Twitter: @miraimage_lab

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.