ドキュメンテーション

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

GPU でのしきい値処理とモルフォロジー演算の実行

この例では、GPU で画像処理演算を実行する方法を示します。大きな航空写真で水面を強調表示するためにフィルター処理を使用します。

イメージをワークスペースに読み取ります。

imCPU = imread('concordaerial.png');

gpuArray オブジェクトを作成してイメージを GPU に移動します。

imGPU = gpuArray(imCPU);

前処理の手順として、RGB イメージをグレースケール イメージに変更します。gpuArray を渡すため、rgb2gray は GPU で変換演算を実行します。gpuArray を引数として渡すと、GPU 対応の関数は GPU で演算を実行します。

imGPUgray = rgb2gray(imGPU);

イメージ ビューアーでイメージを表示してピクセル値を調査し、水面の値を見つけます。イメージ ビューアーを使用するには、関数 gather を使用してイメージ データを CPU に戻さなければならないことに注意してください。イメージ上でマウスを移動すると、イメージ ビューアーの下部にカーソルの下にあるピクセルの値が表示されます。このイメージでは水面のピクセル値は 70 未満になっています。

imtool(gather(imGPUgray));

GPU でイメージをフィルター処理して、値が 70 未満のピクセルのみを含む新しいイメージを取得し、表示します。

imWaterGPU = imGPUgray<70;

figure;imshow(imWaterGPU);

GPU 対応のモルフォロジー演算子を使用して、水面を表していない点を削除することにより、マスク イメージをクリーンアップします。

imWaterMask = imopen(imWaterGPU,strel('disk',4));
imWaterMask = bwmorph(imWaterMask,'erode',3);

imfilter を使用してマスク イメージにブラーをかけます。

blurH       = fspecial('gaussian',20,5);
imWaterMask = imfilter(single(imWaterMask)*10, blurH);

水面を識別するために青チャネルをブーストします。

blueChannel  = imGPU(:,:,3);
blueChannel  = imlincomb(1, blueChannel,6, uint8(imWaterMask));
imGPU(:,:,3) = blueChannel;

結果を表示します。関数 imshow は GPU でイメージを処理できます。

figure;imshow(imGPU);

GPU でイメージのフィルター処理が完了してから、関数 gather を使用してデータを CPU に戻し、変更したイメージをファイルに書き込みます。

outCPU = gather(imGPU);
imwrite(outCPU,'concordwater.png');