大きな画面での利用をおすすめします — アニメーションと操作がより快適になります。
入力

エッジ検出

エッジ検出は明るさが大きく変わる場所を探します。Sobel は局所領域の両側の明るさを比べ、変化の強さを計算して閾値で選びます。明るくても均一なら相殺され、ノイズも応答を生みます。

両側へ画素を載せる天秤と考えると、同じ明るさは釣り合い、明暗の境界は傾きます。左右を逆にすると符号が反転し、大きさは同じです。このため、符号付き微分を保ってから強度を計算します。

Sobel の計算

本課は強度 0–8 の 7×7 合成グレースケール画像を使い、内側の画素ごとに 3×3 近傍を読みます。

Kx = -1  0  1       Ky = -1 -2 -1
     -2  0  2             0  0  0
     -1  0  1             1  2  1

要素ごとに掛けて 9 項を足します。Kx は重み付き右列から左列を引き、中央行を 2 倍にします。Ky は下行から上行を引き、中央列を 2 倍にします。差分と直交する方向の平滑化も含みます。

Gx は左右方向の明るさの変化、つまり縦の境界へ応答し、Gy は上下の変化、つまり横の境界へ応答します。微分方向とエッジ方向は直交します。

強度は M = √(Gx² + Gy²) で、確率ではありません。同じ大きさの正負は同じ強度になります。M > 0 かつ M >= threshold を残すため、閾値 0 でも平坦部は除外します。

核は反転せずスライドする内積として使うため、数学上は相互相関です。行は下、列は右へ増え、正規化係数はありません。閾値はこの未スケーリング応答の単位です。OpenCV の Sobel 説明に同じ核とユークリッド強度の式があります。

ステップ実行

既定の 7 行はすべて次の並びです。

0  0  0  8  8  8  8

閾値は 16、座標は 0 始まりです。完全な近傍を持つ行・列 1–5 だけを処理し、出力は 5×5。外周は省き、ゼロ応答として埋めません。

  1. 中心 (3,1):9 画素ともゼロなので Gx = Gy = M = 0。出力 (2,0) へ書きます。計算済みゼロと未訪問は別です。
  2. 中心 (3,2):各行は [0,0,8]。Kx との積は下記で、総和は 32 です。Ky は上行 −8、下行 +8 が相殺しゼロ。M = √(32²+0²) = 32 を (2,1) へ書きます。
0  0   8
0  0  16
0  0   8
  1. 残る 23 位置:各出力行は [0,32,32,0,0] です。中心 (3,2) と (3,3) の行は [0,0,8] と [0,8,8] で、両方が境界をまたぎます。中央列の Kx 重みがゼロなので差は同じ Gx = 32、Gy = 0。さらに右の明部は両側が等しくゼロです。
  2. 閾値 16:10 個の 32 を残し、ゼロを除きます。5 行 2 列の帯で、閾値だけでは 1 ピクセルの輪郭に細くなりません。
  3. 明るさを I → 8−I と反転:(3,2) の Gx は −32、Gy はゼロ、強度は 32 のままです。全マスクも同じ。各核の ΣK = 0 より G(8−I) = 8ΣK − ΣKI = −G(I) で、二乗すると強度を保ちます。
  4. ノイズ一点へ切り替え:(3,3) だけ強度 8 とします。中心 (2,2) では右下にあり、両核の重みが 1 なので Gx = Gy = 8、M = 8√2 ≈ 11.3。|Gx| だけなら 8 と過小評価します。
  5. 軸方向の隣 (2,3):明点は下中央で、Kx 重み 0、Ky 重み 2。Gx = 0、Gy = 16、M = 16。閾値 12 は対角の 4 応答を除き、軸方向の 4 応答を残します。一つのノイズから 4 エッジが生まれました。
  6. 失敗例を比較:弱い境界を閾値 16 と 4 で処理すると 0 と 10 セル、ノイズを 12 で処理すると 4 セル残ります。比較例と明記し、最後は選択中の入力と閾値へ戻ります。

閾値の選択

