「OpenCV-Python Tutorials」についての訳に関連して、今回はmahotasと比較を行いました。
###Mahotasとは
Pythonを使って画像認識を行うライブラリはいくつかありますが、mahotasというライブラリもあります。これもnumpyのデータ形式を使っています。Pythonで画像認識を行っているライブラリには、
- C++での開発結果にPythonバインディングを行っているもの(OpenCV-Python)
- numpyやPythonの枠組みをベースにCython言語を利用して高速化しているもの(scikit-image)
- Python用のライブラリであることに専念しつつC++で開発をしているもの
があります。mahotasは、Python用のライブラリであることに専念しつつC++で開発をしているものということです。
mahotas Why did you not simply contribute to scipy.ndimage or scikits.image?
に、なぜmahotasがscipyやscikit-imageとも別物のライブラリとして存在するのかを、その利用を述べています。
[Python(x,y)][Documentation][Python documentation server]を立ち上げて site-packages からmahotasにアクセスするとmahotasに実装されている全ての関数についての最新の情報を得ることができます。
###OpenCV入門
OpenCV-PythonをWindowsにインストールする
OpenCVをwindowsで使えるようにする。
WindowsでPython(x,y)をご利用の場合にはまず、
>>> import mahotas
を試してみてください。エラーが生じなければ、既にmahotasがPython(x,y)の標準のプラグインとしてインストールされていることが確認されたことになります。
もしエラーを生じたときには、コンパイル済みのpythonモジュールを配布している [Christoph Gohlkeのサイト]
(http://www.lfd.uci.edu/~gohlke/pythonlibs/)からインストールするのがいいでしょう。
VisualStudioでソースコードからコンパイルすることは私はお勧めしません(注1)
Mahotasのインストール方法はMahotasのサイトで次のように示されています。
mahotas How To Install Mahotas
###OpenCVでのGUIの特色
画像操作を始めてみよう
画像を読み込むこと、表示すること、保存することを学びます。
動画操作を始めてみよう
動画の再生、カメラからの動画のキャプチャと動画としての保存を学びましょう。
OpenCVの描画関数
直線、矩形、楕円、円などをOpenCVを使って描画することを学びます。
マウスをペイントブラシとして使う
マウスを使って塗りつぶし
Trackbarをカラーパレットとして使う
パラメータを制御するためのtrackbarを作る
###コア操作
画像への基本操作
画素値を読み取り・編集、画像のROI(region of interest 関心領域)での操作、その他の基本操作を学びます。
「実践 機械学習システム」10章 コンピュータビジョン・パターン認識
mahotas を使った画像の読み込みが紹介されている。
ここでも読み込んだ後のデータ形式はnumpy.arrayになっている。
また関数名もimread()になっている。mahotas.imread(name)は、RGBの順で読み込むので、matplotlibのimshow()で表示するときに相性がよい。(注2)
#!/usr/bin/python
# -*- coding: utf-8 -*-
import mahotas as mh
import pylab as plt
img=mh.imread("img_0000.png")
plt.figure(1)
plt.imshow(img)
plt.show()
[実行性能測定と改良手法]
(http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_optimization/py_optimization.html#optimization-techniques)
答を得ることは大切だ。しかし、最速に答を得ることはさらに大切だ。あなたのコードのスピードをチェックし、コードを最適化することなどを学びます。
OpenCVにある数学的手法
PCA(Principal components analysis 主成分分析)、SVD(singular value decomposition 特異値分解)などのOpenCVで提供されている数学的手法のいくつかを学びます。
###OpenCVでの画像処理
色空間を変更する
異なる色空間で画像を変換する方法を学びましょう。そして動画で色つきの物体を追跡させてみましょう。
mahotas Color Space Conversions
mahotasの色空間変換で特徴的なのはセピアへの変換があることでしょうか。OpenCVの色空間の変換が充実していますから、それを補うかたちで使うのがよいでしょう。
lenas = mh.colors.rgb2sepia(lena)
画像の幾何変換
回転、変形などのさまざまな幾何変換を施してみましょう。
画像の閾値処理
画像をグローバルしきい値、適応的閾値処理 、大津の2値化などで2値化画像に変換してみましょう。
mahotasにも大津の2値化が含まれています。他の2値化手法 Riddler-Calvard手法も実装されています。
画像の平滑化
画像をぼかしたり、あつらえたカーネルを用いた画像にフィルタすることを学びます。
膨張、収縮 は OpenCVにもふくまれていますが、条件付きの膨張、収縮はOpenCVには含まれておらず、mahotas
には含まれており、上手に使いこなす価値はありそうです。
mahotas Dilation & Erosion
mahotas Conditional morphological erosion.
mahotas Conditional dilation
mahotas Sobel エッジ検出
mahotas には、Difference of Gaussian があります。
Compute edges using the Difference of Gaussian (DoG) operator.
この微分演算は、SIFT特徴量の計算の手順の中に含まれています。OpenCVには直接的にはDifference of Gaussian がありません。stackoverflowでその実装の1例を見つけて利用してみることができます。
画像ピラミッド
画像ピラミッドとそれを画像混合に使う方法を学びます。
####OpenCVでの輪郭処理
OpenCVは間違いなく画像処理や画像認識が一番そろったライブラリですが、Pythonでのバインディングでは、その全ての機能が使える状況には必ずしもなっていません。たとえばラベリングもそのような機能の1つです。現状のOpenCV-Pythonの枠組み(cv2)の中に不足している機能をmahotasなどのライブラリが補うことができます(注3)。
輪郭の特性
様々の輪郭の特性、堅実性、平均強度などを見つけることを学びましょう。
輪郭の凹状欠損(convexity defects)、点と輪郭の関係(pointPolygonTest)を見つけること、様々な形とマッチングさせることを学びましょう。
mahotas 凸包 convex hull
OpenCVでのヒストグラム
OpenCVにあるヒストグラムの全て。
####OpenCV OpenCVでのヒストグラム
Histograms - 1 : 見つけ、プロットし、解析しよう!!!
OpenCVでの画像変換
フーリエ変換、コサイン変換などOpenCVにある様々な画像変換に出会ってみましょう。
テンプレートマッチング
テンプレートマッチングを用いて画像中から物体を探してみましょう。
mahotas Match template to image
ハフ線変換
画像の中から線を検出してみましょう。
ハフ円変換
画像の中から円を検出してみましょう。
Watershed(分水嶺)アルゴリズムにもとづく画像の領域分割
Watershed(分水嶺)アルゴリズムで画像の領域分割をしてみましょう。
mahotas [Seeded watershed in n-dimensions]
(http://mahotas.readthedocs.org/en/latest/api.html?highlight=watershed#mahotas.cwatershed)
###特徴量検出と特徴量記述
Harrisコーナー検出
ええ、コーナーはよい特徴? でもどうやって見つけますか?
Shi-Tomasiコーナー検出器と画像内の強いコーナー(Good Features to Track)
Shi-Tomasiコーナー検出の詳細を見てみましょう。
Harrisコーナー検出器は、画像の縮尺が変わるときには、十分良いとは言い切れません。 Loweは、縮尺に影響しない特徴を見つけるブレークスルーとなる手法を開発しました。それはSIFT特徴量と呼ばれています。
SIFT特徴量は確かにいい特徴です。しかし、十分速いとは言えません。そこでSURF特徴量と呼ばれる高速化版が作られました。
mahotasにもSURFがあります。
Speeded-Up Robust Features
コーナー検出のためのFASTアルゴリズム
上に示した特徴検出器は全てよいものです。しかし、SLAM(訳注:Simultaneous Localization and Mapping、自己位置推定と環境地図作成を同時に行うこと)のようなリアルタイムの用途に使えるほど十分に速いとは言えません。そこでFASTアルゴリズムの登場です。これは本当に"FAST(速い)"です。
BRIEF特徴量(Binary Robust Independent Elementary Features)
SIFT特徴量は、128個の浮動小数点からなる特徴記述子を用いています。そのような特徴量を数千個あつかうことを考えてごらんなさい。そのときたくさんのメモリーとマッチングのためにたくさんの時間を使
います。特徴量を圧縮して速くすることもできますが、それでも、その特徴量をまず計算しなくてはなりません。そこで、BRIEFが登場で、少ないメモリーで、マッチングが速く、それていて高い認識率のバイナリ記述子を見つける近道を提供します。
ORB(Oriented FAST and Rotated BRIEF)特徴量
SIFT特徴量とSURF特徴量はとてもよく動くのだけれども、あなたの用途の中で使うには毎年数ドル払わなければならないとしたらどうしますか? それらは特許が成立しているのです。その問題を解決するには、OpenCVの開発者はSIFT特徴量とSURF特徴量への新しい"FREE"な代替品、ORBを思いつきました。
特徴量マッチング
特徴検出器と記述子についてたくさん理解しました。異なる記述子を対応付ける方法を学ぶときです。OpenCVはそのために2つの手法、Brute-Forceマッチング手法とFLANNに基づくマッチング手法です。
特徴量マッチングと物体を見つけるためのホモグラフィ
いま特徴量マッチングについて知っているので、複雑な画像中の物体を見つけるためにcalib3dモジュールとともに混ぜ合わせてみましょう。
なめらかな画像と模様のある画像とを区別できるHaralick特徴量がmahotasに含まれています。
SURF特徴量もmahotasに含まれています。
「10.4 局所特徴量による記述」]
mahotas Local Binary Patterns
###動画解析
平均値シフト(Meanshift)とCamshift追跡
私たちは既に、色に基づく追跡の例を見ました。それは単純なものです。ここでは、もっとよいアルゴリズムである平均値シフトとその改良版であるCamShiftが対象をどう見つけ追跡するのか見てみましょう。
[オプティカルフロー]
(http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html#lucas-kanade)
重要な概念、オプティカルフローについて学びましょう。それは動画に関連していて、たくさんの用途があります。
いくつかのアプリケーションでは、物体追跡のように前景を抜き出す必要があります。背景除去は、それらの場合に役立つよく知られた手法です。
###カメラ校正と3次元再構成
カメラ校正
利用しているカメラがどれだけ良いものか試してみましょう。それで撮影した画像に歪みが見られるでしょうか?もしあれば、どう補正しましょうか?
姿勢推定
calibモジュールを用いてちょっとしたかっこいい3D効果を作るのに役立つ短いセッションです。
エピポーラ幾何
エピポーラ幾何とエピポーラ制約を理解しましょう。
ステレオ画像からの奥行き距離情報
2D画像群から奥行き情報を得ます。
###機械学習
K-最近傍法
K最近傍法の使い方を学ぶとともに、K最近傍法を用いて手書きの数字認識について学びます。
サポート ベクター マシン(SVM)
SVMの考え方を理解します
K平均法
データをK平均法を用いて一群のクラスターに分類することを学びます。そして、K平均法を用いて色の量子化をすることを学びます。
###Computational Photography
ここでは、画像のノイズ除去などのComputational Photographyに関するOpenCVのさまざまな機能について学びます。
画像のノイズ除去
Non-local Meansノイズ除去と呼ばれる画像からノイズを除去する良好な手法を見ていただきます。
画像修復
たくさんの黒点とひっかきを生じた古い劣化した写真を持っていませんか?それを持ってきて、画像修復と呼ばれる方法でそれらを復元してみましょう。
###物体検出
Haar カスケード検出器を用いた顔検出
Haar カスケード検出器を用いた顔検出
###OpenCV-Python バインディング
ここで、OpenCV-Pythonバインディングがどのように作られているのかを学びます。
どのようにしてOpenCV-Pythonバインディングは動作しているのか?
OpenCV-Pythonバインディングがどのように作られているのか学びましょう。
注1:VisualStudioでは使用しているVisualStudio のバージョンをそろえる必要があって、使用する全てのライブラリをビルドしているVisualStudio のバージョンをそろえるのはとても厄介なことになります。
注2:cv2.imread(name)の場合にはBGRの順なので、cv2.cvtColor(img, cv2.COLOR_BGR2RGB)とする必要がある。
注3:cv2でOpenCVのPythonバインディングを実装しているやり方は、OpenCV-Pythonのチュートリアルに書かれている通りです。そのやり方で、バインディングが未実装の関数について実装することがPython、C++の上級者には可能でしょう。そうして、それをOpenCVのコミュニティに寄贈できるのはどんなにすばらしいことでしょう。