本日は前回のCUDA C++でGPUプログラミング【CUDA 第1回】 に引き続いて、CUDAでのプログラミングをやっていく予定です。
前回は環境構築と、取り合えず動かしてみたというところがメインだったのですが、基本的に画像処理にCUDAを用いたいと思っているので、前回よりは少し画像処理チックなことをやってみます。
各ピクセルで独立に処理をすればよい教材ということで、今回はカラー画像をグレースケールに変換するプログラムをCUDAを利用して書いてみました。
V = 0.299*R + 0.587*G + 0.114*B
グレースケールとカラーの輝度値の変換は、上記の式に従って行っています。
目次
今回の環境
・OS : Windows10(64bit)
・GPU: GeForce GTX 1060
・Visual Studio 2015 インストール済
・CUDA 9.0 インストール済
・OpenCV 3.1 環境構築済
ソースコード
プログラムのビルドの方法に関しては、前回の記事を参考にしてください。
CUDA C++でGPUプログラミング【CUDA 第1回】
convertToGray関数にてGPUでの並列計算を実施しています。
今回画像の読み込みにはOpenCVを使いました。
cudaMallocでデバイス(GPU)側のメモリを確保し、cudaMemcpyにてCPU→GPU、GPU→CPU側の伝送を行っています。
シェアードメモリ等は利用しておらず、とにかくシンプルな実装としています。そのあたりも少しずつ使えるようにしていきたいですね。
実行結果
以下が入力画像です。
そして、下が出力画像です。適切にグレースケール変換されてそうに見えます。
まとめ
今回は本当に簡単な画像処理をシンプルなコードで実装してみました。
次回はフィルタ処理などのもう少し複雑な処理や、ブロックを上手く分割して使うようななどをやってみたいと思います。