ホモグラフィ変換のやり方
Show older comments
マトラボでのホモグラフィ変換のやり方を教えてほしいです.現在,斜め方向から撮影した画像を,ホモグラフィ変換を用いて真上から見たような俯瞰画像に変換したいと思っています.
変換前の斜めから見た画像の4点(左上,右上,右下,左下)のpixel値の座標と,変換後の目指している俯瞰画像の4点のpixel値の座標はわかっていて,ホモグラフィ行列も求めています.このホモグラフィ行列を斜めから見た画像に適用する方法が分かりません.どなたか分かる方教えていただけないでしょうか.
ちなみに,変換前の座標はそれぞれ左下,左上,右上,右下の順で(910.774,965.829),(639,229,865.667),(949.414,462.938),(1091.16,637.62)で,変換後の座標が(527.402,833.139),(509.453,290.694),(1247,334.963),(1260.57,772.22)です.
また,ホモグラフィ行列は[0.0207 -0.7512 892.1442
0.4271 0.3142 -399.4835
-0.000462 -0.00023555 1]
となっています.よろしくお願いします.
追記:解決いたしました.回答ありがとうございました.本当に助かりました.
Accepted Answer
More Answers (1)
Shunichi Kusano
on 9 Feb 2022
image processing toolboxをお持ちでしたらimwarp関数を使えば簡単に済みます。
自作する場合、まず作成された変換行列を使って、XY座標を変換。変換した座標でinterp2で内挿、という手順です。
なんとなくのコードを書いておきます。検証してないので抜け漏れあるかもしれません。適宜出てくる変数を見つつ、確認しながらお使いください。
sz = size(img,1:2); % 変換したい画像の縦横のピクセル数を取得
[x_org,y_org] = meshgrid(1:sz(2),1:sz(1)); % 画像の各ピクセルに対するX座標、Y座標
new_coords = [x_org(:) y_org(:) ones(numel(x_org),1)] * H; % 変換行列Hでx_orgとy_orgを変換(MATLABは右からかけることに注意してください)
x_new_row = new_coords(:,1);
y_new_row = new_coords(:,2);
% 500x500で新しい座標を定義(等間隔にするためmeshgridを使う)
[x_new,y_new] = meshgrid(linspace(min(x_new_row),max(x_new_row),500),linspace(min(y_new_row),max(y_new_row),500));
img_new = interp2(x_new_row,y_new_row,img(:),x_new,y_new); % 内挿して等間隔な座標での値を計算(3チャンネルの場合はチャンネルごとに)
3 Comments
大貴 木戸
on 9 Feb 2022
Shunichi Kusano
on 10 Feb 2022
imwarpで、OutputViewプロパティを指定する必要があるかと思います。変換した画像の大きさや範囲を指定するためです。documentにもありますとおり、imref2dというオブジェクトを定義して、指定します。OutputViewを使ったimwarpについては、下記のサンプルが参考になるかもしれません。
大貴 木戸
on 10 Feb 2022
Categories
Find more on 汎用的な幾何学的変換 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





