Sobel — 輪郭だけ抜く
畳み込みの重みを差分にすると、平らな所は消え、変化の急な所だけが残る。エッジ検出。値が揃った面では出力が 0 に近く、隣との差が大きい境目で値が立つ。
Sobel。横方向の傾き Gx と縦方向の傾き Gy を別々のカーネルで測り、その大きさ √(Gx² + Gy²) を輪郭の強さにする微分フィルタ。Gx のカーネルは左右で符号が逆の [-1 0 +1; -2 0 +2; -1 0 +1] で、横に並ぶ三つの差分を縦に [1 2 1] で重みづけして足す。この [1 2 1] が差分と直交する向きの軽い平滑化になり、単純な差分よりノイズに強い。Irwin Sobel と Gary Feldman が 1968 年に提案したもの。
輪郭を抜くには元の絵がいる。sin と中心からの距離の波を混ぜた場を Float32Array に書き込む。波が緩く変化するので、明暗の傾きが場所ごとに違う。
明るさが波打って、中心から同心円の縞も広がる。この濃淡の傾きを測る。横方向だけなら、各セルの左右の値の差を取る。Gx は右隣三つを足して左隣三つを引いた値で、中央列を 2 倍に重みづけしてある。差の絶対値を明るさに写すと、左右に明暗が切り替わる縦の境目だけが暗く立つ。
縦に走る境目が暗い線で浮き、横の縞には反応しない。Gx は左右の差だから、横方向に明るさが変わる所だけを拾う。at は配列を読む関数で、x が -1 や n を指すと端の値に丸めて縁でも 3×3 が揃うようにしている。
Gy は同じ重みを 90 度回して上下の差を測る。横の縞はこちらが拾う。両方を組み合わせると向きを問わず境目が出る。各セルで Gx と Gy を測り、√(Gx² + Gy²) をその点の傾きの大きさにする。傾きを不透明度に写し、平らな所は continue で飛ばして、急な所だけ濃く塗る。
面が消えて、明暗の境目だけが線になって残る。同心円の波の尾根と谷のあいだに輪が浮き、波が動くと輪も場の上を滑る。Gx だけのときは縦の境目しか出なかったが、Gy を足して大きさを取ると向きによらず境目が出る。mag > 1.4 の閾値を下げると弱い傾きまで線になって全体がざわつき、上げると一番急な縁だけが残る。
塗りでなく境界を抜く処理で、等値線と目的は近い。等値線が「ちょうど iso の点を繋ぐ」のに対し、Sobel は「変化が急な点を光らせる」。同じ場から、片や値の等しい所を線にし、片や値の変わり目を線にする。