OpenCV GLCM - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) GLCM Grey-Level Co-occurrence Matrix

テクスチャ解析に用いる同時生起行列(GLCM: Grey-Level Co-occurrence Matrix)について

GLCMについて

や「新編 画像処理ハンドブック」等を参照のこと。

cvauxのCvGLCM

かなりバギーなまま2年程放置されている。 ざっと挙げると

  • CvAllocしてdelete
  • LUTとNONEの最適化の有無によるソース中の混乱
  • LUTでのバグ
  • 行単位でポインタ処理した事によるバグ
  • sizeofの微妙な使い方

Yahoo! GroupsでもCvAllocをnewに置き換えれば動くとの意見はあったがGLCMImageの出力がおかしい点や、LUT最適化をすると特徴量がnanになる点はそのまま放置されていた。

手直ししたソース

auxを毎回ビルドし直すのも何なので、そこだけコピーしてアプリケーションにした。

(2008-9-19)ReleaseGLCMをPythonに併せて少々弄る。LUTでのバグも1箇所修正。

ソースファイル

g++ main.cpp -o testTexture -lm -lcv -lcxcore -lhighgui -I/usr/include/opencv

とでもすれば良い。(Windowsの場合は普通のOpenCVアプリと同様)

実行すると、下記の基本的な4x4の数列について特徴量を求め表示する。 同時生起行列を可視化した画像も表示する。

元画像

0 0 1 1
0 0 1 1
0 2 2 2
2 2 3 3

各方向についての結果

可視化はNONEの場合には1ピクセルで1階調、LUTの場合は256四方に拡大して表示。 その画像内での正規化も行なっている。

Pythonへの移植

swigの勉強ついでに移植してみた。 主な変更点はCreateGLCMImageの返り値をCvMat*にキャスト、cvReleaseGLCMの中を適当に変更。(2008-9-19)

Releaseが出来るようになったので、CreateとReleaseを繰り返せばループ内で利用できる。 defineによるマクロが効かないようだったので、ヘッダ内でのCV_?を修正した。

ファイル一式

Linux(ubuntu)

シェルスクリプトmkpylib.shを実行する。 /home/username/pythonlibがPYTHONPATHになっている前提。

以下スクリプトの中身

swig -c++ -python -o cvtexture_wrap.cpp  cvtexture.i
g++ -c cvtexture.cpp cvtexture_wrap.cpp -I/usr/include/opencv -I/usr/include/python2.5 `pkg-config --cflags opencv`
ld -shared -nostdlib cvtexture.o cvtexture_wrap.o  -o _cvtexture.so -L/usr/lib `pkg-config --libs opencv`
mkdir -p cvtexture
touch cvtexture/__init__.py
mv _cvtexture.so cvtexture/
mv cvtexture.py cvtexture/
rm -r ~/pythonlib/cvtexture
mv cvtexture ~/pythonlib

Microsoft Visual C++ 2008 Express Edition + Python 2.5

スタートメニューのVC2008から、VC2008のコマンドプロンプトを起動し、以下のコマンドを順次実行する。

C:\local\swigwin-1.3.36\swig.exe -c++ -python -shadow cvtexture.i

cl /MT /EHsc /c /Od /Gm /ZI /DWIN32 /DNDEBUG /I "C:\Python25\include"  cvtexture.cpp cvtexture_wrap.cxx  /I "C:\Program Files\OpenCV\cv\include"  /I "C:\Program Files\OpenCV\cxcore\include" /I "C:\Program Files\OpenCV\otherlibs\highgui"

link /manifest /RELEASE  /ENTRY:_DllMainCRTStartup@12 /DLL /INCREMENTAL:NO  cvtexture.obj cvtexture_wrap.obj /OUT:"_cvtexture.pyd" /LIBPATH:"C:\Python25\libs" /LIBPATH:"C:\Program Files\OpenCV\lib"  cv.lib cxcore.lib highgui.lib python25.lib

mt /outputresource:"_cvtexture.pyd;#2" /manifest _cvtexture.pyd.manifest

copy /Y _cvtexture.pyd c:\Python25\DLLs\
mkdir C:\Python25\Lib\site-packages\cvtexture
echo ## > C:\Python25\Lib\site-packages\cvtexture\__init__.py
copy /Y cvtexture.py C:\Python25\Lib\site-packages\cvtexture\