Sobel Operator
Sobelオペレーターは、エッジ検出、特徴抽出、画像セグメンテーションのために輝度勾配を測定する3×3の画像フィルターです。
Sobelオペレーターは、画像全体で輝度がどれほど速く、どの方向に変化するかを推定する固定画像フィルターです。画像勾配を生成し、大きな応答は急激な変化を、小さな応答は比較的一様な領域を示します。SobelフィルターまたはSobel–Feldmanオペレーターとも呼ばれ、コンピュータービジョンにおけるエッジ検出と特徴抽出の基礎的なツールです。
Irwin SobelとGary Feldmanは、1968年にスタンフォード人工知能プロジェクトでこれを発表しました。発表のタイトルはA 3x3 Isotropic Gradient Operator for Image Processingであり、Sobelによる歴史的な説明と導出に記載されています。
Sobelカーネルの仕組み#
Sobelフィルタリングでは、カーネルと呼ばれる2つの小さな重みグリッドを近傍ピクセルに適用します。この局所フィルタリングは一般に畳み込みと説明されますが、OpenCVは重みを反転させず、相関を使用して適用します。標準的な3 x 3カーネルの各行は次のとおりです。
| 行 | X方向カーネル | Y方向カーネル |
|---|---|---|
| 上 | -1, 0, 1 | -1, -2, -1 |
| 中央 | -2, 0, 2 | 0, 0, 0 |
| 下 | -1, 0, 1 | 1, 2, 1 |
x方向の応答Gxは、左から右への輝度変化を測定し、垂直エッジを強調します。Gyは上から下への変化を測定し、水平エッジを強調します。各カーネルは、一方の軸に沿った重み-1、0、1の差分フィルターと、もう一方の軸に沿った重み1、2、1の加重平滑化を組み合わせます。その受容野は9ピクセルをカバーします。
GxとGyを組み合わせると、勾配の大きさ(Gxの二乗とGyの二乗の和の平方根)と、atan2(Gy, Gx)で計算される勾配の向きが得られます。勾配はエッジを横切る方向、つまり局所的な境界に垂直な方向を指します。これらの方向性出力は特徴マップであり、各位置での応答を表す空間グリッドです。
PythonでのSobelの適用#
OpenCVは、エッジ検出の実装ガイドで使用されているcv2.Sobelを使って符号付き微分を計算します。浮動小数点出力では、選択した方向に輝度が低下したときに生じる負の応答が保持されます。一方、符号なし8ビット出力では負の値がゼロに切り詰められ、そのようなエッジ遷移が失われます。
pip install opencv-python numpyを使って依存関係をインストールします。この例では、画像をダウンロードし、両方の微分を計算して、それらを合成した大きさを保存します。
from urllib.request import urlopen
import cv2
import numpy as np
with urlopen("https://ultralytics.com/images/bus.jpg") as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
image = cv2.imdecode(encoded, cv2.IMREAD_GRAYSCALE)
# 強度を合成する前に、符号付き微分を保持します。
gx = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
gy = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)
magnitude = cv2.magnitude(gx, gy)
edge_image = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX)
cv2.imwrite("sobel_edges.png", edge_image.astype(np.uint8))保存された画像では、輝度の急激な変化が明るい輪郭として表示されます。正規化によって表示用に値が再スケーリングされます。別途しきい値処理を行うと、勾配の強度が二値エッジマップに変換されます。
Sobel勾配の用途#
画像セグメンテーションでは、Sobelの大きさをウォーターシェッドアルゴリズムの境界情報として利用できます。このアルゴリズムは、開始マーカーから領域を広げます。scikit-imageのコインセグメンテーションの例では、強い勾配がコインとその背景の間に障壁を形成します。ウォーターシェッドはその障壁を使って前景と背景を分離し、その後、連結成分ラベリングによって個々のコインにラベルを付けます。
Sobel勾配は、UltralyticsのYOLO26をベースにしたカスタムモデルであるYOLO26-RDにおいても、物体検出を導きます。そのEdgeSPDモジュールは、固定されたSobelエッジ信号を使ってダウンサンプリングを制御し、空間解像度が低下する際に境界情報を強調します。
Sobelと他のエッジフィルターの比較#
Prewittは均一な平滑化重みを使用しますが、Sobelは中央の行または列に大きな重みを与えます。Scharrは3 x 3の微分推定における方向精度を向上させます。Laplacianは二次の輝度変化を測定します。Cannyは勾配推定にエッジの細線化と2つのしきい値によるエッジ連結を組み合わせ、生のSobelの大きさよりも選択性の高い輪郭マップを生成します。
医用画像解析では、ノイズによる勾配がウォーターシェッド領域を分断することがあります。Sobel勾配によるMR画像セグメンテーションでは、過分割の例を示し、ノイズ除去を使ってこれを低減します。画像の境界では、近傍ピクセルが欠けているため、拡張ルールを定義する必要があります。SciPyのSobel実装では、最後のピクセルの境界をまたいでピクセルを反射させる方法がデフォルトで使用されます。










