「OpenCV-Python Tutorials」についてもう少し訳してみましたので、OpenCV-Pythonバインディングとともに役立つライブラリである scikit-imageについても、あわせてリンクをつけてみました。
どちらも、Pythonでnumpyのデータ構造を使うライブラリなので、両者を組み合わせて使うことが可能です。
###Scikit-imageが提供するもの
Scikit-imageの場合には、OpenCV-Pythonで提供されていない手法を中心に、OpenCV-Pythonと連携を組みやすい形で、提供されています。
Scikit-imageは、OpenCVに含まれていない特徴量などを補っているので、より広い範囲の画像認識技術をPythonの枠組みで実現することができます。(Sckit-Image自体の中には、機械学習を含まず、機械学習はScikit-learnとして別に提供されています。)
###scikit-imageの例題の特徴
Scikit-imageのExamplesにある例題のスクリプトのページには、スクリプトのダウンロードボタンが用意されています。そのボタンを押して、スクリプトをダウンロードして、SpyderやIDLEなどのpythonの環境で開いて、実行してみてください。
scikit-imageの例題では、例題に使用するデータを
image = data.astronaut()
といった形で与えているので、Pythonの"battery included"の思想が徹底されています。そのため、初心者でもつまづかずにプログラムを実行できます。まずは、動くのを確かめた後に、入力の画像を変えればよいので、例題を試してみるのがさらに簡単になっています。
###OpenCV-Python と scikit-imageで共通のこと
Pythonの中からnumpyのarrayを利用しているという点でまったく同じです。
グラフを書くためにmatplotlibを使えるのもまったく同じです。
そのため、プログラムの中で使用している行列データをMATLAB風の出力で表示させてチェックできるのもまったく同じです。
どちらのライブラリを使う分にも、行列データの処理にfor文を書く必要はなく、それぞれのライブラリで内部のループ処理を
最適化されていることを、ライブラリのユーザーは意識しなくてよくなっています。
ライブラリとして使う分には、OpenCV-PythonとScikit-imageの実装方法の違いを意識する必要はまったくありません。
Python言語のライブラリですから、help(関数名)で関数の使い方が表示されるのも同じです。
###目的の画像処理・画像認識にたどり着けましたか
同じ目的の処理でも、異なるアプローチをしている手法が存在します。実際に動かすことができるコードとデータのある例題が1つでも多いことは心強いかぎりです。
入力のデータの性質によって、それぞれのアルゴリズムが効果的かどうかは変わってきます。
背景除去アルゴリズムや追跡アルゴリズムが世の中に多数存在する理由の1つは、入力となるデータの性質によって、どれがよい結果になるかが変わってくることです。
どれを使えば十分なのかを見つける段階では、少ない手間で複数のアルゴリズムを試してみること、少ない処理で前処理の影響を評価できることが、作業の進み具合に影響します。
2枚の画像で対応点のマッチングをとる場合、使用する特徴点の種類によって、画像から得られる点の数が変わります。また視野が異なる2枚の画像から、特徴点が共通に得られるかどうかも(視野角の変化に対して耐性があるかどうかも)、使用する特徴量の違いが影響します。このように、scikit-imageにたくさんの画像特徴量のライブラリが提供されているのは心強い。
OpenCV-Pythonでは、チュートリアルに書かれているのは、OpenCV-Pythonが提供している手法のごく一部です。チュートリアルにある追跡を動かしてみたら、チュートリアルに書かれていない追跡手法を試してみましょう。
###性能の評価をしてみよう
あるアルゴリズムで、着目している代表データでうまくいったとします。しかし、それで実用に耐えるアルゴリズムになっていることはまれです。
実用データでは
・ノイズが増えている。
・十分に明るくない。
・画像がぼけている。
・画像がひずんでいる。
・ホワイトバランスが崩れている。
・水平が出ていない。
・画像の解像度が少ない(あるいは多すぎる)。
・動画のサンプルレートが高くない。
・被写体の多様性をカバーできていない。
など様々な理由で期待したアルゴリズムが破綻する可能性を含んでいます。
それらを解決するようなアルゴリズム(前処理・後処理を含む)ができたとき、想定する利用シーンにどれだけ耐えうるのかが決まります。
###アルゴリズムの詳細をグラフを書きながら検証しよう
OpenCV-Python, scikit-image, scikit-learn, 「実践コンピュータビジョン」全てに共通していることは
matplotlibを用いて、データを可視化しているという点です。アルゴリズムが本当に期待している結果になっているかを確認するのにもグラフを書く必要があります。アルゴリズムの中で何が生じているのか、途中経過のデータを可視化することも必要です。なぜ、このアルゴリズムを選択するのか、どれくらいこのアルゴリズムが頑強であるのかなど、性能の評価が必要です。そういった検証のためのグラフは、最終プロダクトのソースコードには残らないものです。それらをPythonで十分に検証しておくことが、OpenCV-C++で最終プロダクトを実装するときに役立ちます。
###実行速度の測定をしよう
e1 = cv2.getTickCount()
`# ここに実行時間を評価するコードを書く。
e2 = cv2.getTickCount()
timeDiff = (e2 - e1)/ cv2.getTickFrequency()
cv2の関数を使って処理時間を計測するようにしておけば、OSやCPUが変わっても同じやりかたで処理時間の計測ができます。
OpenCV-Python, sciki-imageのどちらでをあってもPythonのプロファイラは、目的の関数が何回呼び出されて、どれくらい時間を消費しているのかがわかります。PythonのプロファイラはOSの種類によらず、共通に
profile.run(statement, filename=None, sort=-1)
で実行できます。
(Spyderからは[Run][Profile]です。)
###実行速度を改善する
OpenCV-Python,scikit-learnで実行していて、実行速度が遅くなる理由は様々です。
・画像のサイズを小さくし処理量を減らす。
・マルチコアで、2つの処理が並行動作できる場合にはスレッドで動作させる。
などで速くすることができます。
画像の読み込みを別スレッドにしてみる
numpyで明示的にループを書くと極端に遅くなる
なるべくなら、Pythonの枠組みのまま高速化できればうれしいところです。
numpyのarrayに対して2重ループで配列の要素にアクセスしていないか?
forループを書かなくて済むように、既存の関数を調べてみること。
既存の関数に使えるものがなく、どうしてもforループを書かなくてはならなくなって、
しかも、その関数の高速化が必要な場合には、Cython言語を使うことでの高速化を考えよう。
###C++で実装する場合には
C++で書くことが目的でなく、十分な認識性能と実行速度が出るのならば、その時点で開発を打ち切ることができます。
(Pythonで十分だと言ってくれる依頼主の場合は幸いです。)
C++のプログラムであることが要望される場合には、OpenCV-Pythonへの移行を経てOpenCV-C++への移行を実現をする必要があるでしょう。
Scikit-Imageで検証したアルゴリズムをOpenCV-C++に移行するには、cv::Mat型にOpenCV自体に含まれている実装、OpenCVを利用して同等の処理を行っている実装を探せば、移植が楽に進むことでしょう。Scikit-Imageで、そのアルゴリズムが、今抱えている課題を解くのに十分かをテストして、課題を出し切っておけば、問題の大半が解決済みになるので、cv::Mat型で書くのも苦にならないはずです。
OpenCV-Pythonを使う利点としては、OpenCV-Pythonで記述したアルゴリズムは、容易にOpenCV-C++に移植できるという点です。また、OpenCV-Pythonで実装している内容の詳細を意識せずに、そのアルゴリズムの利用・テストに専念できます。アルゴリズムの詳細を知りたいときには、OpenCV-Pythonからそのライブラリを見て、さらにその詳細に入り込むにはC++のソースコードを読むことになります。
どちらの場合も、python言語のインターフェースで、そのアルゴリズムが、自分の考えている用途でつかいものになるのかならないのかを確かめることができます。確かめた後ならば、そのアルゴリズムをOpenCV-C++の枠組みに書き換えるのは、自信をもって作業を進めることができるはずです。(あるいは、C++でのそのアルゴリズムの実装を探す)
注意:OpenCV-Python,Scikit-imageとも膨大なライブラリです。この比較をもってして、○○には、△△がないなどと勘違いをしないでください。
###Scikit-imageの実装のアプローチ
Scikit-Imageの場合には、Python言語の枠組みを利用しつつ、型付きの言語としての高速化を実現しているCython言語の出番になります。Python言語に慣れしたしんでいる人には、わかりやすい表現でのアルゴリズムの記述になると思います。
###OpenCV入門
OpenCV-Pythonチュートリアル入門
OpenCV-PythonをWindowsにインストールする
OpenCVをwindowsで使えるようにする。
###Scikit-imageのインストールについて公式の情報
Scikit-image / Download
###scikit-imageのインストールについてのメモ
python インタプリタ上で
>>> import skimage
でエラーを生じなければ、scikit-imageがインストールされています。
エラーを生じたときは、インストールしましょう。
windowsの場合に限って話を進めます。
[Unofficial Windows Binaries for Python Extension Packages]
(http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-image)
から scikit-imageのコンパイル済みのバイナリを探します。
Python(CPython)のバージョンが、2.7なのか、3.xなのかによって
scikit_image‑0.11.3‑cp27‑none‑win32.whl
scikit_image‑0.11.3‑cp33‑none‑win32.whl
などのうちから、該当のPythonのバージョンを選びます。
Pythonが32bit版なのか64bit版なのかよって
scikit_image‑0.11.3‑cp27‑none‑win32.whl
scikit_image‑0.11.3‑cp27‑none‑win_amd64.whl
のどちらかを選びます。
OSのバージョンが64bit版であっても、pythonは32bit版を用いてもかまいません。(ライブラリのそろえやすさを優先すると、64bit OSでも 32bit版のPython、32bit版のライブラリを使うのがよいでしょう。)
whlの拡張子のファイルをインストールするには、windowsのコマンドプロンプトから
>pip install ファイル名.whl
を実行してインストールします。
インストール後python インタプリタ上で
>>> import skimage
でエラーを生じなければ、scikit-imageが成功していることがわかります。
###OpenCVでのGUIの特色
画像操作を始めてみよう
画像を読み込むこと、表示すること、保存することを学びます。
動画操作を始めてみよう
動画の再生、カメラからの動画のキャプチャと動画としての保存を学びましょう。
OpenCVの描画関数
直線、矩形、楕円、円などをOpenCVを使って描画することを学びます。
Scikit-imageのExamplesにある例題のスクリプトのページには、スクリプトのダウンロードボタンが用意されています。そのボタンを押して、スクリプトをダウンロードして、SpyderやIDLEなどのpythonの環境で開いて、実行してみてください。
マウスをペイントブラシとして使う
マウスを使って塗りつぶし
Trackbarをカラーパレットとして使う
パラメータを制御するためのtrackbarを作る
###コア操作
画像への基本操作
画素値を読み取り・編集、画像のROI(region of interest 関心領域)での操作、その他の基本操作を学びます。
画像のROI(関心領域)だけに目的の処理をしたいことはあります。
そのときに関心領域の画像を元画像のコピーとはしないことが、効率的なプログラムを書く上で大切なことです。
numpy.arrayは、部分配列を作るときに、コピーではなく、元の配列の一部に対する参照になっています。
部分配列を書き換えたときには、元画像の方にも自動的に変更が反映します。
cv::Mat型でも次のように部分配列を指定する方法があります。
cv::Mat roi(img, Rect(10,10,100,100));
OpenCVの基本構造体の説明
Scikit-image / Using simple NumPy operations for manipulating images (numpyを使って画像を扱う方法の説明)
[実行性能測定と改良手法]
(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で提供されている数学的手法のいくつかを学びます。
訳者注:
PCAは、多数の変動成分がある現象から、未知の変動成分とその比率を求めることができる手法です。複数の色素が混ざった混合溶液が多数あるとします。そしてロットごとに混ざり具合が異なっているとします。それらの混合溶液のスペクトルを多数測定ししたとします。ここで質問です。何種類の色素が混じっているのでしょう。元々の色素はそれぞれどんなスペクトルをしているのでしょうか?それぞれの混合溶液には、その色素がどれくらいの量が混じっているのでしょうか。これらを主成分分析という数学的手法は解く事ができます。そのように複数の変動要因がある現象を解析するのに有効な手法です。
SVDは未知の変数を決定するための測定データが多数あって、通常の連立方程式を解くこととでは未知数を求めることができない。そういう状況は、実は頻繁に発生する状況です。そのときに、全てのデータを活かしつつ未知数を求める方法がSVD(特異値分解)です。実験データの解析に最小2乗法の代わりに使っていただきたい手法です。参考情報
・7.2 不能線形方程式の最小2乗解
・特異値分解を用いた連立一次方程式の計算
・「実践 コンピュータビジョン」p56には、SVDを使って方程式を解く方法が記されています。
残念ながら[OpenCVにある数学的手法]のリンク先はまだ中身が書かれていません。
###OpenCVでの画像処理
色空間を変更する
異なる色空間で画像を変換する方法を学びましょう。そして動画で色つきの物体を追跡させてみましょう。
画像の幾何変換
回転、変形などのさまざまな幾何変換を施してみましょう。
Using geometric transformations 幾何変換を使ってみよう
Piecewise Affine Transformation 画素単位のアフィン変換
画像の閾値処理
画像をグローバルしきい値、適応的閾値処理 、大津の2値化などで2値化画像に変換してみましょう。
注:OpenCV-Pythonのチュートリアルでは「How Otsu’s Binarization Works?」という説明をnumpyを使って説明してくれています。OpenCV-C++にある大津の2値化をOpenCV-Pythonでも使えることを示すだけなら、そこまでする必要はないのに、サービス精神豊富に、大津の2値化をnumpyで説明してくれています。C++でのthreshold()関数は、引数に応じて複雑に動作を切り替えているので、アルゴリズムを読むのには一苦労しそうです。
2値化処理は、目的としている処理の内容、入力データの性質によって、何が最適な2値化処理なのかは変わってきます。大津の2値化のような動的な2値化処理の場合だと、無理やり2値にするので、「該当領域なし」としたいような入力を与えたときには、期待している動作にならないかもしれません。
Local Otsu Threshold 局所大津の閾値処理
画像の平滑化
画像をぼかしたり、あつらえたカーネルを用いた画像にフィルタすることを学びます。
Scikit-Image / Edge operators エッジ操作
Cannyエッジ検出
Cannyエッジ検出を使ってエッジを見つけてみましょう。
Scikit-Image / Canny edge detector Cannyエッジ検出器
Cannyエッジ検出器はエッジの位置の精度が求められるときに使われることが多いようです。以下の資料がよく解説してくれています。
最適なエッジ検出器 (コンピュータビジョン特論 Advanced Computer Vision 和歌山大学)
画像ピラミッド
画像ピラミッドとそれを画像混合に使う方法を学びます。
Build image pyramids 画像ピラミッドを作る
OpenCVでの輪郭処理
OpenCVにある輪郭処理の全て。
####OpenCVでの輪郭処理
注:cv2.findContours()は副作用がある。cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)として与えた2値画像 threshの値を書き換えてしまう。書き換えられたくなかったら、コピーを作って、コピーを渡すのがいいでしょう。
外接矩形は、Rotated Rectangleの方が輪郭の形状に近い矩形になります。
輪郭の特性
様々の輪郭の特性、堅実性、平均強度などを見つけることを学びましょう。
輪郭の凹状欠損(convexity defects)、点と輪郭の関係(pointPolygonTest)を見つけること、様々な形とマッチングさせることを学びましょう。
OpenCVでのヒストグラム
OpenCVにあるヒストグラムの全て。
####OpenCV OpenCVでのヒストグラム
Histograms - 1 : 見つけ、プロットし、解析しよう!!!
注:リンク先のOpenCV-Python チュートリアルの例題では、サッカーの画像の中から芝生の一部の領域を与えたときに、その画像の一部のヒストグラムを元に、画像全体の中から対応する色の領域を逆投影するものになっています。
Histogram Equalization ヒストグラムの平坦化
Local Histogram Equalization
OpenCVでの画像変換
フーリエ変換、コサイン変換などOpenCVにある様々な画像変換に出会ってみましょう。
テンプレートマッチング
テンプレートマッチングを用いて画像中から物体を探してみましょう。
注:OpenCV-Pythonのテンプレートマッチングのサンプルコードは、さまざまなテンプレートマッチングの手法を示しながら、手法によっては目標の領域ではなく別のものにヒットしてしまうことを示しています。手法のよしあしは、テンプレートマッチングを使う対象の画像の性質に依存します。マシンビジョンのように条件が制御されている世界では、単純な計算量の少ないアルゴリズムが効果的だったりします。
ハフ線変換
画像の中から線を検出してみましょう。
Straight line Hough transform 直線ハフ変換
ハフ円変換
画像の中から円を検出してみましょう。
Circular and Elliptical Hough Transforms 円・楕円ハフ変換
Watershed(分水嶺)アルゴリズムにもとづく画像の領域分割
Watershed(分水嶺)アルゴリズムで画像の領域分割をしてみましょう。
Watershed segmentation Watershed(分水嶺)アルゴリズムの領域分割
Markers for watershed transform Watershed(分水嶺)変換へのマーカー
Find the intersection of two segmentations 2種類の領域分割の積を見つける
Comparing edge-based segmentation and region-based segmentation エッジベースの領域分割と領域ベースの領域分割
Label image regions 画像領域をラベリングする
Immunohistochemical staining colors separation
GrabCutアルゴリズムを用いた対話的な前景抽出
GrabCutアルゴリズムでの前景抽出をしてみましょう。
###特徴量検出と特徴量記述
特徴量を理解する
その画像の主な特徴はなんだろうか? 見つけられたこれらの特徴はどのように役に立つのか?
Harrisコーナー検出
ええ、コーナーはよい特徴? でもどうやって見つけますか?
Shi-Tomasiコーナー検出器と画像内の強いコーナー(Good Features to Track)
Shi-Tomasiコーナー検出の詳細を見てみましょう。
SIFT(Scale-Invariant Feature Transform)特徴量への入門
Harrisコーナー検出器は、画像の縮尺が変わるときには、十分良いとは言い切れません。 Loweは、縮尺に影響しない特徴を見つけるブレークスルーとなる手法を開発しました。それはSIFT特徴量と呼ばれています。
SURF(Speeded-Up Robust Features)特徴量への入門
SIFT特徴量は確かにいい特徴です。しかし、十分速いとは言えません。そこでSURF特徴量と呼ばれる高速化版が作られました。
コーナー検出のためのFASTアルゴリズム
上に示した特徴検出器は全てよいものです。しかし、SLAM(訳注:Simultaneous Localization and Mapping、自己位置推定と環境地図作成を同時に行うこと)のようなリアルタイムの用途に使えるほど十分に速いとは言えません。そこでFASTアルゴリズムの登場です。これは本当に"FAST(速い)"です。
BRIEF特徴量(Binary Robust Independent Elementary Features)
SIFT特徴量は、128個の浮動小数点からなる特徴記述子を用いています。そのような特徴量を数千個あつかうことを考えてごらんなさい。そのときたくさんのメモリーとマッチングのためにたくさんの時間を使
います。特徴量を圧縮して速くすることもできますが、それでも、その特徴量をまず計算しなくてはなりません。そこで、BRIEFが登場で、少ないメモリーで、マッチングが速く、それていて高い認識率のバイナリ記述子を見つける近道を提供します。
[Scikit-Image / BRIEF binary descriptor] (http://scikit-image.org/docs/dev/auto_examples/plot_brief.html)
ORB(Oriented FAST and Rotated BRIEF)特徴量
SIFT特徴量とSURF特徴量はとてもよく動くのだけれども、あなたの用途の中で使うには毎年数ドル払わなければならないとしたらどうしますか? それらは特許が成立しているのです。その問題を解決するには、OpenCVの開発者はSIFT特徴量とSURF特徴量への新しい"FREE"な代替品、ORBを思いつきました。
Scikit-Image /ORB feature detector and binary descriptor
Dense DAISY feature description
Histogram of Oriented Gradients HOG特徴量
Local Binary Pattern for texture classification
Multi-Block Local Binary Pattern for texture classification
Gabor filter banks for texture classification
注:ガボールフィルタは「2次元ガボールフィルタによって、初期視覚野にある単純型細胞の活動をモデル化できることが示されている」ウィキペディア。
注:特徴のマッチングをする際には、元の画像からどれくらいの数の特徴点が生成されるかも重要な要素です。スケールや回転角や、3次元空間での視野角依存性が少なく安定なフィッティングを可能にする特徴量であっても、生成される特徴点の数が少なすぎれば役に立たない。目的とする用途と入力の画像群の性格によるので、多数の特徴量を気軽に試してみることができるのが、OpenCV-Python,scikit-imageなどのライブラリを含む処理系の魅力だと思います。
特徴量マッチング
特徴検出器と記述子についてたくさん理解しました。異なる記述子を対応付ける方法を学ぶときです。OpenCVはそのために2つの手法、Brute-Forceマッチング手法とFLANNに基づくマッチング手法です。
特徴量マッチングと物体を見つけるためのホモグラフィ
いま特徴量マッチングについて知っているので、複雑な画像中の物体を見つけるためにcalib3dモジュールとともに混ぜ合わせてみましょう。
Robust matching using RANSAC RANSACを用いたロバストなマッチング
###動画解析
平均値シフト(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平均法を用いて色の量子化をすることを学びます。
###Computational Photography
ここでは、画像のノイズ除去などのComputational Photographyに関するOpenCVのさまざまな機能について学びます。
画像のノイズ除去
Non-local Meansノイズ除去と呼ばれる画像からノイズを除去する良好な手法を見ていただきます。
Non-local means denoising for preserving textures
画像修復
たくさんの黒点とひっかきを生じた古い劣化した写真を持っていませんか?それを持ってきて、画像修復と呼ばれる方法でそれらを復元してみましょう。
Seam carving
Seam carvingは、あまり重要ではない画像領域を取り除くことで、歪みを加えずにアスペクト比を変えて縮小する試みです。
###物体検出
Haar カスケード検出器を用いた顔検出
Haar カスケード検出器を用いた顔検出
物体検出の分野では、人検出の代表的な手法として使われるHOG特徴量がscikit-imageで提供されています。
Histogram of Oriented Gradients HOG特徴量
このライブラリを用いてpayashim氏による「scikit-learnとscikit-imageで作る人検出」
が公開されている。
###OpenCV-Python バインディング
ここで、OpenCV-Pythonバインディングがどのように作られているのかを学びます。
どのようにしてOpenCV-Pythonバインディングは動作しているのか?
OpenCV-Pythonバインディングがどのように作られているのか学びましょう。
OpenCVがC++で実装されているのに対して、Scikit-ImageはPython言語とPythonをベースとしたCython言語で書かれている。
動的に型が決まる言語では、型を判断するための処理のために型が決まっている言語よりも、プログラムの実行速度が遅くなってしまう。また、配列の要素にアクセスする際に、添え字の範囲をチェックする言語では、その安全性を確保するために、実行速度が遅くなりやすい。そのため、添え字の範囲をチェックする必要がある記述ではなく、配列をまとめて処理する関数・メソッドを用いて処理を記述するのがよい。
numpyで明示的にループを書くと極端に遅くなる
は、そのあたりの事情を書いたものだ。
そこで、Pythonベースの文法をもとに、明示的な型の指定、ループを記述するときの添え字の範囲のチェックを簡略化することで、高速化をはかっているのが、Cython言語である。cv::Mat型にしてもnumpyにしても、考え方が似通っているので、一方から他方への移行は簡単だろう。以下の記事は、Cython言語を勉強中のものが書いた記事である。
scikit-imageを読み解く(Cythonの実例)
scikit-imageを読み解く 2(Cythonの実例)
「Cython――Cとの融合によるPythonの高速化」(http://www.oreilly.co.jp/books/9784873117270/)
『OpenCV-Python Tutorials』とは直接対応がつけられなかったライブラリ
Normalized Cut
RAG Thresholding 領域隣接グラフ閾値処理
RAG Merging 領域隣接グラフ
Drawing Region Adjacency Graphs (RAGs) 領域隣接グラフを書く
以上 OpenCV-Python Tutorialsの一部の日本語訳に、scikit-imageとの比較の情報を追加しました。