エッジ検出
エッジ検出は明るさが大きく変わる場所を探します。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。外周は省き、ゼロ応答として埋めません。
- 中心
(3,1):9 画素ともゼロなのでGx = Gy = M = 0。出力(2,0)へ書きます。計算済みゼロと未訪問は別です。 - 中心
(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
- 残る 23 位置:各出力行は
[0,32,32,0,0]です。中心(3,2)と(3,3)の行は[0,0,8]と[0,8,8]で、両方が境界をまたぎます。中央列の Kx 重みがゼロなので差は同じGx = 32、Gy = 0。さらに右の明部は両側が等しくゼロです。 - 閾値 16:10 個の 32 を残し、ゼロを除きます。5 行 2 列の帯で、閾値だけでは 1 ピクセルの輪郭に細くなりません。
- 明るさを
I → 8−Iと反転:(3,2)の Gx は−32、Gy はゼロ、強度は 32 のままです。全マスクも同じ。各核のΣK = 0よりG(8−I) = 8ΣK − ΣKI = −G(I)で、二乗すると強度を保ちます。 - ノイズ一点へ切り替え:
(3,3)だけ強度 8 とします。中心(2,2)では右下にあり、両核の重みが 1 なのでGx = Gy = 8、M = 8√2 ≈ 11.3。|Gx|だけなら 8 と過小評価します。 - 軸方向の隣
(2,3):明点は下中央で、Kx 重み 0、Ky 重み 2。Gx = 0、Gy = 16、M = 16。閾値 12 は対角の 4 応答を除き、軸方向の 4 応答を残します。一つのノイズから 4 エッジが生まれました。 - 失敗例を比較:弱い境界を閾値 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 処理とは異なります。
続けて学ぶ
同じ手法につながるレッスンや、次の概念への入口です。
鍵マークのあるレッスンの操作には有料アクセスが必要です。解説はすべて無料で読めます。
誤りや気になる点を見つけましたか? フィードバックを送る。