実践コンピュータビジョン
第2章 画像の局所記述子
はじめに
• 本資料は静岡Developers勉強会コンピュータビジョン
vol.2のための資料です
• オライリー社の実践コンピュータビジョン
www.oreilly.co.jp/books/9784873116075/
(以降では教科書と呼びます)
第2章の説明です
はじめに
<共通開発環境>
• python 2.7 (3.x系では本書に沿わないのでNG)
<私の開発環境>
• pyCharm 3.1(IDEはあった方が便利です)
• MacOSX 10.9.2 (Windows等でもOKです)
ここは皆 えて!
参考までに…
はじめに
• サンプルコードを実践コンピュータビジョンのHP( www.oreilly.co.jp/books/
9784873116075/ )の関連ファイルタブからダウンロードしてください
• 今回はサンプル
コードを見たり
弄ったりして、
理解を進めます
はじめに
• 使用する画像はwww.oreilly.co.jp/pub/
9784873116075/index.htmlにリンクが貼られた
pcv_data.zipにあるので、ダウンロードしてください
はじめに
• 第1章までに必要なライブラリ
(PIL,SciPy,NumPy,Matplotlib)は、第一回の資料
www.slideshare.net/motimune/ss-d
31241704?cmp_src=analytics&utm_source=anal
ytics_dashboard&utm_medium=email&utm_camp
aign=analytics_weekly_teaser&cmp_src_from=an
alytics_weekly_teaser
を参考にインポートしておいてください
今日の目標
• 本資料を通して、以下のことを修得する
• 画像から局所特徴量を抽出し、画像間の特徴点を対応づ
けることが出来るようになる
• 局所特徴量:Harris特徴量,SIFT特徴量
• マッチング:正規化相互相関,SIFTマッチング
• 画像間の関係をPydotを用いてグラフ表示することが出来
るようになる
第2章の目次
• 2.1 Harrisコーナー検出器
• 2.1.1 画像間の対応点を見つける
• 2.2 SIFT
• 2.2.1 特徴点
• 2.2.2 記述子
• 2.2.3 特徴点を検出する
• 2.2.4 記述子を対応づける
• 2.3 ジオタグ付きの画像を対応づける
• 2.3.1 Panoramioからジオタグ付きの画像をダウンロードする
• 2.3.2 局所記述子を使って対応づける
• 2.3.3 関連画像を可視化する
• 2.4 演習問題
2.1 Harrisコーナー検出器
• 周辺に複数方向のエッジがある点=コーナーを検出
画像引用 http://d.hatena.ne.jp/nodamushi/20131206/1386355795
コーナー!
エッジ
2.1 Harrisコーナー検出器
• 周辺に複数方向のエッジがある点=コーナーを検出
!
!
!
• 一次微分ガウシアンフィルタが二階微分相当の物に
変換する処理になる
ガウス分布などの重み行列
画像の勾配
2.1 Harrisコーナー検出器
• ガウス関数を一次微分することでエッジ検出が行える
ガウス関数 一次微分ガウス関数
2.1 Harrisコーナー検出器
• の固有値( )に応じてコーナーか判定する
• 実際は固有値を求めず以下の判別関数を使う
!
• この判別関数が大きければ           
コーナーとする
¯MI 1, 2
行列の判別式
行列の対角成分の和
画像引用 http://www.isl.titech.ac.jp/ nagahashilab/member/longb/iip/LectureNotes/lecture3.pdf
2.1 Harrisコーナー検出器【実装】
後述する3つの関数を使用してコーナー検出する
array:すべての要素は同一の型という
    制限を持つリスト(のようなもの)
