投稿

2月, 2020の投稿を表示しています

特徴量検出器の比較

イメージ
今回はSIFTやSURFなど様々なものがある特徴量検出器の違いを、実際に画像から特徴点を検出することで比較していきます。 特徴点の抽出方法は こちら を参考にしてください。 今回、特徴点を抽出したのは次の画像です。 元画像 検出元の画像は幅が454px、高さが397pxと、あえて小さいものにしています。 特徴点検出結果 こちらの画像に対して、SURF、KAZE、AKAZE、ORB、SIFTの5種の特徴量を検出した結果が次の画像となります。 特徴量検出結果(flags=4) AKAZE特徴量は円が小さいですね。スケール変化に弱いのでしょうか・・・(理論的に言えなくてすいません) 検出結果の比較 またそれぞれの特徴点の数、特徴点のサイズの平均値および標準偏差をグラフ化して比較をしてみました。 特徴検出器によって、検出される特徴点の数やサイズも全然違うことが分かりますね。 次の表に今回の結果をまとめてみました。 特徴検出器 概要 KAZE 検出される特徴点の数が多い。サイズは小さい AKAZE KAZEに比べて、数もサイズも小さい。 SURF 特徴点の数は少なめ。サイズにばらつきあり。 ORB 特徴点サイズが大きい。 SIFT AKAZEより大きい特徴が検出されているが、平均サイズは最小。 次回はこれらの特徴量のマッチング精度に着目してみたいところです! おまけ 前回記事 でakaze = cv2.AKAZE_create() としていた箇所を下記に書き換えると、扱う特徴量検出器を変更することができます。 sift = cv2.xfeatures2d.SIFT_create() kaze = cv2.KAZE_create() akaze = cv2.AKAZE_create() orb = cv2.ORB_create() surf = cv2.xfeatures2d.SURF_create() 今回使用した画像:自作の時計 今回使用した画像の時計はアイロンビーズで手作りしたものになります。 好きな絵を作れるので非常におすすめです。 ひっつき虫という練り消しみたいなものを使えば壁にも貼れますので、ぜひ作ってみてください。

特徴点のマッチングと対応点の座標のCSV出力

イメージ
前回記事 ではAkaze特徴点を抽出し、CSVファイルに書き出す方法を紹介しました。 今回は特徴点を抽出した2枚の画像に対して、特徴点のマッチングを行う方法を紹介します。 開発環境はjupyter notebook、言語はpythonです。 今回使用した画像・コード一式は google drive にも保存しておりますので、必要に応じてお使いください。 作成したコード #モジュールのインポート import cv2 import glob import matplotlib.pyplot as plt import numpy as np import pandas as pd import os %matplotlib inline #検出器の生成 akaze = cv2.AKAZE_create() filepath_train = glob.glob("train/*.png") filepath_query = glob.glob("query/*.png") bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) df = pd.DataFrame(columns=['x_query','y_query','x_train','y_train','Distance','img_index']) for num in range((len(filepath_train))): img_train = cv2.imread(filepath_train[num]) img_query = cv2.imread(filepath_query[num]) kp_train, des_train = akaze.detectAndCompute(img_train, None) kp_query, des_query = akaze.detectAndCompute(img_query, None) img_train_key = cv2.drawKeypoints(img_train, kp_tr

特徴点の抽出とCSVファイルへの書き出し detectAndCompute()

イメージ
画像から特徴点を抽出し、特徴点を画像およびCSVファイルに書き出す方法を紹介します。 開発環境はjupyter notebook、言語はpythonです。 今回使用した画像・コード一式は google drive にも保存しておりますので、必要に応じてお使いください。 作成したコード #モジュールのインポート import cv2 import glob import matplotlib.pyplot as plt import numpy as np import pandas as pd import os %matplotlib inline akaze = cv2.AKAZE_create() filepath = glob.glob("*.jpg") for num in range(len(filepath)): img = cv2.imread(filepath[num]) kp, des = akaze.detectAndCompute(img, None) df = pd.DataFrame(columns=['x', 'y', 'size', 'angle','response','octave','class_id']) for i in range(len(kp)): df.loc["kp"+str(i)] = [kp[i].pt[0],kp[i].pt[1],kp[i].size,kp[i].angle,kp[i].response,kp[i].octave,kp[i].class_id] df.to_csv("key point"+"_"+os.path.split(filepath[num])[1][:-4]+".csv") img_key = cv2.drawKeypoints(img, kp, None,color=(0,0,255), flags=4) cv2.imwrite(os.path.split(filepath[nu

画像のヒストグラム取得とcsvファイルへの書き出し cv2.calcHist()

イメージ
画像のヒストグラムを取得し、CSVファイルに出力する方法 を紹介します。 開発環境はjupyter notebook、言語はpythonです。 今回使用した画像・コード一式は google drive にも保存しておりますので、必要に応じてお使いください。 作成したコード #モジュールのインポート import cv2 import glob import matplotlib.pyplot as plt import numpy as np import pandas as pd import os %matplotlib inline #RGB画像のヒストグラム取得 filename = glob.glob("*.jpg") df = pd.DataFrame() for num in range(len(filename)): print((os.path.split(filename[num])[1])) img = cv2.imread(filename[num]) color = ['b','g','r'] for index, item in enumerate(color): histgram = cv2.calcHist(img,[index],None,[256],[0,256]) df[(os.path.split(filename[num])[1])+"_"+item] = pd.Series(np.reshape(histgram,-1)) df.to_csv("hist_RGB.csv") #グレースケール画像のヒストグラム取得 filename = glob.glob("*.jpg") df_gray = pd.DataFrame() for num in range(len(filename)): print((os.path.split(filename[num])[1])) img = cv2.imread(filename[num]) img = cv2.cvtColor(img