はじめに
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を用いて複数の画像を表示する方法
他のエッジ検出アルゴリズムとの比較
アルゴリズム | 特徴 | 適している状況 |
---|---|---|
Canny法 | ノイズに強く、高精度 | 一般的な用途、ノイズのある画像 |
Sobel法 | シンプルで計算コストが低い | リアルタイム処理が必要な場合 |
Laplacian法 | 2次微分を用いるため、エッジの両側を検出 | 細かいエッジの検出 |
Prewitt法 | Sobelに似ているが、より単純な計算 | 計算リソースが限られている場合 |
Canny法は計算コストが他のアルゴリズムよりも高いですが、その精度の高さから多くの画像処理アプリケーションで標準的に使用されています。
参考
Canny edge detector — skimage 0.25.2 documentation
コメント