ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

edge

強度イメージ内のエッジの検出

構文

BW = edge(I)
BW = edge(I,method)
BW = edge(I,method,threshold)
BW = edge(I,method,threshold,direction)
BW = edge(___,'nothinning')
BW = edge(I,method,threshold,sigma)
BW = edge(I,method,threshold,h)
[BW,threshOut] = edge(___)
[BW,threshOut,Gv,Gh] = edge(___)

説明

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

オプションで、エッジの検出を GPU を使用して実行できます (Parallel Computing Toolbox™ が必要)。詳細は、GPU での画像処理を参照

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

'Canny' および 'approxcanny' メソッドは GPU でサポートされません。

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,Gv,Gh] = edge(___) は方向勾配の大きさも返します。ソーベル法とプレウィット法では、GvGh は垂直勾配と水平勾配に対応します。ロバーツ法では、GvGh はそれぞれ水平から角度 45° の勾配と 135° の勾配に対応します。この構文は、method'Sobel''Prewitt' または 'Roberts' の場合にのみ有効です。

すべて折りたたむ

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

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

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

BW1 = edge(I,'Canny');

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

BW2 = edge(I,'Prewitt');

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

imshowpair(BW1,BW2,'montage')

グレースケール イメージを読み取り、gpuArray を作成します。

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

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

BW = edge(I,'prewitt');

結果を表示します。

figure, imshow(BW)

入力引数

すべて折りたたむ

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

'approxcanny' 法の場合、データ型 single または double のイメージは [0 1] の範囲で正規化されていなければなりません。

GPU を使用してエッジを検出するには、I をグレースケール イメージまたはバイナリ イメージを含む gpuArray として指定します。

データ型: 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] の範囲内で正規化する必要があります。

メモ

'Canny' および 'approxcanny' メソッドは GPU でサポートされません。

感度のしきい値。任意の 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 配列として返されます。

GPU を使用してエッジを検出する場合、BW は logical 配列を含む gpuArray として返されます。

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

GPU を使用してエッジを検出する場合、threshOut は数値スカラーを含む gpuArray として返されます。

垂直方向勾配。I と同じサイズの数値配列として返されます。

メモ

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

GPU を使用してエッジを検出する場合、Gv は数値配列を含む gpuArray として返されます。

水平方向勾配。I と同じサイズの数値配列として返されます。

メモ

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

GPU を使用してエッジを検出する場合、Gh は数値配列を含む gpuArray として返されます。

ヒント

  • 関数 edge は Version 7.2 (R2011a) で変更されました。以前のバージョンの Image Processing Toolbox™ では、キャニー法の計算に異なるアルゴリズムが使用されていました。以前の実装と同じ結果を得る必要がある場合、次の構文を使用してください。BW = edge(I,'canny_old',___)

アルゴリズム

  • 勾配度エッジ検出法 (ソーベル法、プレウィット法、およびロバーツ法) の場合、計算した勾配度のしきい値を設定するために 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 より前に導入