ユーザ用ツール

サイト用ツール


numericalipb:ans3

【数値情報処理b】第3回の答え

課題

gaussianfilter.R を書き換えて、$\sigma=1$ でサイズが $5\times 5$ のガウシアン・フィルタの畳み込み演算を5回くり返すプログラムを作成しなさい。

  • $5\times 5$ のフィルタを作成して correlate() を使うこと。
  • フィルタ作成には二項分布 $\mathrm{Bi}(4,0.5)$ を利用すること。

解答例

$\mathrm{Bi}(4,0.5)$ の確率密度関数は以下になる。 \[ f(x)=_{4}C_{x}(0.5)^{4}=_{4}C_{x}\times\frac{1}{16} \] $x=0,1,2,3,4$ の確率密度関数をベクトルの要素にすると \[ \left( \begin{array}{c} _{4}C_{0}(0.5)^{4}\\ _{4}C_{1}(0.5)^{4}\\ _{4}C_{2}(0.5)^{4}\\ _{4}C_{3}(0.5)^{4}\\ _{4}C_{4}(0.5)^{4} \end{array} \right) = \left( \begin{array}{c} 1/16\\ 4/16\\ 6/16\\ 4/16\\ 1/16 \end{array} \right) \] このベクトルと、このベクトルを転置したものをかけあわせてフィルターを作る。 \begin{eqnarray*} && \left( \begin{array}{ccccc} f(1,1)&f(2,1)&f(3,1)&f(4,1)&f(5,1)\\ f(1,2)&f(2,2)&f(3,2)&f(4,2)&f(5,2)\\ f(1,3)&f(2,3)&f(3,3)&f(4,3)&f(5,3)\\ f(1,4)&f(2,4)&f(3,4)&f(4,4)&f(5,4)\\ f(1,5)&f(2,5)&f(3,5)&f(4,5)&f(5,5) \end{array} \right) \\ &=& \left( \begin{array}{c} 1/16\\ 4/16\\ 6/16\\ 4/16\\ 1/16 \end{array} \right) \left( \begin{array}{ccccc} 1/16&4/16&6/16&4/16&1/16 \end{array} \right) \\ &=& \frac{1}{256} \left( \begin{array}{ccccc} 1&4&6&4&1\\ 4&16&24&16&4\\ 6&24&36&24&6\\ 4&16&24&16&4\\ 1&4&6&4&1 \end{array} \right) \end{eqnarray*}

これが $\sigma=\sqrt{4\times 0.5\times(1-0.5)}=1$ の正規分布を近似したフィルタとして使える。 全体を 256 で割らなくても Imager では同じ効果になる。

report3.R
  1. # 5x5のガウシアン・フィルタ
  2.  
  3. library(imager)
  4.  
  5. # グレースケール画像
  6. im <- grayscale(boats)
  7.  
  8. # ノイズ画像
  9. im.noise <- im + 0.1 * imnoise(width(im), height(im))
  10.  
  11. # ガウシアン・フィルタの畳み込み演算を繰り返す
  12. f.gauss <- as.cimg(c(1, 4, 6, 4, 1,
  13. 4, 16, 24, 16, 4,
  14. 6, 24, 36, 24, 6,
  15. 4, 16, 24, 16, 4,
  16. 1, 4, 6, 4, 1), x = 5, y = 5)
  17. im.gauss <- im.noise
  18. for (i in 1 : 5) {
  19. im.gauss <- correlate(im.gauss, f.gauss)
  20. }
  21.  
  22. # 同時に3枚並べるレイアウト
  23. layout(t(1 : 3))
  24.  
  25. plot(im, interpolate = FALSE, main = "元の画像")
  26. plot(im.noise, interpolate = FALSE, main = "ノイズ画像")
  27. plot(im.gauss, interpolate = FALSE, main = "ガウシアン・フィルタ")
  28.  
  29. # レイアウトを元に戻す

imager ではフィルタを 256 で割っても結果は変わらない。

numericalipb/ans3.txt · 最終更新: 2025/07/02 14:30 by yuki