Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

AKAZE特徴量による画像マッチング

 OpenCVに実装されているAKAZE(Accelerated KAZE)特徴量検出を用いて2つの画像のマッチングを行います。検出された特徴点はBrute-Force Matcher(ある特徴点を別の画像の全ての特徴点との比較し距離を計算する)によりどれだけ似ているかが計算されます。

関連記事

画像のヒストグラムを比較し類似度を求める
テンプレートマッチングで類似画像を探す

やること
  • 2つの画像を読み出す
  • AKAZE検出器を生成しそれぞれの画像の特徴点を検出する
  • BFMatcherにより特徴点間の距離を計算する
  • 特徴点を描画する
使った関数・メソッド
  • cv2.imread : 画像を読み出す
  • cv2.AKAZE_create : AKAZE検出器の生成
  • detector.detectAndCompute : 特徴点の検出
  • cv2.BFMatcher : BFMatcherオブジェクトの生成
  • cv2.drawMatches : マッチング結果の描画
  • cv2.imwrite : 画像を保存する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

次の2つの画像を用意しjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

f:id:T_A_T:20190331142102p:plain
basho.png

f:id:T_A_T:20190331142136p:plain
mogamigawa.png

コード
import cv2  #OpenCVのインポート

# img1の読み出し
img1 = cv2.imread('basho.png') 
# img2の読み出し
img2 = cv2.imread('mogamigawa.png') 

# img1をグレースケールで読み出し
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) 
# img2をグレースケールで読み出し
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) 

# AKAZE検出器の生成
akaze = cv2.AKAZE_create() 
# gray1にAKAZEを適用、特徴点を検出
kp1, des1 = akaze.detectAndCompute(gray1,None) 
# gray2にAKAZEを適用、特徴点を検出
kp2, des2 = akaze.detectAndCompute(gray2,None) 

# BFMatcherオブジェクトの生成
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

# Match descriptorsを生成
matches = bf.match(des1, des2)

# matchesをdescriptorsのdistance順(似ている順)にsortする 
matches = sorted(matches, key = lambda x:x.distance)

# img3に検出結果(最初の10点)を描画
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags = cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

cv2.imwrite('match.png',img3)

実行結果

2つの画像のマッチング結果(best10)が表示されます。類似度の高い特徴点として「最上川」をとらえていることが分かります。
f:id:T_A_T:20190331141530p:plain

以下のサイトを参考にさせていただきました

OpenCV公式 >> Feature Matching
OpenCV公式 >> AKAZE local features matching

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村