#画像特徴とは
画像は,縦(ピクセル)×横(ピクセル)×色の次元数からなる情報を持っている.例えば,縦 100 ピクセル,横 100 ピクセルで 3 色のカラー画像だと,100 × 100 × 3 の 3 万次元の情報でデータが構成されている.日頃,こうした低次元ではない情報を扱う際,3 万次元のデータから 1 次元ずつの値を確認し,何かしらの判断を行うことはあまりなく,画像の特徴をうまく抽出して情報を扱っている.
ここで特徴の抽出には,全体特徴と局所的特徴の大きく 2 つあるが,今回,画像特有の局所特徴に絞って,特徴抽出の手法とその Python でのコーディングについて記載する.
※全体特徴については,統計的なデータの記事として別途記載する.
局所特徴の種類と概要
エッジ検出
画像の明るさが鋭敏に変化している箇所を検出する.また,データの特徴では,ピクセル値が不連続に変化している箇所を特定する.ここでは,不連続な箇所を検出するための代表的な微分フィルタとして,Sobel フィルタを用いた実装をする.
HoG特徴:Histograms of Oriented Gradients
輝度の勾配を角度ごとにヒストグラム化したもので,物体の形状を捉えるのに用いられる特徴量である.
SIFT特徴:Scaled Invariance Feature Transform
特徴点の検出と特徴量の記述の2段階の処理を行う.特徴点の検出では,スケールの異なる平滑化画像の差分から画像特徴と思われるキーポイントを決定し,各キーポイントの周りで周辺の画像の勾配情報を用いることで情報を記述する.
※特許が取得されているので利用する際には注意が必要.
各画像特徴を抽出する Python コード
入力に用いるデータ img_color は ndarray 型であることを前提とする.
img.shape = ( 画像の縦のサイズ, 画像の横のサイズ, 色の次元数(RGB(赤、緑、青)の順) )
まず前処理として,このカラー画像をグレイスケールに変換する.
from skimage import io
from skimage.color import rgb2gray
img_color = skimage.io.imread(Inputfilename)
img_gray = rgb2gray(img_color)
エッジ検出
エッジ処理の代表的な手法のひとつである Sobel フィルタを実装する.
Sobel フィルタの処理は sckit image の中に sobel という関数があるので,こちらを活用する.
# sobelフィルタ
from skimage.filters import sobel
sobel_img_gray = sobel(img_gray)
sobel_img_gray = sobel_img_gray.astype(np.uint8)
フィルタ処理後の画像を見たい場合には可視化することで確認できる.
io.imshow(sobel_img_gray)
ここで,何も表示されず,真っ暗な画面が表示される場合には,下記のようにフィルタ処理後の値を大きくしてやることで,見ることができる.ここで掛ける値については,いろいろと試してみて,ちょうどよい値を取るのが良い.
# 例:1000 倍してみる
sobel_img_gray = sobel(img_gray)*1000
HoG特徴
HoG 特徴を抽出する処理についても sckit image の中に feature という関数があるので,こちらを活用する.
from skimage import feature
from skimage import feature
fd, hog_image = feature.hog(img_gray,
orientations = 8,
pixels_per_cell = (8, 8),
cells_per_block = (2, 2),
visualize = True,
multichannel = False,
feature_vector = False)
hog_image = hog_image*100
hog_image = hog_image.astype(np.uint8)
HoG では,特徴量の値が入った fd と描画のための hog_image が出力される.
fd のデータ構造は次のようになっている.
print(fd.shape) = ( (img_gray[0] / pixels_per_cell[0]) - 1, (img_gray[1] / pixels_per_cell[1]) - 1, cells_per_block[0], cells_per_block[1], orientations)
HoG特徴について,画像を見たい場合には可視化することで確認できる.
io.imshow(hog_image)
SIFT特徴
SIFT特徴に関しては,OpenCV を用いて特徴抽出を行う.SIFT特徴では,カラー画像を扱うため,sckit image で画像を読み込んでいる場合には,BGR2RGB の変換を行わなければならない.
img_color= cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)
次に,SIFT特徴を抽出する処理を行う.
import cv2
import numpy as np
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
img_sift = cv2.drawKeypoints(img_gray, keypoints, None, flags=4)
SIFT特徴について,画像を見たい場合には可視化することで確認できる.
cv2.imshow('imgSIFT', img_sift )
cv2.waitKey(0)
cv2.destroyAllWindows()
各画像特徴の抽出方法について,Python コードを載せてまとめたが,細かなパラメタなどの調整についてはいろいろと試しながら使いこなせるようにしていきたい.