[scikit-image] 12. Canny法によるエッジ検出 (feature.canny)

python

はじめに

Canny法によるエッジ検出の基本概念

Canny法は、1986年にJohn F. Cannyによって提案された、ノイズに強く高精度なエッジ検出アルゴリズムです。このアルゴリズムは以下の4つの主要なステップから構成されています:

  • ガウシアンフィルタによるノイズ除去: 画像に含まれるノイズを抑制するため、まずガウシアンフィルタを適用します。
  • 勾配の計算: Sobelフィルタなどを用いて画像の強度勾配(エッジの強さと方向)を計算します。
  • 非最大値抑制: エッジの候補となるピクセルのうち、局所的に最大でないものを除外します。
  • ヒステリシスによる閾値処理: 2つの閾値(高閾値と低閾値)を用いて、真のエッジを決定します。

この記事では、Canny法を用いたエッジ検出について解説します。scikit-imageライブラリのfeature.canny関数の使い方と実装例を通して、画像からエッジを効果的に抽出する方法を説明します。

コード

解説

モジュールのインポート

データの読み込み

画像はimread()関数で読み込みます。ndi.rotate()関数で回転させ、mode=constantパラメータを使用するとエッジ処理に定数値が適用されます。gaussian_filter関数でぼかし効果を加え、画像imに0.17 * np.random.random(im.shape)の式でノイズを追加できます。

Canny filterの適用

feature.canny(im, sigma=3)関数では、sigma値を3に設定したCanny法が適用されます。sigmaのデフォルト値は1です。

図の表示

表示には、ImageGridを用いました。

[matplotlib] 19. mpl_toolkits.axes_grid1 の使い方(画像の表示)
axes_grid1のImageGridを用いて複数の画像を表示する方法
コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

他のエッジ検出アルゴリズムとの比較

アルゴリズム特徴適している状況
Canny法ノイズに強く、高精度一般的な用途、ノイズのある画像
Sobel法シンプルで計算コストが低いリアルタイム処理が必要な場合
Laplacian法2次微分を用いるため、エッジの両側を検出細かいエッジの検出
Prewitt法Sobelに似ているが、より単純な計算計算リソースが限られている場合

Canny法は計算コストが他のアルゴリズムよりも高いですが、その精度の高さから多くの画像処理アプリケーションで標準的に使用されています。

参考

Canny edge detector — skimage 0.25.2 documentation

コメント