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 : 画像を保存する
環境
準備
次の2つの画像を用意しjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
basho.png
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)が表示されます。類似度の高い特徴点として「最上川」をとらえていることが分かります。
以下のサイトを参考にさせていただきました
OpenCV公式 >> Feature Matching
OpenCV公式 >> AKAZE local features matching