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)

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

BW1 = edge(I,'Canny');

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

BW2 = edge(I,'Prewitt');

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

imshowpair(BW1,BW2,'montage')

入力引数

すべて折りたたむ

入力イメージ。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 は、入力データに応じて経験則に基づき自動的に値を選択します。しきい値を変えるには、この関数を 1 回実行し、計算されたしきい値を引数 threshOut として出力する方法をお勧めします。その後、計算されたしきい値を起点とし、しきい値を増加または減少させて、検出されるエッジ ピクセルの数を減少または増加させます。

  • "Sobel" 法、"Prewitt" 法、および "Roberts" 法の場合、この関数は、エッジと見なす勾配の大きさをこのしきい値で決定します。しきい値が 0 の場合、強度が非常に低い場合であっても、イメージに含まれるすべてのエッジが選択されます。

  • "log" 法および "zerocross" 法の場合、この関数は、エッジと見なすゼロクロッシングの大きさをこのしきい値で決定します。つまり、しきい値が大きい場合、ゼロをまたいで大きくジャンプするとエッジになり、小さくジャンプするとエッジになりません。しきい値 0 を指定すると、出力イメージには閉じた輪郭が含まれます。これは、入力イメージ内のすべてのゼロクロッシングが出力イメージに含まれるためです。

  • "Canny" 法および "approxcanny" 法では、勾配に関する 2 つのしきい値を使用します。低いエッジ感度には上方しきい値、高いエッジ感度には下方しきい値を使用します。エッジ検出は低い感度結果から始まり、高い感度結果の連結されたエッジ ピクセルを含むように感度を高めていきます。これは検出されたエッジ内の隙間を塗りつぶすのに役立ちます。この関数は、エッジ強度が下限しきい値を下回るすべてのエッジを無視し、エッジ強度が上限しきい値を上回るエッジをすべて維持します。threshold を範囲 [0, 1] で lowhigh の値をもつ、[low high] 形式の 2 要素ベクトルとして指定できます。threshold を数値スカラーとして指定し、edge がその値を上限しきい値として割り当てるようにすることもます。この場合、edge は下限しきい値を threshold*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° で計算される勾配を返します。

参照

[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 より前に導入

すべて展開する