GPU でのしきい値処理とモルフォロジー演算の実行
この例では、GPU でイメージ処理演算を実行する方法を示します。航空写真で水面を強調表示するためにフィルター処理を使用します。
イメージを読み取って表示します。
imOriginal = imread("concordaerial.png");
imshow(imOriginal)
gpuArray (Parallel Computing Toolbox) オブジェクトを作成してイメージを GPU に移動します。
imGPUoriginal = gpuArray(imOriginal);
前処理の手順として、RGB イメージをグレースケール イメージに変更します。入力引数が gpuArray であるため、im2grayは GPU で変換演算を実行します。
imGPUgray = im2gray(imGPUoriginal);
イメージ ビューアーアプリでイメージを表示してピクセル値を調査し、水面の値を見つけます。イメージ ビューアーを使用するには、関数 gather (Parallel Computing Toolbox) を使用してイメージ データを CPU に戻さなければなりません。イメージ上でマウスを移動すると、イメージ ビューアーの下部にカーソルの下にあるピクセルの値が表示されます。このイメージでは水面は暗く、そのピクセル値は 70 未満になっています。
imageViewer(gather(imGPUgray));

値が 70 未満のピクセルのみを含む新しいイメージを取得するには、GPU でイメージをしきい値処理します。
imWaterGPU = imGPUgray<70;
しきい値処理されたイメージを表示します。イメージ ビューアーとは異なり、関数 imshow は gpuArray 入力をサポートしています。
figure imshow(imWaterGPU)

モルフォロジー オープニングを使用して、イメージから小さなオブジェクトを除去する一方、より大きなオブジェクトの形状とサイズはそのままにします。関数 imopen はモルフォロジー オープニングを実行し、gpuArray 入力をサポートします。
imWaterMask = imopen(imWaterGPU,strel("disk",5));
imshow(imWaterMask)
拡張データを含む、元のイメージのコピーを作成します。データ型を single に変換します。
imGPUenhanced = im2single(imGPUoriginal);
元のイメージから青チャネルを取得します。
blueChannelOriginal = imGPUenhanced(:,:,3);
マスクが 1 (true) のピクセルの青チャネルの強度を大きくして青チャネルの彩度を高めます。
blueChannelEnhanced = blueChannelOriginal + 0.2*single(imWaterMask);
拡張した青チャネルの最大値が、データ型 single のイメージで想定される最大範囲を超えています。関数 rescale を使用して、想定される範囲 [0, 1] にデータを再スケーリングします。
blueChannelEnhanced = rescale(blueChannelEnhanced);
青チャネルを、拡張後の青チャネルで置き換えます。
imGPUenhanced(:,:,3) = blueChannelEnhanced;
強調されたイメージを表示します。拡張後のイメージでは、水に対応するピクセルの青色の彩度が元のイメージのものより高くなっています。
imshow(imGPUenhanced)
title("Enhanced Image")
GPU でイメージのフィルター処理が完了してから、関数 gather を使用してデータを CPU に戻します。変更したイメージをファイルに書き込みます。
outCPU = gather(imGPUenhanced);
imwrite(outCPU,"concordwater.png")参考
gpuArray (Parallel Computing Toolbox) | gather (Parallel Computing Toolbox)
トピック
- GPU でのピクセル ベースの演算の実行
- GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)
- GPU コンピューティングをサポートする関数