Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

edge

2 次元グレースケール イメージ内のエッジの検出

説明

BW = edge(I) は、1 (グレースケール イメージまたはバイナリ イメージ I で関数がエッジを検出した場所) と 0 (その他の場所) を含むバイナリ イメージ BW を返します。既定では、edge は、ソーベル エッジ検出法を使用します。

ヒント

3 次元グレースケール イメージまたはバイナリ イメージ内のエッジを検出するには、関数 edge3 を使用します。

BW = edge(I,method) は、method で指定されたエッジ検出アルゴリズムを使用してイメージ I 内のエッジを検出します。

BW = edge(I,method,threshold) は、強度が threshold より高いすべてのエッジを返します。

BW = edge(I,method,threshold,direction) は検出するエッジの方向を指定します。ソーベル法とプレウィット法は垂直方向、水平方向または両方でエッジを検出できます。ロバーツ法は、角度が水平から 45°、水平から 135° または両方でエッジを検出できます。この構文は、method"Sobel""Prewitt" または "Roberts" の場合にのみ有効です。

BW = edge(___,"nothinning") はエッジ細線化段階をスキップします。これによりパフォーマンスが改善されることがあります。この構文は、method"Sobel""Prewitt" または "Roberts" の場合にのみ有効です。

BW = edge(I,method,threshold,sigma) は、フィルターの標準偏差 sigma を指定します。この構文は、method"log" または "Canny" の場合にのみ有効です。

BW = edge(I,method,threshold,h) は指定したフィルター h"zerocross" 法を使用してエッジを検出します。この構文は、method"zerocross" の場合にのみ有効です。

[BW,threshOut] = edge(___) は、しきい値も返します。

[BW,threshOut,Gx,Gy] = edge(___) は方向勾配も返します。ソーベル法とプレウィット法では、GxGy はそれぞれ水平勾配と垂直勾配に対応します。ロバーツ法では、GxGy はそれぞれ水平から角度 135° の勾配と角度 45° の勾配に対応します。この構文は、method"Sobel""Prewitt" または "Roberts" の場合にのみ有効です。

すべて折りたたむ

グレースケール イメージをワークスペースに読み取って表示します。

I = imread('circuit.tif');
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

キャニー法を使用してエッジを検出します。

BW1 = edge(I,'Canny');

プレウィット法を使用してエッジを検出します。

BW2 = edge(I,'Prewitt');

両方の結果を並べて表示します。

imshowpair(BW1,BW2,'montage')

Figure contains an axes object. The axes object contains an object of type image.

入力引数

すべて折りたたむ

入力イメージ。2 次元グレースケール イメージまたは 2 次元バイナリ イメージとして指定します。

"approxcanny" 法の場合、データ型 single または double のイメージは [0, 1] の範囲で正規化されていなければなりません。I が [0, 1] の範囲外の値を持つ場合、関数 rescale を使用して、想定される範囲に値を再スケーリングできます。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

エッジ検出法。次のいずれかに指定します。

メソッド説明
"Sobel"

微分係数にソーベル近似を使用して、イメージ I の勾配が最大になる点、つまりエッジを検出します。

"Prewitt"

微分係数にプレウィット近似を使用して、I の勾配が最大になる点、つまりエッジを検出します。

"Roberts"微分係数にロバーツ近似を使用して、I の勾配が最大になる点、つまりエッジを検出します。
"log"ラプラシアン ガウシアン (LoG) フィルターで I をフィルター処理してからゼロクロッシングを探してエッジを検出します。
"zerocross"指定したフィルター hI をフィルター処理してからゼロクロッシングを探してエッジを検出します。
"Canny"

I の勾配の局所的最大値を探してエッジを検出します。関数 edge はガウス フィルターの導関数を使用して勾配を計算します。この方法では強いエッジと弱いエッジを検出するために 2 つのしきい値が使用されます。強いエッジと連結している場合にのみ、弱いエッジも出力されます。キャニー法は、2 つのしきい値を使用することにより他の方法よりノイズの影響を受けにくく、弱いエッジを正確に検出できる可能性が高くなります。

"approxcanny"

キャニー エッジ検出アルゴリズムを近似したバージョンを使用してエッジを検出します。検出の精度は下がりますが、実行時間が短縮されます。浮動小数点イメージは [0, 1] の範囲内で正規化する必要があります。

