空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

幾何学的変換のお勉強(8)

f:id:robonchu:20180501135427j:plain

参考:Okutomi lab

やりたいこと

画像の位置や形を変化させる画像の幾何学的変換について学ぶ

教科書

CG-ARTS | 書籍・教材

線形変換

[ [x`] , [y`] ] = [ [a, b] , [c, d] ] * [ [x] , [y] ]

で表すことができる変換を線形変換という

拡大・縮小

[ [x`] , [y`] ] = [ [s_x, 0] , [0, s_y] ] * [ [x] , [y] ]

回転

f:id:robonchu:20180501103344g:plain

参考: オープンメディアラボ(宮崎慎也・山田雅之・遠藤守・中貴俊 研究室)

[ [x`] , [y`] ] = [ [cosθ, -sinθ] , [sinθ, cosθ ] * [ [x] , [y] ]

鏡映

X軸

[ [x`] , [y`] ] = [ [1, 0] , [0, -1 ] * [ [x] , [y] ]

Y軸

[ [x`] , [y`] ] = [ [-1, 0] , [0, 1 ] * [ [x] , [y] ]

X=Y

[ [x`] , [y`] ] = [ [0, 1] , [1, 0 ] * [ [x] , [y] ]

スキュー

f:id:robonchu:20180501103947g:plain

参考: アフィン変換 画像処理ソリューション

X軸方向へスキュー

[ [x`] , [y`] ] = [ [1, b] , [0, 1 ] * [ [x] , [y] ]

b = tanθ

Y軸方向へスキュー

[ [x`] , [y`] ] = [ [1, 0] , [c, 1 ] * [ [x] , [y] ]

c = tanθ

合成変換

ここの変換行列の積により、合成変換を表す行列を計算できる

合成変換ではここの変換の順番を変えると結果が異なる点に注意!

同次座標とアフィン変換・射影変換

同次座標

同次座標:2次元平面上の点をu=[ [x], [y], [m] ]の形で表現する形式を同次座標表現と呼ぶ.実際の座標値は,[x/m y/m]の値を持つ.

参考:第10回目

アフィン変換

任意の線形変換と平行移動を組み合わせた変換をアフィン変換と呼ぶ

平行移動

[ [x`] , [y`] , [1] ] = [ [1, 0 , t_x ] , [0, 1 , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

線形変換

[ [x`] , [y`] , [1] ] = [ [a, b , 0 ] , [c, d , 0 ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

アフィン変換

[ [x`] , [y`] , [1] ] = [ [a, b , t_x ] , [c, d , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

ユークリッド変換

[ [x`] , [y`] , [1] ] = [ [cosθ, -sinθ , t_x ] , [sinθ, cosθ , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

相似変換

[ [x`] , [y`] , [1] ] = [ [s * cosθ, - s * sinθ , t_x ] , [s * sinθ, s * cosθ , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

射影変換

f:id:robonchu:20180501114406j:plain

参考: 5.3@ŽË‰e•ÏŠ·

任意の四角形を別の任意の四角形に移すような変換

[ [x`] , [y`] , [1] ] = [ [h11, h12 , h13 ] ,  [h21, h22 , h23 ] ,  [h31, h32 , h33 ] ]* [ [x] , [y] , [1] ]

すべての変換を包含するようなもの↓

f:id:robonchu:20180501114105j:plain

参考: 幾何学変換の関係 - ぱたヘネ

画像の再標本化

変換後の画像を再び縦横等間隔に標本化された位置の集まりとして表現すること

この際、下記に述べる補間を出力画像中のすべての画素位置に対して行う

f:id:robonchu:20180501130031p:plain

参考: ブラウザによって画質が変わる!?ブラウザ別画像処理法 | WEB制作ブログ

ニアレストネイバー

求めたい位置に最も近い画素位置の値をそのまま利用する

高速だが、なめらかなエッジがギザギザになって現れるジャギーが多い

参考: 画素の補間(Nearest neighbor,Bilinear,Bicubic) 画像処理ソリューション

バイリニア補間

周りの4点の画素値の重み付きの平均値を求めることになるため、平滑化の効果が生じる。ジャギーが目立たなくなるが、エッジがなまる傾向にある。

参考: 画素の補間(Nearest neighbor,Bilinear,Bicubic) 画像処理ソリューション

バイキュービック補間

周りの16点の画素値を用いて補間する。バイリニア補間に比べてシャープで自然な画像になる。

参考: 画素の補間(Nearest neighbor,Bilinear,Bicubic) 画像処理ソリューション

イメージモザイキングとその概略処理手順

複数の画像をつなぎ合わせるような処理のことをイメージモザイキングという。以下に手順を示す。

  1. 特徴量の検出とマッチング

  2. 幾何学的変換の推定

  3. 画像の幾何学的変換と合成

特徴点の検出とマッチング

マッチング:画像間での対応を求める

このマッチング手法としてSIFTなどがある。

f:id:robonchu:20180501132423j:plain

参考:

幾何学的変換の推定

イメージモザイキングでは射影変換がよく用いられる。

最低、対応する4組の点の特徴点を用いることで解が導出できる。

特徴点にはアウトライヤ(誤った対応点)があるため、それを含んだ状態でもパラメータを推定する必要がある。

その方法として、RANSACがよく利用される。以下にRANSACでの射影変換のパラメータ推定手順を示す。

  1. 必要最低限のデータ(4組)をランダムに選択する

  2. 選択した4点からパラメータを計算

  3. パラメータを用いて他の点が正しく変換できているかチェックする。ここで正しい物をインライアというインライアの数を数えて記憶。

  4. 上記を繰り返し、インライアの最も多い射影変換のパラメータをインライアの結果として出力する。

参考: 【お勉強してみた】RANSACのおはなし - Qiita

画像の幾何学的変換と合成

画像をつなぐときに明るさの違い等によりつなぎ目が目立つことがある。

目立たなくする方法として、画像の重なった部分でアルファブレンディングの考え方を利用した画素の重み付き平均する方法等がある。

f:id:robonchu:20180501134149j:plain

参考: OpenCVで遊ぼう!: OpenCVで自動的にパノラマ写真を作る(OpenCV Panography)

平面・円筒面・球面パノラマ

撮影対象が平面、もしくは、カメラが光学中心を回転中心として回転し撮影した画像であれば原理的に射影変換により、2つの画像をつなぎ合わせることができる。

平面パノラマでは原理的に画角が180度以上のパノラマ画像を生成することはできない。

それに対し、合成画像の投影面を円筒面や球面にすることで、より広い範囲のパノラマ画像を生成することができる。

f:id:robonchu:20180501134957j:plain

参考: EOS MとPhotoShopでパノラマ合成(Photomarge) | GANREF

平面パノラマにおいて、空間上の直線はパノラマ画像上でも直線になるが、円筒面・球面パノラマにおいては直線性が保たれないことに注意!

所感

最近はやりの360度カメラの仕組み等がわかって楽しい♪