2.1 harris.py
こんな結果が出ればOKです
• harris.pyを作り以下の関数を追加する
1. compute_harris_response
2. get_harris_points
3. plot_harris_points
2.1 Harrisコーナー検出器【実装】
2.1 Harrisコーナー検出器【実装】
1. compute_harris_response
2.1 Harrisコーナー検出器【実装】
1. compute_harris_response
im : array 入力画像
sigma : ガウシアンフィルタ
の標準偏差
2.1 Harrisコーナー検出器【実装】
1. compute_harris_response
Ix
Iy
Ixx
2.1 Harrisコーナー検出器【実装】
1. compute_harris_response
Ix
Iy
Ixx
各画素の    の値が格納された行列(Harris応答画像)が返り値(array)
2.1 Harrisコーナー検出器【実装】
2. get_harris_points
2.1 Harrisコーナー検出器【実装】
2. get_harris_points
harrisim : Harris応答画像(array)
min_dist : コーナーや画像境界から
分離する最小ピクセル数
threshold : 最大Harris応答値の
何倍をしきい値とす
るかのパラメータ
2.1 Harrisコーナー検出器【実装】
numpy.nonzero:
要素が0じゃない位置を返す
垂直方向(dim=0) 水平方向(dim=1)
0 1 1
0 1 0
0 1 0
入力画像
垂
直
方
向
水平方向
2. get_harris_points
2.1 Harrisコーナー検出器【実装】
2. get_harris_points
画像境界付近を除外した領域内に
おける候補点位置に1を立てる
2.1 Harrisコーナー検出器【実装】
2. get_harris_points
Harris応答値の大きい特徴点
から順に、見つけたコーナー
の周囲min_dist内のコーナー
を除外し(allowed_locations
の要素を0にし)、
コーナー位置(x,y)を格納した
行列(array)を返り値とする
2.1 Harrisコーナー検出器【実装】
3. plot_harris_points
2.1 Harrisコーナー検出器【実装】
3. plot_harris_points
image : 入力画像(array)
filtered_coords :
コーナー位置を格納した行列
(array(array(x,y)))
入力画像のコーナー位置に * を表示する
2.1 Harrisコーナー検出器【実装】
前述した3つの関数を使用してコーナー検出する
こんな結果が出ればOKです
2.1 harris.py
min_dist=6 , threshold = 0.1
2.1.1画像間の対応点を
見つける
• 画像間の対応を見つける
= 画像間で一致する特徴点を見つける
そのためには…各特徴点の記述子どうしの比較が必要
→記述子の記述方法と類似度の評価方法を選択
2.1.1画像間の対応点を
見つける
• 教科書ではまず、Harrisコーナー点を使用した代表
的な方法を紹介している
• 記述子:着目点中心の長方形画像パッチのグレー
レベル
• 類似度の評価方法:正規化相互相関
2.1.1画像間の対応点を
見つける
• 画像パッチ:
• 画像パッチの相関:
• 関数  は手法により異なる。正規化相互相関は
!
!
 値が大きいほど、類似度が高いと評価される。
