アイサカ・IT・Python

Python AI×機械学習×webサービス

Pythonで簡単にできる!二つの画像の特徴点を結ぶプログラム!

f:id:aisakakun:20180821214218p:plain
プログラミング言語Pythonを使用して、特徴抽出を行います。
Pythonを触ったことすらない方も取り組めるように、環境準備から行います。
環境として必要なものは下記の通りです。
下記の環境準備ができている方は、「特徴点を結ぶ」からご覧ください。

コマンドライン入力を行う際は、
WindowsならPowerShellMacなら端末もしくはiTermをご活用ください。

python3
pip3
numpy
cv2+contrib

環境準備

Python3をインストールする

以下のサイトでダウンロードしてください。
Download Python | Python.org
ダウンロードしたパッケージインストーラに従い、インストール。
端末」を起動しコマンドライン

python3 --version

と入力し

Python 3.6.6

このように出力されれば無事インストールできています。
※バージョンはダウンロードした際のバージョンによって異なります。

pip3

pip3はpython3をインストールした時に一緒にインストールされています。
どの場所にあるのかを調べたい方はコマンドラインにて

which pip3

と入力してください。入っていれば何かしらディレクトリが表示されます。

numpyのインストール

pip3があれば各モジュールをインストールすることができます。コマンドライン上で以下のように入力してください。

pip3 install numpy

その結果、

Successfully installed numpy-1.15.0

のようにコマンドライン上で表示されていればうまくインストールできています。

opencv+contribのインストール

今回の「特徴点を結ぶ」では普通のopencvではなく、「opencv+contrib」をインストールしておく必要があります。そのため、opencv+contribではなく、opencvをインストールしている方は、一度アンインストールする必要があります。

opencvのアンインストール

opencvをアンインストールするためには以下のコマンドを入力いたします。

pip3 uninstall opencv-python
opencv+contribのインストール
pip3 install opencv-contrib-python

以上で環境準備は完了です。次に画像の準備をしましょう。

特徴点を結ぶ

環境の準備が整ったので早速特徴点を結ぶプログラムを作りましょう。

画像の準備

今回は土星を画像として使用します。
・探索画像(saturn.png)
f:id:aisakakun:20180821211545p:plain
・被探索画像(solar.png)
f:id:aisakakun:20180821211618p:plain

コード

準備が完了したので、早速コードを書いていきましょう。

import numpy as np
import cv2
img1 = cv2.imread('saturn.png',0)
img2 = cv2.imread('solar.png',0)
#特徴抽出機の生成
detector = cv2.xfeatures2d.SIFT_create()
#kpは特徴的な点の位置 destは特徴を現すベクトル
kp1, des1 = detector.detectAndCompute(img1, None)
kp2, des2 = detector.detectAndCompute(img2, None)
#特徴点の比較機
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
#割合試験を適用
good = []
match_param = 0.5
for m,n in matches:
    if m.distance < match_param*n.distance:
        good.append([m])
#cv2.drawMatchesKnnは適合している点を結ぶ画像を生成する
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good, None,flags=2)
cv2.imwrite("shift_solar.png", img3)

下記サイトのコードを参考にいたしました。
OpenCV(Python)で物体認識、特徴抽出(SIFT、SURF、A-KAZEの使い方)

ディレクトリはどこでも良いですが、画像があるディレクトリとプログラムがあるディレクトリは同じにしてください。
※同じにしたくない場合は、絶対パスで指定してください。

実行結果

実行結果は以下の通りです。
f:id:aisakakun:20180821212205p:plain
土星の中で特徴となった点が左の画像で繋がっています。この画像の結果から、拡大縮小があったとしても同一の画像を見つけることができていることが分かります。

同一画像で結ぶ

同一画像で特徴点を結ぶとこのくらい結ばれます。
f:id:aisakakun:20180821212508p:plain

ゴッホアイデンティティを探る

油絵のゴッホの自画像と水彩画のゴッホの自画像の特徴点を結ぶとこのようになりました。

match_param = 0.6

に変更しています。
f:id:aisakakun:20180821213128p:plain
髭が似ているということだけはわかるみたいです。

まとめ

以上のような方法で特徴点を結ぶことができます。こういった処理をもとに、
・他人と自分の顔の類似度
・偽札か本物か
などもできるのでしょう。
Python3インストールからここまで、1時間でできますので、ぜひ取り組んでみてください!