ドキュメンテーション

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

edge

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

構文

BW = edge(I)
BW = edge(I,'Sobel')
BW = edge(I,'Sobel',threshold)
BW = edge(I,'Sobel',threshold,direction)
BW = edge(I,'Sobel',threshold,direction,'nothinning')
[BW,threshOut] = edge(I,'Sobel',___)
BW = edge(I,'Prewitt')
BW = edge(I,'Prewitt',threshold)
BW = edge(I,'Prewitt',threshold,direction)
BW = edge(I,'Prewitt',threshold,direction,'nothinning')
[BW,threshOut] = edge(I,'Prewitt',___)
BW = edge(I,'Roberts')
BW = edge(I,'Roberts',threshold)
BW = edge(I,'Roberts',threshold,'nothinning')
[BW,threshOut] = edge(I,'Roberts',threshold,'nothinning')
BW = edge(I,'log')
BW = edge(I,'log',threshold)
BW = edge(I,'log',threshold,sigma)
[BW,threshOut] = edge(I,'log',___)
BW = edge(I,'zerocross',threshold,h)
[BW,threshOut] = edge(I,'zerocross',___)
BW = edge(I,'Canny')
BW = edge(I,'Canny',threshold)
BW = edge(I,'Canny',threshold,sigma)
[BW,threshOut] = edge(I,'Canny',___)
BW = edge(I,'approxcanny')
BW = edge(I,'approxcanny',threshold)
[gpuarrayBW,threshOut] = edge(gpuarrayI,___)

説明

BW = edge(I) は、1 (入力イメージ I でエッジを検出した場所) と 0 (その他の場所) を含むバイナリ イメージ BW を返します。入力イメージ I は強度またはバイナリ イメージです。BWI と同じサイズになります。

既定の設定では、edge はソーベル エッジ検出法を使用しますが、他のいずれかの方法 (キャニー (またはキャニー近似)、ガウスのラプラシアン (log)、プレウィット、ロバーツ、ゼロクロッシング) を指定することもできます。指定するパラメーターは選択した方法に応じて異なります。次の節では、各方法によってサポートされるパラメーターの詳細を説明します。

BW = edge(I,'Sobel') は、ソーベル法を使用してエッジを検出します。この方法では微分係数にソーベル近似を使用してエッジを検出します。I の勾配が最大である点のエッジを返します。

BW = edge(I,'Sobel',threshold) は、強度が threshold より高いすべてのエッジを返します。threshold を指定しない場合、または空の角かっこ ([]) を指定した場合、edge は値を自動的に選択します。

