41
実践コンピュータビジョン 3章 画像間の写像

実践コンピュータビジョン 3章 画像間の写像

  • Upload
    yaju88

  • View
    8.139

  • Download
    1

Embed Size (px)

DESCRIPTION

静岡Developes勉強会 コンピュータビジョンvol3用の資料となります。

Citation preview

Page 1: 実践コンピュータビジョン 3章 画像間の写像

実践コンピュータビジョン

3章 画像間の写像

Page 2: 実践コンピュータビジョン 3章 画像間の写像

はじめに

本資料は静岡Developes勉強会「コンピュー

タビジョン vol.3」のための資料です。

オライリー社の実践コンピュータビジョン

www.oreilly.co.jp/books/9784873116075/

を教科書として使います。

Page 3: 実践コンピュータビジョン 3章 画像間の写像

自己紹介

やじゅ@静岡・・・漢字名は「八寿」

平口 八寿人(https://www.facebook.com/yasuhito.hiraguchi)

アラフォーエンジニア、元MSMVP(Visual Basic)

静岡県島田市のSL(大井川鉄道)が走っている所に在住

Twitter:yaju はてなID:Yaju3D

http://blogs.wankuma.com/yaju/

http://yaju3d.hatenablog.jp/ (数学と物理を基礎からやり直す)

Page 4: 実践コンピュータビジョン 3章 画像間の写像

開発環境

共通開発環境

python 2.7 (3.x系では本書に沿わないのでNG)

環境変数 Path

「C:¥Python27;C:¥Python27¥Scripts;」を追加

私の開発環境

OS Windows 8.1

IDE pyCharm 3.0.2 (Community Edition FREE)

http://www.jetbrains.com/pycharm/download/

Page 5: 実践コンピュータビジョン 3章 画像間の写像

事前準備 その1

サンプルソースコード

実践コンピュータビジョンのWebサイトの関連ファイ

ルタブからダウンロードしてください。

画像データ

原著者のサイトから pcv_data.zip をダウンロード

してください。

Page 6: 実践コンピュータビジョン 3章 画像間の写像

事前準備 その2

NumPy、Matplotlib、SciPy、 PILインストール(Windows)

NumPy、Matplotlib、 SciPyのインストール

http://qiita.com/mojaie/items/995661f7467ffdb40331

PIL インストール Python2.7用

http://www.pythonware.com/products/pil/index.htm

easy_installのインストール(Windows)

https://pypi.python.org/pypi/setuptools/1.1.5#installing-and-using-setuptools

setuptools-1.1.5.tar.gzを解凍し、ez_setup.pyをダブルクリック

C:¥Python27¥Scripts内にeasy_install関連のファイルが入る。

pipのインストール(Windows)

http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html

easy_install pip をコマンドプロンプト上で入力する。

Page 7: 実践コンピュータビジョン 3章 画像間の写像

事前準備 その3

サンプルソースコードと画像データを展開

PycharmProjects (私の場合のフォルダ構成)

├─pcv_data (画像データ pca_data.zipを展開)

├─chap1

├─chap2

├─chap3 (サンプルソース pcv_j.zipを展開)

└─jkfaces2008_small

└─aligned

Page 8: 実践コンピュータビジョン 3章 画像間の写像

事前準備 その4

pca_data.zipから、empire.jpg、Univ1.jpg~Univ5.jpgを展開して

カレントディレクトリ(chap3)に置きます。

以下の画像を、それぞれFlickrからダウンロードしてください。

http://www.oreilly.co.jp/pub/9784873116075/

billboard_for_rent.jpg 660x1024 21671910_45066ab068_b.jpg

blank_billboard.jpg 1024x576 http://p.twipple.jp/qPHQ3

cat.jpg 40x428 560380352_5353d7b089_z.jpg

turningtorso1.jpg 2336x3504 8186379972_34bfb45b72_o.jpg

sunset_tree.jpg 480x640 344929385_d4dda18574_z.jpg

Page 9: 実践コンピュータビジョン 3章 画像間の写像

基礎知識

アフィン変換

射影変換(ホモグラフィ)

分割アフィンワーピング

Page 10: 実践コンピュータビジョン 3章 画像間の写像

アフィン変換

平行移動と線形変換(拡大縮小、剪断、回転)を組み

合わせた変換のこと

線形変換とは変換の前に直線だった場所は、変換後

も直線のまま保たれる変換のこと

※直線が変換によって

曲がったりしない

Page 11: 実践コンピュータビジョン 3章 画像間の写像

アフィン変換

行列式回転行列、拡大縮小行列、平行移動行列 イメージングソリューション

回転行列を理解してみる

デモ:http://abicky.net/swf_study/2/

Page 12: 実践コンピュータビジョン 3章 画像間の写像

射影変換(ホモグラフィ)

アフィン変換を拡張したもの

射影変換=透視変換=投影変換

射影と投影は projective/projection の訳語

Page 13: 実践コンピュータビジョン 3章 画像間の写像

分割アフィンワーピング

アフィン変換では台形には変換できないですが

三角形に分割して組み合わせることで台形に

することが出来る

※どんな多角形も

三角形に分割可能

Page 14: 実践コンピュータビジョン 3章 画像間の写像

第3章の目次

3.1 ホモグラフィ

3.1.1 DLTアルゴリズム

3.1.2 アフィン変換

3.2 画像の変形

3.2.1 画像の中の画像

3.2.2 分割アフィンワーピング

3.2.3 画像の位置合わせ

3.3 パノラマ

3.3.1 RANSAC

3.3.2 ロバストなホモグラフィー推定

3.3.3 画像をつなぎ合わせる

Page 15: 実践コンピュータビジョン 3章 画像間の写像

実行ファイル説明

3.0.crop.tt.py turningtorso1.jpgを切り取る

3.0.ginput_jkfaces.py jkfaces.xmlを作成する。すでにあるので不要

3.0.ginput_tt.py 画像をマウスクリックすると赤十字のマークが付く

3.2.warping.py 画像の変形 empire.jpgを使用

3.2.1.warping.py ビルの看板に猫を貼る

3.2.1.warping_tri.py ビルボードに猫を貼る

3.2.2.delaunay.py ドロネー分割

3.2.2.piecewise.py turningtorso1_points.txtを使って分割アフィンワーピング

3.2.3.imreg.py jkfaces2008_small¥alignedに画像保存

3.2.3.average.py 平均顔の生成と比較

3.2.3.pca.py 主成分分析した9成分の顔

3.3.1.ransac_test.py RANSACの図3-10

3.3.2.sift.py SIFT特徴量を用いて見つけた対応点

3.3.3.ransac_pano.py パノラマ作成 5分くらいかかる

Page 16: 実践コンピュータビジョン 3章 画像間の写像

3.1 ホモグラフィー

ホモグラフィーとは、ある平面から別の平面へ写像する2Dの射影変換

自分のブログ「射影変換(ホモグラフィ)について理解してみる」でやってきていたのは、

下図左のように、始点と終点の間には他の点が無いものであった。

しかし、本書では下図右のように始点と終点の間には他の点が複数存在するものである。

本書では、ホモグラフィー行列をH(h1~h9)を求める方法としてDLTアルゴリズム

(Direct Linear Transform)を使っています。

Page 17: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

DLT(Direct Linear Transform:直接線形変換)法は、4つ以上の点の対応を

使ってHを計算するアルゴリズムです。

参照: Direct Linear Transform アルゴリズムを使って、投影変換の行列Hを計算する。

点数の2倍の行を持つ下記の行列式(2nx9)に展開します。

右図のように8つの点に対応した場合、n=8となり2x8 x9の行列となる。

「homography.py」のH_from_point(fp.tp)の下記コメント部分で、点数分を式に展開している。

# 線形法のための行列を作る。対応ごとに2つの行になる。

ちなみに、三次元映像解析でのDLT法は行列式(2nx11)となります。

Page 18: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

特異値分解特異値分解(Singular Value Decomposition:SVD)とは何か?

中学の時に因数分解を習ったと思います。覚えてますか?

数学の世界では数理的なモデル(数式)を見通しを良くするために「分解」し

ます。

特異値分解は、「行列」の世界における「分解」なのです。

参照:文系のための「特異値分解」(1)、文系のための「特異値分解」(2)

Page 19: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

特異値分解ある行列を特異値分解すると次のように分解されます。

Uは、「左特異ベクトル」と呼ばれる行列

Dは、「特異値行列」と呼ばれる対角行列

V'は、「右特異ベクトル」と呼ばれる行列

「homography.py」のH_from_points(fp.tp)にある下記部分のソース

U,S,V = linalg.svd(A) # 特異値分解

H = V[8].reshape((3,3)) # ホモグラフィパラメータ

最小二乗法の解は、特異値分解した行列の最後の行に求まっています。

その為、V[8]としているのです。参照: ホモグラフィ(特異値分解)

Page 20: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

座標指定

H_from_pointsの呼び出し処理

fp = array([[0,120,120,0],[0,0,160,160],[1,1,1,1]])

tp = array([[20,120,120,0],[20,0,160,140],[1,1,1,1]])

H = homography.H_from_points(fp,tp)

左上から反時計回りに([[Y1,Y2,Y3,Y4],[X1,X2,X3,X4],[1,1,1,1]])

と値を指定します。

※座標指定が(Y,X)の順なのは、行列の行成分がY座標で列成

分がX座標となり行→列の順で表すからでしょうかね。

Page 21: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

標準化

点群を平均値が0、標準偏差が1になるように正規化する。

これを標準化と呼びます。

参考:標準化した値は、平均値がゼロ、分散(と標準偏差)が1になる

Page 22: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

点の調整# 点を調整する(数値計算上重要)

# 開始点

m = mean(fp[:2], axis=1) #平均

maxstd = max(std(fp[:2], axis=1)) + 1e-9 #標準偏差

C1 = diag([1/maxstd, 1/maxstd, 1]) #対角項

C1[0][2] = -m[0]/maxstd

C1[1][2] = -m[1]/maxstd

fp = dot(C1,fp) #内積 アフィン変換の拡大縮小(sx,sy)と移動(tx,ty)した行列を生成

参照: ホモグラフィ(点の調整)、文系のための「内積」(2)

Page 23: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

# 対応点

m = mean(tp[:2], axis=1) #平均

maxstd = max(std(fp[:2], axis=1)) + 1e-9 #標準偏差

C2 = diag([1/maxstd, 1/maxstd, 1]) #対角項

C2[0][2] = -m[0]/maxstd

C2[1][2] = -m[1]/maxstd

tp = dot(C2,tp) #内積

# 線形法のための行列を作る。対応ごとに2つの行になる。

[[ 0.75 1. -1. 0. 0. 0. 0.47729708 0.6363961 -0.6363961 ]

[ 0. 0. 0. 0.75 1. -1. 0.6363961 0.84852814 -0.84852814]

[-0.75 1. -1. 0. 0. 0. 0.58336309 -0.77781746 0.77781746]

[ 0. 0. 0. -0.75 1. -1. -0.84852814 1.13137085 -1.13137085]

[-0.75 -1. -1. 0. 0. 0. 0.58336309 0.77781746 0.77781746]

[ 0. 0. 0. -0.75 -1. -1. 0.84852814 1.13137085 1.13137085]

[ 0.75 -1. -1. 0. 0. 0. 0.68942911 -0.91923882 -0.91923882]

[ 0. 0. 0. 0.75 -1. -1. -0.6363961 0.84852814 0.84852814]]

Page 24: 実践コンピュータビジョン 3章 画像間の写像

3.1.1 DLTアルゴリズム

#特異値分解

U,S,V = linalg.svd(A)

H = V[8].reshape((3,3))

[[ 0.58620495 -0.04611386 -0.05921439]

[-0.01117912 0.55336629 -0.05869036]

[-0.10869141 -0.05928622 0.57062988]]

# 調整を元に戻す

H = dot(linalg.inv(C2),dot(H,C1))

[[ 4.29825103e-01 -8.89293317e-02 1.42286931e+01]

[ -1.18572442e-01 4.29825103e-01 1.42286931e+01]

[ -1.35864257e-03 -7.41077764e-04 7.11434654e-01]]

# 正規化して返す H[2,2]を1.0にするため、値を調整する

return H / H[2,2]

[[ 6.04166667e-01 -1.25000000e-01 2.00000000e+01]

[ -1.66666667e-01 6.04166667e-01 2.00000000e+01]

[ -1.90972222e-03 -1.04166667e-03 1.00000000e+00]]

Page 25: 実践コンピュータビジョン 3章 画像間の写像

3.1.2 アフィン変換

アフィン変換アフィン変換には6つの自由度があり、Hを推定するには3組の点の対応が

必要です。これもDLT法を使用して求めています。

「homography.py」のHaffine_from_points(fp.tp)

ホモグラフィーで説明したので省きます。

アフィン変換

参照: HTML5 Canvas で学ぶアフィン変換

デモ: http://abicky.net/swf_study/2/

デモ:テクスチャマッピング入門

デモ:テクスチャマッピング入門 射影変換(ホモグラフィ)

Page 26: 実践コンピュータビジョン 3章 画像間の写像

3.2 画像の変形

画像の変形

「3.2.warping.py」を実行する

先にpcv_dataのempire.jpgを入れる

Page 27: 実践コンピュータビジョン 3章 画像間の写像

3.2.1 画像の中の画像

ビルの看板に猫画像を貼る

「3.2.1.warping.py」を実行する

ビルボードに猫画像を貼る

「3.2.1.warping_tri.py」を実行する

http://p.twpl.jp/show/orig/qPHQ3 の画像をblank_billboard.jpgで保存する

Page 28: 実践コンピュータビジョン 3章 画像間の写像

3.2.2 分割アフィンワーピング

ドロネー三角形分割

「3.2.2.delaunay.py」を実行する1.外部三角形を作り、その頂点の1つを開始点とする(これにより、必ず外側の点から開始されることになる)

2.内部の点を追加し、すべての三角形の外接円を探索し、追加した点を含むような三角分割を削除する

3.今削除した三角分割の外接円の内部にある、新しい点も含めて、グラフを三角分割し直す。

4.追加する点がなくなるまで、ステップ 2 に戻って繰り返す。

詳細な説明は下記サイトを参照

ProcessingでDelaunay分割(解説篇)

ドロネー三角形分割 - SlideShare

Page 29: 実践コンピュータビジョン 3章 画像間の写像

3.2.2 分割アフィンワーピング

分割アフィンワーピング

「3.2.2.piecewise.py」を実行する

turningtorso1_points.txtに座標が格納されている。

「3.0.ginput_tt.py」を実行すると画像が表示され、画像をマウスクリックすると赤十字のマークが付く、30回で

turningtorso1_points.txtに保存されるが、変更すると表示が乱れるので今回はそのまま使う

Page 30: 実践コンピュータビジョン 3章 画像間の写像

3.2.3 画像の位置合わせ

主成分分析した9成分の顔

「3.2.3.imreg.py」でjkfaces2008_small¥alignedに画像保存する。

先にpcv_dataのjkfaces.zipをjkfaces2008_smallに展開しておく。

「3.2.3.average.py」で平均顔の生成と比較

Page 31: 実践コンピュータビジョン 3章 画像間の写像

3.2.3 画像の位置合わせ

主成分分析の各成分顔

「3.2.3.pca.py」を実行する 参照:主成分分析の顔分析

位置合わせなし/ありでソースのコメントを切り替えるimlist = imtools.get_imlist(‘jkfaces2008_small’) draw.ellipse((90,100,230,286),fill=1)

#imlist = imtools.get_imlist(‘jkfaces2008_small/aligned’) #draw.ellipse((40,82,180,268),fill=1) # 位置合わせ済み画像用

Page 32: 実践コンピュータビジョン 3章 画像間の写像

3.3 パノラマ

パノラマの説明

同じ場所から撮影された2つ以上の画像は(つまり、画像のカメラ

位置が同じなら)、ホモグラフィー的に関係づけられます。

スウェーデンのルンド大学の画像(Univ1.jpg ~ Univ5.jpg)

Page 33: 実践コンピュータビジョン 3章 画像間の写像

3.3.1 RANSAC

RANSACの説明RANSAC(RANdom SAmple Consensus)は、外れ値を含むデータにモデルを

当てはめる反復法です。参照:特徴点の対応づけ「RANSACアルゴリズム」

最小二乗法はデータに「外れ値(outiler)」が含まれていると、その外れ値の影響が大

きくでてしまう弱点がある。特にパノラマ画像での各画像から抽出してきた局所特徴

量は、他の画像に対応点が存在していない「外れ値」が多く含まれているため、単純

な最小二乗法では対応関係が作れません。

Page 34: 実践コンピュータビジョン 3章 画像間の写像

3.3.1 RANSAC

RANSACのアルゴリズムRANSACにより、外れ値に強いレジストレーションを行います。

参照: RANSACを調べてみました1.総データ個数がU個あるデータから、ランダムでn個のデータを取り出します。

2.取り出したn個のデータから、パラメータを求めます。

(取り出すデータの個数ですが、これは求めるべきパラメータの数に比例するようです)

3.求めたパラメータを、総データ点数から取り出したn個のデータを除いたものに式を当てはめ、

観測されたデータと2.で求めたパラメータの誤差を計算します。

4.誤差が許容範囲内であれば、パラメータに対して投票を行います。

5.1~4を繰り返し、投票数が一番多かったパラメータをひとまず採用します。

(これを仮パラメータとします)

6.仮パラメータを使ってすべてのデータに再度式を適用し、誤差が許容範囲内

のものを抽出します。(この時点で雑音データがほぼ取り除かれます)

7.抽出したデータを元に、再度パラメータを求めます。

8.求まったパラメータがこのデータのもっともらしいパラメータとなります。

Page 35: 実践コンピュータビジョン 3章 画像間の写像

3.3.1 RANSAC

RANSACのテスト

「3.3.1.ransac_test.py」を作成し実行する

毎回結果が違う、数回目に図3-10と同じになる。

中身

import ransac

ransac.test()

Page 36: 実践コンピュータビジョン 3章 画像間の写像

3.3.2 ロバストなホモグラフィー推定

SIFT特徴量を用いて見つけた対応点

第2章 画像の局所記述子の応用 「3.3.2.sift.py 」を実行

VLFeat.org(http://www.vlfeat.org/download.html)から

VLFeat binary packgeをダウンロードし、sift.exeとvl.dllをchap3に入れる。

pcv_dataからUniv1~5.jpgの画像をchap3に入れる。

2つの画像をSIFT特徴量の線で結んだ4つの画像が作成される。

Page 37: 実践コンピュータビジョン 3章 画像間の写像

3.3.3 画像をつなぎ合わせる

パノラマの作成

「3.3.3.ransac_pano.py」を実行、作成には5分以上かかる。processed tmp.pgm to Univ1.sift

processed tmp.pgm to Univ2.sift

processed tmp.pgm to Univ3.sift

processed tmp.pgm to Univ4.sift

processed tmp.pgm to Univ5.sift

warp - right

warp - right

warp - left

warp - left

Page 38: 実践コンピュータビジョン 3章 画像間の写像

3.4 アイドルの平均顔を作成してみよう

アイドルの平均顔データを作成

「3.2.3.imreg.py」と「3.2.3.average.py」を使用

jkfaces.xmlを変更 フォルダ名「idolfaces」を追加

<face file=“20080101.jpg" xf="144" xm="170" xs="205" yf="181"

ym="257" ys="184"/>

xf,yfが画像の左の目(この人の右目)の座標、xs , ys が右側の目の座標、

xm,ymが口の座標です。各中心座標をセットします。

美しい人類の平均顔まとめ【AKB48の平均顔】

Page 39: 実践コンピュータビジョン 3章 画像間の写像

3.4 演習問題

1. 正方形もしくは長方形の物体(例えば、本やポスター、2次元バーコード)の画

像の座標をとり、正規化された座標系で正面から見た長方形に変形する関数を

作成してください。点は、ginput()やHarrisコーナーの最大のものを使って指定しま

す。

2. 図3-1のような変形をするときに、正しい透明度マップを作成する関数を作って

ください。

3. 顔の例やエッフェル塔などの有名な被写体を使って、3つの共通な基準点を含

むデータセットを見つけてください。基準点が同じ座標になるように画像の位置合

わせをしてください。平均画像と中央値画像を計算し表示してください。

4. 図3-12のようなエッジを目立たなくするために、パノラマ画像合成で輝度の正

規化を実装し、画像の合成方法を改良してください。

5. 360度のパノラマ画像は、中央の画像に対して左右に広げていくだけでなく、両

端をつなげて円筒状することもできます。図3-12の例を使って試してください。

Page 40: 実践コンピュータビジョン 3章 画像間の写像

3.4 演習問題

6. RANSACを使って、ホモグラフィーに当てはまる集合(インライア)を複

数見つけてください。簡単な方法は、まずRANSACを実行し、ホモグラフィ

ー行列と最も当てはまるインライア集合を取得し、対応点からインライア

を除去し、もう一度RANSACを実行して大きな集合を取得します。これを

繰り返します。

7. ホモグラフィーのRANSAC推定を、3点対応を用いたアフィン変換を推

定するように改造してください。これを用いて、インライアの数を数えるな

どして、2枚の画像が1つの平面を共有するかどうか判別してください。平

面であればアフィン変換に当てはまる点の数が多くなります。

8. Flickrなどの画像集から局所特徴点を対応づけ最小二乗法の剛体レ

ジストレーション(回転と平行移動)を使って、パノグラフ(

http://en.wikipedia.org/wiki/Panography)を作成してください。

Page 41: 実践コンピュータビジョン 3章 画像間の写像

終了

ご清聴ありがとうございました!