OpenCL
OpenCL(Open Computing Language)は、マルチコアCPUやGPU などによる異種混在の計算資源において、
並列コンピューティングのためのクロスプラットフォームなAPIである。
ガウスぼかし
ガウスぼかしは、重みづけ平滑化の1つである。
重みづけにガウス関数(ガウスカーネル)を使用する
ガウス関数は、下記の数式で表現される。
G\left( x \right) = \dfrac {1}{ \sqrt { 2 \pi \sigma} } \mathrm{e}^{ - \dfrac {x^{2}}{ 2 \sigma^{2} } }
図示すると 釣鐘型になる。
図はwikipedia より引用。
ガウスぼかしは、輪郭の特徴を残してぼかしを行う。
ガウスぼかしは、ガウスカーネルの大きさが大きく標準偏差 σが大きいほどぼかしの効果が顕著である。
図はwikipedia より引用。
ガウスぼかしのサンプルコード
github に公開されているものを試す。
https://github.com/bgaster/opencl-book-samples/tree/master/src/Chapter_8/ImageFilter2D
このサンプルでは、ガウスカーネルの大きさは 3x3 である。
\frac{1}{16}
\left[
\begin{array}{ccc}
1 & 2 & 1 \\
2 & 4 & 2 \\
1 & 2 & 1
\end{array}
\right]
この大きさでは、ぼかしの効果は微小で、画像を拡大して、やっとぼかしの効果がわかる。
サンプルを少し修正して、macOS で実行できるものを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCL-ImageFilter2D
ガウスカーネルの大きさを変更する
下記の記事の 5x5 を試す
\frac{1}{273}
\left[
\begin{array}{ccccc}
1 & 4 & 7 & 4 & 1 \\
4 & 16 & 26 & 16 & 4 \\
7 & 26 & 42 & 26 & 7 \\
4 & 16 & 26 & 16 & 4 \\
1 & 4 & 7 & 4 & 1 \\
\end{array}
\right]
ガウスカーネルの部分を置き換える。
// 3x3
float kernelWeights[9] = { 1.0f, 2.0f, 1.0f,
2.0f, 4.0f, 2.0f,
1.0f, 2.0f, 1.0f };
// 5x5
float kernelWeights[25] =
{ 1.0f, 4.0f, 7.0f, 4.0f, 1.0f,
4.0f, 16.0f, 26.0f, 16.0f, 4.0f,
7.0f, 26.0f, 41.0f, 26.0f, 7.0f,
4.0f, 16.0f, 26.0f, 16.0f, 4.0f,
1.0f, 4.0f, 7.0f, 4.0f, 1.0f };
もっと大きなものについては、その2に続く。
https://qiita.com/ohwada/items/435afc3df419d29439f3