C++
OpenCV

Mac+Opencvで医療画像解析

More than 1 year has passed since last update.

はじめに

Mac+Opencvで画像解析を始めてみた人が学んでいく軌跡を記します。
これまでPythonでやってましたが、高速化のために移籍。
ふだんのブログはこちらです。

環境構築

MacではHomebrewでopencvが入ってくれます。

brew tap homebrew/science
brew install opencv

わたしの環境はふつうに入りましたが、うまくいかなかった人はググって頑張ってくださいp(^_^)q
ちなみに2017年9月時点で3.3.0が入りました。

Opencv3.0は本家いわくOpenCV 3.0 introduced many new algorithms and features comparing to version 2.4.とのことで、画像のアラインメントなど3.0にしかない機能も多いですし、リリースは2015年なので基本的には3.0を入れましょう。
現存する機能はWikipediaも参考になります。ヘッダーのインクルードの形式も異なるので、古いコードを頑張って動かしたいときはここを参考にしましょう。
http://docs.opencv.org/3.3.0/db/dfa/tutorial_transition_guide.html

何の言語で使うか

OpencvはC++とPythonでAPIが提供されています。
Pythonは文字列処理や可視化などとつなげて行うことができて便利です。
が、私のおすすめは両方かけるのであればC++でやることです。

なぜならば

  • やりたいことが特徴量の計算だった
  • そのため単一のアプリとして動く方が開発しやすい
  • それならC++の方がはやいし環境構築が楽
  • 閉鎖系にもっていきやすい

...つまりそういうことだ。

ただ、プロトタイプ作成やパラメータチューニングなどはjupyter上で作ったりする方が、いろいろ捗る(捗った)。
私はいろいろ試行錯誤した結果、インプットが画像(or画像セット)でアウトプットが画像や特徴量のファイルであるモジュールを別に用意して、いろいろよしなにするのをPythonでやった方がいいかなという結論になりました。
(PILやskimageがもっと便利になってstableになったら、また戻ります。)

さぁ画像をいじろう

まずトライするのはOpencvのExampleをおすすめします。
http://docs.opencv.org/3.1.0/examples.html
この中からcountour2.cppを動かしてみます。

コンパイル

Macでコンパイルするときはpkg_configがライブラリのリンクやインクルードもろもろをよしなにやってくれます。

g++ `pkg_config opencv` contour2.cpp

pkg_config opencvを実行すると、brewでインストールしたライブラリがどこにいるのか表示されます。私の場合は/usr/local/Cellar/の下にいらっしゃいます。
毎回これを入力するのが面倒なので

alias gpp_opencv="g++  \`pkg_config opencv\`"

のようなエイリアスをbashrcに入れています。

Contour2を動かした結果

左の元絵(プログラム内で描画してくれます)に対して、find countoursを適用した結果を出力してくれます。
Screen Shot 2017-09-08 at 3.31.41 PM.png

重要な関数はfindContoursdrawContours
findContoursは輪郭間のネスト関係を保存してくれていて、スケールバーを動かすとcontourを表示する際のhierarchyを変えてくれます。
説明だとこの辺り?

Maximal level for drawn contours. If it is 0, only the specified contour is drawn. If it is 1, the function draws the contour(s) and all the nested contours. If it is 2, the function draws the contours, all the nested contours, all the nested-to-nested contours, and so on. This parameter is only taken into account when there is hierarchy available.

マイナスにふったときは、ある特定のcontourに対してその子供を描いていって、
プラスにふったときは、全体の木の中でのhierarchyに応じてプロットをしています。

あとはよしなに

Affineの2D,3D transformationの記事を書く予定。
Pythonの画像処理も気が向いたら。
刮目して待て。冗談です。