14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「OpenCV-Python Tutorials」とmahotas

Last updated at Posted at 2016-02-19

「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チュートリアル入門

Intro_1 OpenCV-Pythonを始めてみよう

OpenCV-PythonをWindowsにインストールする
Install_1 OpenCVをwindowsで使えるようにする。

OpenCV-PythonをFedoraにインストールする

Install_2 OpenCVをFedoraで使えるようにする。

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の特色
画像操作を始めてみよう
gui_1画像を読み込むこと、表示すること、保存することを学びます。

動画操作を始めてみよう
gui_2 動画の再生、カメラからの動画のキャプチャと動画としての保存を学びましょう。

OpenCVの描画関数
gui_5 直線、矩形、楕円、円などをOpenCVを使って描画することを学びます。

マウスをペイントブラシとして使う
gui_3 マウスを使って塗りつぶし

Trackbarをカラーパレットとして使う
gui_4 パラメータを制御するためのtrackbarを作る


###コア操作
画像への基本操作

core_1
画素値を読み取り・編集、画像のROI(region of interest 関心領域)での操作、その他の基本操作を学びます。

「実践 機械学習システム」10章 コンピュータビジョン・パターン認識
mahotas を使った画像の読み込みが紹介されている。
 ここでも読み込んだ後のデータ形式はnumpy.arrayになっている。
 また関数名もimread()になっている。mahotas.imread(name)は、RGBの順で読み込むので、matplotlibのimshow()で表示するときに相性がよい。(注2)

.py
#!/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()

画像への算術演算

core_2
画像に算術演算を施します。

