特徴量の照合は、2つ以上の画像の特徴量の類似性を検出し、測定するプロセスです。
このプロセスは、画像を比較して、画像間の変化や違いを識別するために使用することができます。
また、異なる画像から対応する点を探し出し、パノラマ合成やオブジェクトトラッキングなどの作業にも利用することができます。
特徴量の照合には、さまざまなアルゴリズムがあります。
最も一般的なアルゴリズムには、Harrisコーナー検出器、SUSANアルゴリズム、FASTアルゴリズムなどがあります。
これらのアルゴリズムにはそれぞれ長所と短所があるため、特定のタスクに最適なアルゴリズムを選択することが重要です。
今回使用するORBアルゴリズムは、画像中の特徴を検出し、それを他の画像中の対応する特徴と照合することで動作します。
これは、検出された各特徴に対して特徴記述子を作成することで行われます。
特徴記述子は、特徴に関する情報(位置、大きさ、向きなど)を含むベクトルです。
この記事では、OpenCVのORBアルゴリズムを使って、特徴量のマッチングを行い、アプリに表示します。
Pythonによる特徴量照合アルゴリズムの実装 OpenCV
OpenCVはコンピュータビジョンアルゴリズムのライブラリで、特徴マッチングを含む様々なタスクの実行に使用することができます。
OpenCVはPythonとC++の両方で利用できるため、クロスプラットフォームでの開発によく利用されています。
関連記事:Python OpenCVを使った画像中のキーポイントの特定
さて、特徴量の照合とは、向きや遠近感、明るさが異なる、あるいはサイズや色が異なる2つの画像の特徴量を比較することだとおわかりいただけたと思います。
では、その実装を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import cv2
from google.colab.patches import cv2_imshow
img1 = cv2.imread( 'sample.jpg' )
img2 = cv2.imread( 'sample2.jpg' )
orb = cv2.ORB_create(nfeatures = 500 )
kp1, des1 = orb.detectAndCompute(img1, None )
kp2, des2 = orb.detectAndCompute(img2, None )
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True )
matches = bf.match(des1, des2)
matches = sorted (matches, key = lambda x: x.distance)
match_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[: 50 ], None )
cv2_imshow(match_img) cv2.waitKey() |
今のところ、コードが少し不明瞭なのは分かっています。
心配しないでください、これから一行一行、全コードを見ていきます。
- 1行目と2行目 – プログラムに必要なライブラリをインポートします。
-
- 4行目と5行目 –
imread
関数を使用してプログラムに画像をロードします。
- 4行目と5行目 –
-
- 7行目 – 約500の特徴を検出するFeature Matcher ORBオブジェクトを作成します。
-
- 8行目と9行目 – 両方の画像の特徴を検出するための関数
detectAndCompute
を実行します。
- 8行目と9行目 – 両方の画像の特徴を検出するための関数
- 11行目と12行目 – 関数
BFMatcher
とmatch
は、特徴量のマッチングに最適な結果を返します。 -
- 14行目 – 次に、距離の昇順で結果をソートし、より良い結果を前面に出します。
-
- 16行目 – 関数
drawMatches
を使用して、最初の50個の結果をプロットし、関数im_show
を使用して出力画像を表示します。
- 16行目 – 関数
こちらもお読みください。
このコードをいくつかの画像に対して実行したときの出力を見てみましょう。
まとめ
この記事では、Feature Matchingの概念を探求し、Feature Matchingの概念にアプローチする基本的な方法を探りました。
様々な画像を試してみて、その結果に驚いてみてください お読みいただきありがとうございました。