読者です 読者をやめる 読者になる 読者になる

drilldripper’s blog

機械学習とソフトウェア開発を頑張ってます

OpenCVの補助として使うscikit-image ~同時生起行列特徴量~

Python 機械学習

OpenCV

画像処理の代表的なライブラリといえばOpenCVだと思います。C++Pythonなど複数の言語で使用することができるため、アプリケーションへ組み込む際に利用することも多いと思います。

OpenCVにはたくさんの関数が実装されていて非常に便利ですが、画像処理の範囲が広いため、網羅しきれていない機能が多々ありあます。私は特に画像特徴量を扱う機能が心もとないと感じています。

scikit-image

scikit-imageはPythonの画像処理ライブラリです。このライブラリはSciPyというPythonの科学ライブラリから派生したものです。同じ経緯で作られたscikit-learnは機械学習ライブラリとして広く使われています。

scikit-imageはその出自から、特徴量や認識に関するアルゴリズムに強いという特徴があります。

Python版のOpenCVとscikit-imageは画像をnumpyで取り扱っています。そのおかげでライブラリを使う際にデータ構造の変換を行う必要がありません。

つまりOpenCVにない機能をscikit-imageからつまみ食いして使うことができます。もちろんその逆も可能です。

導入方法

pipかAnacondaからインストールするのが楽だと思います。

pip install scikit-image
conda install scikit-image

個人的にはAnacondaを利用することをおすすめします。Anacondaのパッケージマネージャであるcondaは、画像処理や機械学習などの科学系ライブラリをバイナリで配布してくれているため、簡単に導入することができます。

pipを使ったインストールでは手元の環境でコンパイルする必要があります。このコンパイルは特にWindowsだとよくコケます。

またAnacondaは強力なバージョン管理機能と仮想環境管理機能を提供してくれます。これは共存できないライブラリをインストールする際や開発を環境を分ける際に役に立ちます。

その他詳しい説明は以下のページを参考にすると良いと思います。

データサイエンティストを目指す人のpython環境構築 2016 - Qiita

同時生起行列特徴量

OpenCVに実装されていて、scikit-imageに実装されていない機能の例として同時生起行列(GLCM:Gray-Level-Co-Occurrence Matrix)を使ったテクスチャ特徴量を取り上げます。

まず同時生起行列を求めます。同時正規行列は任意の角度の2つの離れた画素の変位からを計算し、変位の出現頻度を計算したものです。以下のスライドの20~22ページあたりを読むと概要がわかると思います。

画像解析論(6)東京工業大学

scikit-imageではgreycomatrixとして実装されています。

Module: feature — skimage v0.13dev docs greycomatrix

次に同時生起行列からテクスチャ特徴量を求めます。テクスチャ特徴量は同時生起行列の統計量として表されます。定義はgreycopropsのドキュメントに示されているので、そちらを確認してください。

Module: feature — skimage v0.13dev docs greycoprops

例えば計算できる特徴量のひとつに相違度(dissimilarity)があります。相違度は同時生起行列内の値の差が大きくなるほど大きな値になります。

ソースコード

画像サイズと同じ大きさのテクスチャ特徴量配列(テクスチャ特徴量)を作成するソースコードです。

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from skimage.feature import greycomatrix, greycoprops

def make_glcm_features(input_image, feature):
    glcm_feature = np.zeros((input_image.shape[0], input_image.shape[1]))

    for i in range(input_image.shape[0] ):
        print(i)
        for j in range(input_image.shape[1] ):
            # 境界値処理
            if i <3 or j <3 or i > input_image.shape[0] - 4 or j > input_image.shape[1] - 4:
                glcm_feature[i,j]= 0
                continue
            # 7x7のウィンドウで画像を切り取る
            glcmWindow = input_image[i-3: i+4, j-3 : j+4]
            # 0度と90度の同時生起行列を計算する
            glcm_x = greycomatrix(glcmWindow, [1], [0])
            glcm_y = greycomatrix(glcmWindow, [1], [90])
            # テクスチャ特徴量を計算
            texture_feature_x = greycoprops(glcm_x, feature)
            texture_feature_y = greycoprops(glcm_y, feature)
            glcm_feature[i,j] = (texture_feature_x + texture_feature_y)/2
    return glcm_feature

if __name__ == "__main__":
    file_name = "hoge.png"
    # 画像読み込み(OpenCVを使用)
    image = cv2.imread(file_name)
    # グレースケールに変換(OpenCVを使用)
    image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    # 計算する二次特徴量を選ぶ
    feature_names = ['contrast', 'dissimilarity', 'homogeneity', 'ASM', 'correlation']
    for feature_name in feature_names:
        print (feature_name)
        glcm_feature = make_glcm_features(image, feature_name)
        # 特徴量配列を保存
        np.save(file_name + feature_name + ".npy", glcm_feature)

参考

ディジタル画像処理[改訂新版]

ディジタル画像処理[改訂新版]