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\