閾値を比べるときは画像を固定します。弱い段差は明部を 8 から 2 にし、応答を 32 から 8 へ下げます。閾値 16 では全除外、4 では 10 セル復活します。境界は存在しており、判断が捨てたのです。

ノイズ例の軸方向は 16、対角は約 11.31。閾値 12 では 4 セル残りますが、連続した物体輪郭ではありません。上げればノイズも消せますが、欲しい弱い境界も消しえます。除去、細線化、接続判定は別の処理です。

用途と単位

Sobel は安価で検査しやすい局所方向・強度、画像処理の基準、後段の特徴入力に向きます。方向が必要なら Gx、Gy を保ちます。マスクだけでは物体境界と影や模様を区別できません。

細い境界と接続判定には Canny の追加段階、つまりノイズ低減、非最大値抑制、二閾値のヒステリシスを参照してください。Canny にも設定が必要で、物体は認識しません。意味やラベルには認識・領域分割が別途必要です。

核を固定して明るさを正数 a 倍すると、Gx、Gy、M、等価な閾値も a 倍です。両核を s 倍すると強度・閾値は |s| 倍。一定の明るさオフセットは valid 窓で相殺されます。

本図の 0..8 を 0..255 に変えると倍率 255/8 で、応答 32 は 1020、閾値 16 は 510。0..1 なら応答 4、閾値 2 です。同じ画像の尺度変換であり、任意の写真への推奨値ではありません。バイト値への丸めでも少し変わります。

微分バッファは符号付きか浮動小数点にします。未スケーリング Sobel は入力のバイト範囲を超えることがあります。前処理、核サイズ、核倍率、強度定義、境界方針を固定してから閾値を調整します。OpenCV パラメータには scale、出力深度、境界設定があります。核サイズや |Gx|+|Gy| へ変えると、一つの換算閾値で全判断を保てるとは限りません。

時間と空間

固定 3×3 核は各内部画素に定数回の演算で、時間 O(HW)。微分、強度、マスク保存は O(HW) です。核は一次元差分と直交する [1,2,1] 平滑化に分離でき、各微分を二回の短いフィルタで計算できます。反射、複製、valid 切り出しを明示し、除去・細線化・接続の費用は別に計上します。ストリーミングでは作業行を減らせますが、アニメーションは巻き戻し用の表示スナップショットも保存します。

境界ケース

  • 一定の明るさ:全暗も全明もゼロで、測るのは差です。
  • 極性の反転:同じコントラストなら符号だけ変わります。
  • 横の境界:Gx だけでは見落とし、Gy が必要です。
  • 閾値と等しい:非ゼロなら残します。丸めた表示ではなく元の値で比較します。
  • 端の閾値:ゼロでも M = 0 は除き、48 では本課の全対応パターンが消えます。48 は一般的な Sobel 上限ではありません。
  • 画像外周:本課は省略します。反射・複製などは境界応答を変えます。

よくある間違い

  • 強度計算前に負の微分をゼロへ切る。反転図の Gx = −32 を消してしまいます。符号を保ち、定義に従って二乗や絶対値を取ります。
  • 画像ごとに最大応答で色を正規化する。弱い応答も強い応答も同じ濃さに見えます。本課は強度 0..48 を共有し、入力の明るさと出力強度の凡例を分けます。
  • マスクを物体認識と読む。ノイズ、模様、影も応答します。CNNの特徴計算や画像分類のクラス予測は追加の処理です。

モデルの範囲

小さな合成グレースケール画像、固定で未スケーリングの Sobel、valid 内部窓、一つの閾値だけです。独立したノイズ低減、非最大値抑制、ヒステリシス、色処理はなく、核自身の直交方向の平滑化は含みます。出力は太くノイズにも反応し、完全な Canny 処理とは異なります。

同じ手法につながるレッスンや、次の概念への入口です。

鍵マークのあるレッスンの操作には有料アクセスが必要です。解説はすべて無料で読めます。

トピックを見る

誤りや気になる点を見つけましたか? フィードバックを送る。