概要
OpenCV で Canny 法でエッジを抽出する方法について解説します。
Canny エッジ検出
Canny エッジ検出は、以下の複数の処理を順番に行い、画像からエッジを検出する手法です。
- 水平方向および垂直方向のソーベルフィルタを適用し、輝度勾配および勾配強度を計算する
- Non Maximum Suppression で細いエッジを抑制する
- 2 つの閾値を使用してヒステリシス処理を行い、誤検出を抑制する
cv2.Canny
引数
名前 | 型 | デフォルト値 |
---|---|---|
image | ndarray | |
入力画像 (1チャンネル) | ||
threshold1 | float | |
ヒステリシス処理の際の1つ目の閾値 | ||
threshold2 | float | |
ヒステリシス処理の際の2つ目の閾値 | ||
apertureSize | int, {3, 5, 7} | 3 |
ソーベルフィルタのフィルターサイズ。 | ||
L2gradient | bool | false |
true の場合は勾配強度のノルムに L2 ノルムを使用する。false の場合は L1 ノルムを使用する。 |
返り値
名前 | 説明 | ||
---|---|---|---|
edges | 出力画像 |
サンプルコード

In [1]:
In [2]:

パラメータ調整について
エッジ検出の結果が芳しくない場合は、以下の 4 つのパラメータを調整します。
試した感じでは、apertureSize=3
、L2gradient=True
とするのが基本的には良さそうです。
threshold1
、threshold2
の適した値は画像によって異なるため、調整が必要です。
- threshold1: ヒステリシス処理の際の 1 つ目の閾値
- threshold2: ヒステリシス処理の際の 2 つ目の閾値
- apertureSize: ソーベルフィルタのフィルターサイズ
- L2gradient: true の場合は勾配強度のノルムに L2 ノルムを使用する。false の場合は L1 ノルムを使用する。
ipywidgets によるパラメータ調整
ipywidgets を利用してインタラクティブにパラメータを調整するためのコードを記載します。
In [3]:
コメント