投稿

特徴点のマッチングと対応点の座標の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...

画像の回転 cv2.rotate, np.rot90, cv2.getRotationMatrix2D

イメージ
pythonで画像を回転させる方法を紹介します。 特に今回は affine変換 による回転 cv2.rotate() による回転 np.rot90() による回転 を紹介します。 開発環境はjupyter notebook、言語はpythonです。 今回使用した画像・コード一式は google drive にも保存しておりますので、必要に応じてお使いください。 作成したコード #モジュールのインポート import cv2 import glob import numpy as np import matplotlib.pyplot as plt import os %matplotlib inline #affine変換用def def rotate_affine(path,angle): img = cv2.imread(path) # 変換後の画像高さを定義 height = img.shape[0] # 変換後の画像幅を定義 width = img.shape[1] # 回転の軸を指定:今回は中心 center = (int(width/2), int(height/2)) # scaleを指定 scale = 1 trans = cv2.getRotationMatrix2D(center, angle,scale) img_rotate_affine = cv2.warpAffine(img, trans, (width,height),flags=cv2.INTER_CUBIC) cv2.imwrite(os.path.split(path)[1][:-4]+"_rotate_affine_"+str(angle)+".bmp",img_rotate_affine) return #画像の読み込み filename = glob.glob("*.jpg") for n in range(len(filename)): img = cv2.imread(filename[n]) angle_degree = 0 #1....

画像の拡大・縮小(resize)

イメージ
pythonで画像をリサイズ(拡大・縮小)する方法を紹介します。 今回は cv2.resize() によるリサイズ アフィン変換 によるリサイズ PIL の resize によるリサイズ の3手法を紹介しています。 開発環境はjupyter notebook、言語はpythonです。 今回使用した画像・コード一式は google drive にも保存しておりますので、必要に応じてお使いください。 作成したコード #モジュールのインポート import cv2 import glob import numpy as np import matplotlib.pyplot as plt import os from PIL import Image %matplotlib inline #affine変換によるリサイズ用def文 def resize_affine(path,ratio): img = cv2.imread(path) h, w = img.shape[:2] src = np.array([[0.0, 0.0],[0.0, 1.0],[1.0, 0.0]], np.float32) dest = src * ratio affine = cv2.getAffineTransform(src, dest) img3 = cv2.warpAffine(img, affine, (int(float(w)*ratio), int(float(h)*ratio)), cv2.INTER_LANCZOS4) cv2.imwrite(os.path.split(path)[1][:-4]+"_resize_affine_"+str(ratio)+".bmp",img3) return #PILによるリサイズ用def文 def resize_PIL(path,ratio): img = Image.open(path) w,h = img.size img_resize = img.resize((int(float(w)*ratio),int(float(h)*ratio)),Image...

RGB画像のチャンネル分割 cv2.split()

イメージ
今回はカラー画像をRGB(Red、Green、Blue)の3チャンネルに分割する手法を紹介します。 開発環境はjupyter notebook、言語はpython3系です。 今回使用した画像・コード一式は google drive に保存しておりますので、必要に応じてお使いください。 作成したコード import cv2 import glob import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import ImageGrid import numpy as np %matplotlib inline filename = glob.glob("img/pure_color.PNG") for files in filename: img = cv2.imread(files) Blue,Green,Red = cv2.split(img) cv2.imwrite("img/Blue.png",Blue) cv2.imwrite("img/Green.png",Green) cv2.imwrite("img/Red.png",Red) このコードを実行することで、トップ画像のように、画像を赤、青、緑の3つのチャンネルに分割することができます。 処理の解説 概要 今回のポイントは、 Blue,Green,Red = cv2.split(img) です。 この処理では、cv2.split()の括弧内にカラー画像を読み込んだ結果であるimgを代入しています。 これによって引数として画像のR, G, Bの3つの数値が出てくるので、変数Blue, Green, Redに格納しています。 ここで注意したいのは変数の順番をRGBではなくBGRにすることと、imgにはカラー画像を用いるということです。 cv2.cvtColor()等でグレースケールにした画像をcv2.split()に入れると、画像のチャンネル数が1チャンネルしかないため、エラーになります。 RGBへの分割とは チャンネル分割の処理の基礎知識について紹介します。 デジタル画像...

グレースケール化 cvtColor()

イメージ
pythonで画像をグレースケール化する方法を紹介します。 今回使用した画像・コード一式は google drive に保存しておりますので必要に応じてお使いください。 作成したコード import cv2 import glob import matplotlib.pyplot as plt %matplotlib inline #画像の読み込み・表示 filename = glob.glob("curry*") img = cv2.imread(filename[0]) img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img2) #グレースケール化 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite("grayscale.bmp",img) plt.imshow(img) plt.gray() コマンド実施例 コマンド実施前後で画像を比較しました。 元の画像のカレーは美味しそうですが、グレーにすると何とも言えないですね。 cv2.cvtColor()の使用方法 cv2.cvtColorは画像の色空間※を変換するコマンドです。 色を変換するということでconvert colorの略になっていますね。 一応記しておきますが、RGB, HSV, HLS, Lab, Luv, Gray (,Bayer)に変換できるそうです。 私自身RGBとGray以外使ったことないのですが、データによってということがあるのでしょうか・・・ ※色空間とは 座標で表されるような色の空間を指します。 例えばRGBの場合だと、赤緑青の三次元の空間で色が表されています。 実用例に基づくコマンド解説 今回の例では下記のコマンドを使用しています。 img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.cvtColor()内を見ていただくと、いずれもimg, cv2.COLOR_○○2△△となっています。 これはimgに対して、〇〇の色空間か...