I1(x) I2(x)
f(.)
標準偏差 平均輝度値パッチのピクセル数
2.1.1画像間の対応点を
見つける
後述する5つの関数を使用してコーナー検出する
2.1.1harris_match.py こんな結果が出ればOKです
※結果が出るまで5分くらい待つ
• harris.pyに以下の関数を追加する
1. get_descriptors
2. match
3. match_twosided
4. appendimages
5. plot_matches
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける
image : 入力画像
filtered_coords :
コーナー位置を格納した行列
(array(array(x,y)))
wid :
画像パッチの一辺の長さ(pix)
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける
ネストしたリストをフラットにする
例:[[1,2],[3,4]]
→ [1,2,3,4]
image : 入力画像
filtered_coords :
コーナー位置を格納した行列
(array(array(x,y)))
wid :
画像パッチの一辺の長さ(pix)
ネストしたリストをフラットにする
例:[[1,2],[3,4]]
→ [1,2,3,4]
一つのパッチの特徴量(輝度値)を一行に表現
したimage画像中のパッチのリスト
image : 入力画像
filtered_coords :
コーナー位置を格納した行列
(array(array(x,y)))
wid :
画像パッチの一辺の長さ(pix)
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける
desc :
パッチ特徴量のリスト
threshold :
ncc相関値のしきい値
2.1.1画像間の対応点を
見つける
desc :
パッチ特徴量のリスト
threshold :
ncc相関値のしきい値
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
d
d
e
s
c
2
desc1
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける
desc :
パッチ特徴量のリスト
threshold :
ncc相関値のしきい値
2.1.1画像間の対応点を
見つける
desc :
パッチ特徴量のリスト
threshold :
ncc相関値のしきい値
例 : where(a > 5) a の要素が 5より大きな要素のindexを返す
where(条件) :
条件を満たす要素のindexを返す
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける
2画像間の行数を合わせるため、
少ない行の画像には0を詰める
2.1.1画像間の対応点を
見つける
2画像間の行数を合わせるため、
少ない行の画像には0を詰める
2画像の結合
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける
2画像間で対応する点間を線分でつなぐ
2.1.1画像間の対応点を
見つける
先述した5つの関数を使用してコーナー検出する
2.1.1harris_match.py こんな結果が出ればOKです
※結果が出るまで5分くらい待つ
2.1.1画像間の対応点を
見つける
2.1.1画像間の対応点を
見つける 問題点
!
• 正規化相互相関の、記述力が足らず誤対応が多い
• スケールや回転に対して不変でない
2.2 SIFT
局所画像特徴量の代表的な手法:SIFT
SIFTは特徴点の検出と記述の両方を行う
<SIFT特徴量>
• スケール、回転、明度に不変な特徴量
SIFTの参考文献
[1]Lowe氏(SIFT開発者)の論文 
http://www.cs.ubc.ca/ lowe/papers/ijcv04.pdf
[2]藤吉先生による日本語論文
http://www.vision.cs.chubu.ac.jp/sift/PDF/
sift_tutorial.pdf
一度読むことをオススメします!
本資料もこの論文の図を引用します
SIFTアルゴリズム
SIFTアルゴリズムは以下の4ステップで行う
1. スケールとキーポイントの検出
2. キーポイントのローカライズ
3. オリエンテーションの算出
4. 特徴量の記述
検出
記述
1. 複数の  に対するDoG(Difference of gaussian)画像を生成する
スケールとキーポイントの検出
平滑化画像 入力画像
DoG画像
ガウス関数
2. 注目画素と26近傍を比較し、極大値の画素をキーポ
イント候補点として検出する。これを  の小さなDoG
画像から順に行う
特徴を最も含むスケール を自動で決めるため、拡大、
縮小に不変な特徴量となる
スケールとキーポイントの検出
2.2.2 記述子
• また、特徴点の勾配方向から、特徴点の方向を求める。
これにより回転不変の特徴量になる
• これ以上の説明は教科書の範囲を超えるので割愛
VLFeatのインストール
2.2.3sift.pyを実行するにはVLFeatが必要
<Windows>
HP(http://www.vlfeat.org/)に行きダウンロードする
フォルダ(vlfeat-0.9.18)のsift.exeとvl.dllを
2.2.3sift.pyと同じディレクトリに置く
!
<Mac>
HPに行きダウンロードする
フォルダ(vlfeat-0.9.18)下のMaci64フォルダ下の
siftとlibvl.dylibを2.2.3sift.pyと同じディレクトリに置く
sift.pyの18行目のstr( sift …) -> str( ./sift )に変更する
!
2.2.3 特徴点を検出する
後述する4つの関数を使用してSIFT特徴点を検出する
2.2.3 sift.py
こんな結果が出ればOKです
2.2.3 特徴点を検出する
• sift.pyに以下の関数を追加
1. process_image
2. read_features_from_file
3. write_features_to_file
4. plot_features
2.2.3 特徴点を検出する
1. process_image
2.2.3 特徴点を検出する
1. process_image
imagename : 入力画像の名前
resultname : 出力画像の名前
params :SIFTパラメータ
2.2.3 特徴点を検出する
2. read_features_from_file
!
2.2.3 特徴点を検出する
2. read_features_from_file
!
filename(.sift)
第一列から順に
xの座標値 yの座標値 スケール 回転角度記述子の情報(128次元)
特徴点の位置、スケール、回転情報
2.2.3 特徴点を検出する
3. write_features_to_file
2.2.3 特徴点を検出する
3. write_features_to_file
2.2.3 特徴点を検出する
4. plot_features
2.2.3 特徴点を検出する
4. plot_features
特徴点のスケール
2.2.3 特徴点を検出する
先述した4つの関数を使用してSIFT特徴点を検出する
2.2.3 sift.py
こんな結果が出ればOKです
2.2.4 記述子を対応づける
後述する4つの関数を使用してコーナー検出する
2.2.4 sift_match.py
こんな結果が出ればOKです
2.2.4 記述子を対応づける
• sift.pyに以下の関数を追加する
1. match
2. match_twosided
3. appendimages (harris.pyから移植)
4. plot_matches (harris.pyからほぼ移植)
2.2.4 記述子を対応づける
1. match
2.2.4 記述子を対応づける
1. match
内積のarccosが小さい =
特徴量が似ている
2.2.4 記述子を対応づける
2. match_twosided
2.2.4 記述子を対応づける
3. appendimages
2.2.4 記述子を対応づける
4. plot_matches
harris.pyとの変更点
2.2.4 記述子を対応づける
先述した4つの関数を使用してコーナー検出する
2.2.4 sift_match.py
こんな結果が出ればOKです
2.3 ジオタグ付きの画像を
対応づける
• ジオタグ:撮影場所の付加情報
• Panoramio:Googleの画像共有サービス
• APIが用意されており            
プログラムから               
アクセス可能
2.3.1 Panoramioからジオタグ付きの
画像をダウンロードする
• urllib.urlopen()で以下のURLを指定してオブジェ
クトを読み込む
• http://www.panoramio.com/map/get_panoramas.php?order=popularity&
set=public&from=0&to=20&minx=-77.037564&miny=38.896662&
maxx=-77.035564&maxy=38.898662&size=medium'
• !
!!!!!!!!!!!!!!!
•ホワイトハウスを中心 0.001の範囲にある画像を、
人気度の高いものから 20 個取得する
人気度順
先頭から20番
目まで選ぶ
最小経度 最小緯度最大経度 最大緯度
2.3.1 Panoramioからジオタグ付きの
画像をダウンロードする
• 結果はJSON形式で得られる
• python2.6以上は標準でjson形式が扱える
2.3.1 Panoramioからジオタグ付きの
画像をダウンロードする
simplejsonじゃなくて標準jsonを使用します
2.3.1 Panoramioからジオタグ付きの
画像をダウンロードする
• 実行すると、panoramioフォルダにダウンロードした画像が保存される
2.3.2 局所記述子を使って
対応づける
• 画像からSIFT記述子を抽出して.siftファイルに保存
する
• その後、すべてのsiftファイルの組み合わせで特徴
点のマッチングを行い、相互マッチした数を保存す
る
2.3.2 局所記述子を使って
対応づける
2.3.2 局所記述子を使って
対応づける
(画像名前).siftというファイルに
(画像名前)のsift特徴量リストを
作成する
2.3.2 局所記述子を使って
対応づける
panoramioフォルダ下の画像数
の正方行列を作成
2.3.2 局所記述子を使って
対応づける
その正方行列に、相互マッチし
た特徴点の数を格納
2.3.2 局所記述子を使って
対応づける
panoramio_matchscores.pklに
結果をダンプする
2.3.2 局所記述子を使って
対応づける
2.3.2 pano_sift_matchを実行すると、panoramioフォルダ下に
各画像の特徴量を記述した.siftファイルが作成される
2.3.2 局所記述子を使って
対応づける
また、2.3.2 pano_sift_matchを実行すると、各画像間の相関値を
記述したpanoramio_matchscores.pklファイルが作成される
2.3.2 局所記述子を使って
対応づける
• 単純な画像間の距離を用いて、
見た目が似た画像同士を結びつ
ける
ある画像群のmatchscores行列
2.3.3 関連画像を可視化する
• 似たもの同士の画像を図
のように結びつけて表示
したい
• 描画ライブラリGraphvis
のPythonインターフェー
ス:Pydotを使う
2.3.3 関連画像を可視化する
Pydotを使用するには…
graphvizとpygraphvizとpyparsing(1.x系)をインストールしたあとにPaydotをインストール
(※pyparsingには2.xと1.x系がある。Pydotを使うには1.x系のpyparsingを使う必要がある。)
!
< Macでpipを使用してPydotをインストールする方法 >
sudo pip uninstall pyparsing #すでに2.x系が入っている人はアンインストール
sudo pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/
pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709
brew install graphviz
sudo pip install pygraphviz
sudo pip install pydot
!
———————————————————————————-
!
2.x系だと(pip install pyparsingとすると標準でインストールされる)以下のエラーが発生する。
>>> import pydot
Couldn't import dot_parser, loading of dot files will not be possible.
2.3.3 関連画像を可視化する
< WindowsやMacでpipを使用せずPydotをインストールする方法 >
以下のサイトでダウンロードおよびインストールしてください
• Pydotパッケージ(http://code.google.com/p/pydot/)!
• Pyparsing(http://pyparsing.wikispaces.com/)!
• GraphViz (http://www.graphviz.org/)
2.3.3 関連画像を可視化する
•
(ここでジオタグ画像から離れて…)Pydotの描画例
• 深さ2,5つの枝ノードをもつグラフ
2.3.3 関連画像を可視化する
2.3.2でダンプした
panoramio_matchscores.pklを読み込む
2.3.3 関連画像を可視化する
グラフ化した画像をwhitehouse.pngという
名前で保存する
2.3.3 関連画像を可視化する
2.3.3 関連画像を可視化する
2.3.3 pano_pydot.pyを実行すると、各画像間の相関値を記述した
panoramio_matchscores.pklを読み込み画像間の関係をグラフィ
カルに表示した画像whitehouse.pngが作成される
本日習得したこと
• 画像から局所特徴量を抽出し、画像間の特徴点を対
応づけることが出来るようになった
• 局所特徴量:Harris特徴量,SIFT特徴量
• マッチング:正規化相互相関,SIFTマッチング
• 画像間の関係をPydotを用いてグラフ表示すること
が出来るようになった
今後の展望
• 本章で習得した局所特徴量の抽出方法および画像間
のマッチング手法を用いて、第3章のパノラマ画像
の作成や、ロバストなホモグラフィー推定を行う。
また第4章のカメラキャリブレーションやARにも
応用する。
演習問題
• 時間のある人だけ挑戦してください
演習問題 2.4.1
• Harrisコーナー点を対応づける関数を変更して、点の間の
最大距離を指定できるようにし、対 応づけをよりロバス
トにしてください。
演習問題 2.4.2
画像のぼかし(もしくはROFによるノイズ除去)を徐々に強く
しながら、Harrisコーナーを抽 出してください。どのように
なりますか?
演習問題 2.4.3
• Harris以外のコーナー検出器に、FASTコーナー検出器と
いうものがあります。すべてPython で書かれたもの(http://
www.edwardrosten.com/work/fast.html)など、その実装は
たくさんあ ります。この検出器を試して、感度の閾値を
セットし Harris コーナーと比較してください。
演習問題 2.4.4
• 異なる解像度で画像のコピーを作ってください(例
えば、何倍かに拡大します)。それぞれの画 像から
SIFT 特徴量を抽出してください。特徴点の対応を
描画し、スケールに対する不変性が 破たんする状
況を確認してください。
演習問題 2.4.5
• VLFeatのコマンドラインツールには、
MSER(Maximally Stable Extremal Regions)と
い う 領 域 検 出 器 の 実 装 も 含 ま れ て い ま
す(http://en.wikipedia.org/wiki/
Maximally_stable_ extremal_regions)。MSER
領域を抽出し、--read-frames オプションを使っ
て SIFT 記述 子計算処理に渡す関数と、楕円領域
を描画する関数を作ってください。
演習問題 2.4.6
• 2枚の画像間の特徴点を対応づけ、その対応に基づ
いて、スケールの違いや平面内での回転を 推定す
る関数を作ってください。
演習問題 2.4.7
• ホワイトハウスの例のように、選んだ場所の画像を
ダウンロードして対応づけしてください。 画像を
関連づけるよい指標を見つけられますか? 地理上の
代表画像を選ぶために、グラフ構 造は使えそうで
すか?

静岡Developers勉強会コンピュータビジョンvol2