感度のしきい値。任意の method に数値スカラー、または 2 要素ベクトル ("Canny" 法および "approxcanny" 法の場合のみ) として指定します。edge は強度が threshold 以下のエッジをすべて無視します。このパラメーターの詳細については、アルゴリズムを参照してください。

  • threshold を指定しない場合、または空の配列 ([]) を指定した場合、edge は (複数の) 値を自動的に選択します。

  • "log" 法および "zerocross" 法の場合、しきい値 0 を指定すると、出力イメージには閉じた輪郭が表示されます。これは出力イメージに入力イメージ内のすべてのゼロクロッシングが含められるからです。

  • "Canny" 法と "approxcanny" 法は 2 つのしきい値を使用します。edge はエッジ強度が下限しきい値を下回るすべてのエッジを無視し、上限しきい値以上の強度のエッジをすべて維持します。threshold を範囲 [0, 1] で lowhigh の値をもつ、[low high] 形式の 2 要素ベクトルとして指定できます。thresholdedge がさらに高いしきい値に割り当てる、数値スカラーとしても指定できます。この場合、edgethreshold*0.4 を下限しきい値として使用します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

検出するエッジの方向。"horizontal""vertical" または "both" として指定します。direction 引数は、method"Sobel""Prewitt" または "Roberts" の場合にのみ有効です。

メモ

ロバーツ method を選択した場合、"horizontal" 方向は、水平から角度 135° のエッジを検出し、"vertical" 方向は、水平から角度 45° のエッジを検出します。

データ型: char | string

フィルター。数値行列として指定します。h 引数は "zerocross" 法のみでサポートされます。

データ型: double

フィルターの標準偏差。数値スカラーとして指定します。sigma 引数は "Canny" 法および "log" 法のみでサポートされます。

メソッド説明
"Canny"

ガウス フィルターの標準偏差を指定するスカラー値。既定の設定は sqrt(2) です。edgesigma に基づいて自動的にフィルターのサイズを選択します。

"log" (ガウスのラプラシアン)

ガウスのラプラシアン フィルターの標準偏差を指定するスカラー値。既定の設定は 2 です。フィルターのサイズは nn 列で、n=ceil(sigma*3)*2+1 です。

データ型: double

出力引数

すべて折りたたむ

出力バイナリ イメージ。1 (I で関数がエッジを検出した場所) と 0 (その他の場所) を含む I と同じサイズの logical 配列として返されます。

計算で使用された計算済みしきい値。"Canny" method では 2 要素ベクトル、"approxcanny" 法では空のベクトル ([])、または他のすべてのエッジ検出法では数値スカラーとして返されます。

水平方向勾配。I と同じサイズの数値配列として返されます。水平方向の勾配が大きいときは、垂直方向のエッジが強いことを示します。

メモ

ロバーツ method を選択した場合、edge は水平から角度 135° で計算される勾配を返します。

垂直方向勾配。I と同じサイズの数値配列として返されます。垂直方向の勾配が大きいときは、水平方向のエッジが強いことを示します。

メモ

ロバーツ method を選択した場合、edge は水平から角度 45° で計算される勾配を返します。

アルゴリズム

  • 勾配度エッジ検出法 (ソーベル法、プレウィット法、およびロバーツ法) の場合、計算した勾配度のしきい値を設定するために edgethreshold を使用します。

  • ガウスのラプラシアン法などのゼロクロス法の場合、ゼロクロッシングのしきい値として edgethreshold を使用します。つまり、ゼロをまたいで大きくジャンプするとエッジになり、小さくジャンプするとエッジになりません。

  • キャニー法では勾配に 2 つのしきい値を適用します。低いエッジ感度には上方しきい値、高いエッジ感度には下方しきい値を適用します。edge は低い感度結果から始まり、高い感度結果の連結されたエッジ ピクセルを含むように感度を高めていきます。これは検出されたエッジ内の隙間を塗りつぶすのに役立ちます。

  • いずれの場合でも、edge には入力データに応じて既定のしきい値が発見的に選択されます。しきい値を変えるには、edge を 1 回実行し、計算されたしきい値を 2 番目の出力引数として取得する方法をお勧めします。次に、edge によって計算された値から開始し、しきい値を高くして、検出するエッジ ピクセル数を減らす、または低くしてエッジ ピクセル数が増えるように調整します。

参照

[1] Canny, John, "A Computational Approach to Edge Detection," IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. PAMI-8, No. 6, 1986, pp. 679-698.

[2] Lim, Jae S., Two-Dimensional Signal and Image Processing, Englewood Cliffs, NJ, Prentice Hall, 1990, pp. 478-488.

[3] Parker, James R., Algorithms for Image Processing and Computer Vision, New York, John Wiley & Sons, Inc., 1997, pp. 23-29.

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する