BW = edge(I,'Sobel',threshold,direction) は、イメージ内でエッジを探す方向 ('horizontal’'vertical’ または 'both’) を指定します。

BW = edge(I,'Sobel',threshold,direction,'nothinning') は、追加のエッジ細線化段階をスキップするかどうか ('nothinning’) を指定します。この段階をスキップすると、パフォーマンスが改善されることがあります。既定値は 'thinning’ です。

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

BW = edge(I,'Prewitt') は、プレウィット法を使用してエッジを検出します。この方法では微分係数にプレウィット近似を使用してエッジを検出します。I の勾配が最大である点のエッジを返します。

BW = edge(I,'Prewitt',threshold) は、強度が threshold より高いすべてのエッジを返します。threshold を指定しない場合、または空の角かっこ ([]) を指定した場合、edge は値を自動的に選択します。

BW = edge(I,'Prewitt',threshold,direction) は、イメージ内でエッジを探す方向 ('horizontal’'vertical’ または 'both’) を指定します。

BW = edge(I,'Prewitt',threshold,direction,'nothinning') は、追加のエッジ細線化段階をスキップするかどうか ('nothinning’) を指定します。この段階をスキップすると、パフォーマンスが改善されることがあります。既定値は 'thinning’ です。

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

BW = edge(I,'Roberts') は、ロバーツ法を使用してエッジを検出します。この方法では微分係数にロバーツ近似を使用してエッジを検出します。I の勾配が最大である点のエッジを返します。

BW = edge(I,'Roberts',threshold) は、強度が threshold より高いすべてのエッジを返します。threshold を指定しない場合、または空の角かっこ ([]) を指定した場合、edge は値を自動的に選択します。

BW = edge(I,'Roberts',threshold,'nothinning') は、追加のエッジ細線化段階をスキップするかどうか ('nothinning’) を指定します。この段階をスキップすると、パフォーマンスが改善されることがあります。既定値は 'thinning’ です。

[BW,threshOut] = edge(I,'Roberts',threshold,'nothinning') は、しきい値を返します。

BW = edge(I,'log') は、ガウスのラプラシアン ('log’) 法を使用してエッジを検出します。この方法では、ガウスのラプラシアン フィルターで I をフィルター処理してからゼロ クロッシングを探してエッジを検出します。

BW = edge(I,'log',threshold) は、強度が threshold より高いすべてのエッジを返します。threshold を指定しない場合、または空の角かっこ ([]) を指定した場合、edge は値を自動的に選択します。

BW = edge(I,'log',threshold,sigma) は、'log’ フィルターの標準偏差 sigma を指定します。既定の sigma2 です。フィルターのサイズは nn 列です。ここで、n=ceil(sigma*3)*2+1 です。

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

BW = edge(I,'zerocross',threshold,h) は、'zerocross’ 法を使用してエッジを検出します。この方法では、指定したフィルター hI をフィルター処理してからゼロ クロッシングを探してエッジを検出します。関数 edge は、強度が threshold より高いエッジを返します。threshold を指定しない場合、または空の角かっこ ([]) を指定した場合、edge はしきい値を自動的に選択します。

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

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

GPU ではキャニー法はサポートされていません。

BW = edge(I,'Canny',threshold) は、強度が threshold より高いすべてのエッジを返します。threshold を指定しない場合、または空の角かっこ ([]) を指定した場合、edge は値を自動的に選択します。threshold は 2 要素ベクトルで、最初の要素は下方しきい値、2 番目の要素は上方しきい値です。スカラーを指定すると、edge は上方の値にはこのスカラー値、下方しきい値には threshold*0.4 を使用します。

BW = edge(I,'Canny',threshold,sigma) は、ガウス フィルターの標準偏差 sigma を指定します。既定の sigmasqrt(2) です。edgesigma に基づいて自動的にフィルターのサイズを選択します。

[BW,threshOut] = edge(I,'Canny',___) はしきい値を 2 要素ベクトルとして返します。

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

BW = edge(I,'approxcanny',threshold) は、'approxcanny' 法の感度のしきい値を指定します。threshold は 2 要素ベクトルで、最初の要素はエッジ強度の下方しきい値を指定し、このしきい値より低いすべてのエッジが無視されます。2 番目の要素は上方しきい値を指定し、このしきい値より高いすべてのエッジ ピクセルが保持されます。許容される値の範囲は [0 1] です。スカラーを指定すると、edge は上方の値にはこのスカラー値、下方しきい値には threshold*0.4 を使用します。threshold を指定しない場合、または threshold が空 ([]) の場合、edge は下方と上方のしきい値を自動的に選択します。

[gpuarrayBW,threshOut] = edge(gpuarrayI,___) は GPU でエッジ検出処理を実行します。入力イメージと出力イメージは gpuArray です。この構文では Parallel Computing Toolbox™ が必要です。

コード生成 サポート: あり。

MATLAB Function ブロック サポート: あり。

すべて折りたたむ

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

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' 法の場合、edge には [0 1] の範囲で正規化された浮動小数点イメージが必要です。

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

感度のしきい値。数値スカラー、または 2 要素ベクトル (キャニー法および approxcanny 法の場合のみ) として指定します。edge は強度が threshold 以下のエッジをすべて無視します。threshold を指定しない場合、または空の配列 ([]) を指定した場合、edge は値を自動的に選択します。このパラメーターの詳細については、ヒントを参照してください。

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

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

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

検出するエッジの方向。'horizontal''vertical' または 'both’ のいずれかに指定します。これはソーベル法とプレウィット法でのみ使用します。

データ型: char

フィルター。行列として指定します。

データ型: double

フィルターの標準偏差。スカラーとして指定します。キャニー法と log 法でのみサポートされています。

メソッド説明
'Canny'

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

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

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

データ型: double

入力イメージ。gpuArray として指定します。

出力引数

すべて折りたたむ

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

計算で使用されたしきい値。数値スカラーとして返されます。

GPU 実行時の出力バイナリ イメージ。gpuArray として返されます。

詳細

すべて折りたたむ

コード生成

この関数では MATLAB® Coder™ を使用した C コードの生成がサポートされています。汎用の MATLAB Host Computer ターゲット プラットフォームを選択した場合、プリコンパイルされたプラットフォーム固有の共有ライブラリを使用するコードが、この関数によって生成されます。共有ライブラリを使用するとパフォーマンスの最適化は維持されますが、コードを生成できるターゲット プラットフォームが限定されます。詳細は、「Image Processing Toolbox のコード生成について」を参照してください。

コード生成時には、以下の点に注意してください。

  • 引数 methoddirection および sigma はコンパイル時の定数でなければなりません。

  • 非プログラム構文はサポートされません。たとえば、戻り値を指定しない場合、edge はイメージを表示します。この構文はサポートされません。

MATLAB Function ブロック

この関数は Simulink の MATLAB Function ブロックで使用できます。

引数 thresh および sigma はコンパイル時の定数でなければなりません。

ヒント

  • threshold パラメーターについてのメモ

    • 勾配度エッジ検出法 (ソーベル法、プレウィット法、およびロバーツ法) の場合、計算した勾配度のしきい値を設定するために edgethreshold を使用します。ガウスのラプラシアン法などのゼロクロス法の場合、ゼロクロッシングのしきい値として edgethreshold を使用します。つまり、ゼロをまたいで大きくジャンプするとエッジになり、小さくジャンプするとエッジになりません。

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

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

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

  • 構文 BW = edge(___,K) は、削除されました。代わりに構文 BW = edge(___,direction) を使用します。

  • 構文 edge(I,'marr-hildreth',___) は、削除されました。代わりに構文 edge(I,'log',___) を使用します。

参照

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

この情報は役に立ちましたか?