[実行性能測定と改良手法]
(http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_optimization/py_optimization.html#optimization-techniques)

core_4 答を得ることは大切だ。しかし、最速に答を得ることはさらに大切だ。あなたのコードのスピードをチェックし、コードを最適化することなどを学びます。

OpenCVにある数学的手法
core_5 PCA(Principal components analysis 主成分分析)、SVD(singular value decomposition 特異値分解)などのOpenCVで提供されている数学的手法のいくつかを学びます。


###OpenCVでの画像処理

色空間を変更する
imgproc_1 異なる色空間で画像を変換する方法を学びましょう。そして動画で色つきの物体を追跡させてみましょう。

mahotas Color Space Conversions

mahotasの色空間変換で特徴的なのはセピアへの変換があることでしょうか。OpenCVの色空間の変換が充実していますから、それを補うかたちで使うのがよいでしょう。

lenas = mh.colors.rgb2sepia(lena)

画像の幾何変換
imgproc_gt 回転、変形などのさまざまな幾何変換を施してみましょう。

画像の閾値処理
imgproc_2 画像をグローバルしきい値、適応的閾値処理 、大津の2値化などで2値化画像に変換してみましょう。

mahotasにも大津の2値化が含まれています。他の2値化手法 Riddler-Calvard手法も実装されています。

画像の平滑化
blurring.png 画像をぼかしたり、あつらえたカーネルを用いた画像にフィルタすることを学びます。

モルフォロジー変換

imgproc_12 収縮、膨張、Opening, Closingなどのモル
フォロジー変換について学びます。

膨張、収縮 は OpenCVにもふくまれていますが、条件付きの膨張、収縮はOpenCVには含まれておらず、mahotas
には含まれており、上手に使いこなす価値はありそうです。

mahotas Dilation & Erosion

mahotas Conditional morphological erosion.

mahotas Conditional dilation

画像の勾配

gradient.png 画像勾配、エッジなどを見つけてみましょう。

Cannyエッジ検出

imgproc_8 Cannyエッジ検出を使ってエッジを見つけてみましょう。

mahotas Sobel エッジ検出

mahotas には、Difference of Gaussian があります。
Compute edges using the Difference of Gaussian (DoG) operator.
この微分演算は、SIFT特徴量の計算の手順の中に含まれています。OpenCVには直接的にはDifference of Gaussian がありません。stackoverflowでその実装の1例を見つけて利用してみることができます。

画像ピラミッド
imgproc_14 画像ピラミッドとそれを画像混合に使う方法を学びます。

####OpenCVでの輪郭処理

輪郭:さあ 始めよう

contour_1
輪郭を見つけ描こう

輪郭の特徴

contour_2 様々な輪郭の特徴、面積、周囲長、外接矩形(包含矩形)などを見つけることについて学びましょう

OpenCVは間違いなく画像処理や画像認識が一番そろったライブラリですが、Pythonでのバインディングでは、その全ての機能が使える状況には必ずしもなっていません。たとえばラベリングもそのような機能の1つです。現状のOpenCV-Pythonの枠組み(cv2)の中に不足している機能をmahotasなどのライブラリが補うことができます(注3)。

Labeling Images

輪郭の特性
contour_3 様々の輪郭の特性、堅実性、平均強度などを見つけることを学びましょう。

輪郭:その他の関数

contour_4
輪郭の凹状欠損(convexity defects)、点と輪郭の関係(pointPolygonTest)を見つけること、様々な形とマッチングさせることを学びましょう。

mahotas 凸包 convex hull

輪郭の階層

contour_5
輪郭の階層について学びましょう。

OpenCVでのヒストグラム
histogram.png OpenCVにあるヒストグラムの全て。

####OpenCV OpenCVでのヒストグラム
Histograms - 1 : 見つけ、プロットし、解析しよう!!!

hist_1 ヒストグラムを見つけ、描画しよう。

Histograms - 2: ヒストグラムの平坦化

hist_2 よいコントラストの画像を得るためにヒストグラムを平坦化することを学びましょう。

Histograms - 3 : 2次元のヒストグラム

hist_3 2次元のヒストグラムを見つけ、プロットすることを学びましょう。

Histogram - 4 : ヒストグラム逆投影

hist_4 領域ごとに色づけされた物体にヒストグラム逆投影することを学びます。

OpenCVでの画像変換
imgproc_7 フーリエ変換、コサイン変換などOpenCVにある様々な画像変換に出会ってみましょう。

テンプレートマッチング
imgproc_9 テンプレートマッチングを用いて画像中から物体を探してみましょう。

mahotas Match template to image

ハフ線変換
imgproc_10 画像の中から線を検出してみましょう。

ハフ円変換
imgproc_11 画像の中から円を検出してみましょう。

Watershed(分水嶺)アルゴリズムにもとづく画像の領域分割
imgproc_13 Watershed(分水嶺)アルゴリズムで画像の領域分割をしてみましょう。

mahotas [Seeded watershed in n-dimensions]
(http://mahotas.readthedocs.org/en/latest/api.html?highlight=watershed#mahotas.cwatershed)

GrabCutアルゴリズムを用いた対話的な前景抽出

imgproc_15 GrabCutアルゴリズムでの前景抽出をしてみましょう。


###特徴量検出と特徴量記述

特徴量を理解する

f2d_1 その画像の主な特徴はなんだろうか? 見つけられたこれらの特徴はどのように役に立つのか?

Harrisコーナー検出
f2d_2 ええ、コーナーはよい特徴? でもどうやって見つけますか?

Shi-Tomasiコーナー検出器と画像内の強いコーナー(Good Features to Track)
f2d_3
Shi-Tomasiコーナー検出の詳細を見てみましょう。

SIFT(Scale-Invariant Feature Transform)特徴量への入門

f2d_4 Harrisコーナー検出器は、画像の縮尺が変わるときには、十分良いとは言い切れません。 Loweは、縮尺に影響しない特徴を見つけるブレークスルーとなる手法を開発しました。それはSIFT特徴量と呼ばれています。

SURF(Speeded-Up Robust Features)特徴量への入門

f2d_5  SIFT特徴量は確かにいい特徴です。しかし、十分速いとは言えません。そこでSURF特徴量と呼ばれる高速化版が作られました。

mahotasにもSURFがあります。
Speeded-Up Robust Features

コーナー検出のためのFASTアルゴリズム
f2d_06 上に示した特徴検出器は全てよいものです。しかし、SLAM(訳注:Simultaneous Localization and Mapping、自己位置推定と環境地図作成を同時に行うこと)のようなリアルタイムの用途に使えるほど十分に速いとは言えません。そこでFASTアルゴリズムの登場です。これは本当に"FAST(速い)"です。

BRIEF特徴量(Binary Robust Independent Elementary Features)
f2d_07 SIFT特徴量は、128個の浮動小数点からなる特徴記述子を用いています。そのような特徴量を数千個あつかうことを考えてごらんなさい。そのときたくさんのメモリーとマッチングのためにたくさんの時間を使
います。特徴量を圧縮して速くすることもできますが、それでも、その特徴量をまず計算しなくてはなりません。そこで、BRIEFが登場で、少ないメモリーで、マッチングが速く、それていて高い認識率のバイナリ記述子を見つける近道を提供します。

ORB(Oriented FAST and Rotated BRIEF)特徴量
f2d_08 SIFT特徴量とSURF特徴量はとてもよく動くのだけれども、あなたの用途の中で使うには毎年数ドル払わなければならないとしたらどうしますか? それらは特許が成立しているのです。その問題を解決するには、OpenCVの開発者はSIFT特徴量とSURF特徴量への新しい"FREE"な代替品、ORBを思いつきました。

特徴量マッチング
f2d_09 特徴検出器と記述子についてたくさん理解しました。異なる記述子を対応付ける方法を学ぶときです。OpenCVはそのために2つの手法、Brute-Forceマッチング手法とFLANNに基づくマッチング手法です。

特徴量マッチングと物体を見つけるためのホモグラフィ
f2d_10 いま特徴量マッチングについて知っているので、複雑な画像中の物体を見つけるためにcalib3dモジュールとともに混ぜ合わせてみましょう。

なめらかな画像と模様のある画像とを区別できるHaralick特徴量がmahotasに含まれています。

SURF特徴量もmahotasに含まれています。
「10.4 局所特徴量による記述」]

mahotas Local Binary Patterns


###動画解析
平均値シフト(Meanshift)とCamshift追跡

vdo_1 私たちは既に、色に基づく追跡の例を見ました。それは単純なものです。ここでは、もっとよいアルゴリズムである平均値シフトとその改良版であるCamShiftが対象をどう見つけ追跡するのか見てみましょう。

[オプティカルフロー]
(http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html#lucas-kanade)
vdo_2 重要な概念、オプティカルフローについて学びましょう。それは動画に関連していて、たくさんの用途があります。

背景除去

vdo_b いくつかのアプリケーションでは、物体追跡のように前景を抜き出す必要があります。背景除去は、それらの場合に役立つよく知られた手法です。


###カメラ校正と3次元再構成

カメラ校正
calib_1 利用しているカメラがどれだけ良いものか試してみましょう。それで撮影した画像に歪みが見られるでしょうか?もしあれば、どう補正しましょうか?

姿勢推定
calib_2 calibモジュールを用いてちょっとしたかっこいい3D効果を作るのに役立つ短いセッションです。

エピポーラ幾何
calib_3 エピポーラ幾何とエピポーラ制約を理解しましょう。

ステレオ画像からの奥行き距離情報
calib_4 2D画像群から奥行き情報を得ます。

###機械学習
K-最近傍法
ML_KNN K最近傍法の使い方を学ぶとともに、K最近傍法を用いて手書きの数字認識について学びます。

サポート ベクター マシン(SVM)
ML_SVM SVMの考え方を理解します

K平均法
kmeansicon.png データをK平均法を用いて一群のクラスターに分類することを学びます。そして、K平均法を用いて色の量子化をすることを学びます。


###Computational Photography
ここでは、画像のノイズ除去などのComputational Photographyに関するOpenCVのさまざまな機能について学びます。

画像のノイズ除去
photo_1 Non-local Meansノイズ除去と呼ばれる画像からノイズを除去する良好な手法を見ていただきます。

画像修復
photo_2 たくさんの黒点とひっかきを生じた古い劣化した写真を持っていませんか?それを持ってきて、画像修復と呼ばれる方法でそれらを復元してみましょう。


###物体検出
Haar カスケード検出器を用いた顔検出
objdet_1 Haar カスケード検出器を用いた顔検出


###OpenCV-Python バインディング
ここで、OpenCV-Pythonバインディングがどのように作られているのかを学びます。

どのようにしてOpenCV-Pythonバインディングは動作しているのか?
bind1 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のコミュニティに寄贈できるのはどんなにすばらしいことでしょう。

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?