Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

半精度でのソーベル法によるエッジ検出

この例では、MATLAB® 関数から生成された CUDA® MEX 関数を使用したイメージ内のエッジ検出について説明します。エッジ検出アルゴリズムは、半精度データ型で実装されます。

サードパーティの必要条件

必須

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • Compute Capability 5.3 以上の CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数 coder.checkGpuInstall を使用します。

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

ソーベル エッジ検出アルゴリズム

ソーベル エッジ検出アルゴリズム (sobelEdgeDetectionAlg.m) では、グレースケール イメージで 2 次元の空間勾配演算が行われます。この演算は、イメージ内のエッジに相当する空間周波数の高い領域を強調します。

type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh)  %#codegen
%sobelEdgeDetection Example MATLAB function for edge detection.
% Copyright 2018 The MathWorks, Inc.

kern = half([1 2 1; 0 0 0; -1 -2 -1]);

% Finding horizontal and vertical gradients.
h = conv2(img(:,:,2),kern,'same');
v = conv2(img(:,:,2),kern','same');

% Finding magnitude of the gradients.
e = sqrt(h.*h + v.*v);

% Threshold the edges
edgeImg = uint8((e > thresh) * 240);

end

ソーベル エッジ検出アルゴリズムは、2 つの直交フィルター カーネル maskXmaskY を使用して、入力イメージの水平方向勾配 resX と垂直方向勾配 resY を計算します。このアルゴリズムは、フィルター処理演算を実行した後、勾配の大きさを計算してしきい値を適用し、エッジと考えられるイメージの領域を見つけます。

イメージの読み取りと RGBA パックされた列優先の順序へのデータのパック

標準の imread コマンドを使用してイメージを読み取ります。imread は、イメージの RGB チャネルをピクセルごとに 1 つの整数で表します。整数の範囲は 0 ~ 255 です。単純に入力を half 型にキャストするだけでは、畳み込み時にオーバーフローになる可能性があります。この場合、イメージを 0 ~ 1 の値にスケーリングできます。

im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;

関数の CUDA MEX の生成

関数 sobelEdgeDetectionAlg の CUDA MEX を生成するには、GPU コード構成オブジェクトを作成し、codegen コマンドを実行します。半精度データ型を含むコードの生成と実行には、CUDA Compute Capability 5.3 以上が必要です。コード構成オブジェクトの ComputeCapability プロパティを '5.3' に設定します。半精度の場合、CUDA コードを生成するためのメモリ割り当て (malloc) モードは 'Discrete' に設定しなければなりません。

cfg = coder.gpuConfig('mex');
cfg.GpuConfig.ComputeCapability = '5.3';
cfg.GpuConfig.MallocMode = 'Discrete';

codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;

MEX 関数の実行

MEX 関数を生成した後に、その関数に元の MATLAB エントリポイント関数と同じ機能があることを検証できます。生成された sobelEdgeDetectionAlg_mex を実行し、結果をプロットします。

out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh);
imagesc(out_disp);

MEX メモリのクリア

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;