ユーザ用ツール

サイト用ツール


numericalipb:ans2

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

課題

gradient_forward.R を書き換えて、画像(人によって異なる)をダウンロードしてグレースケール画像にした後にSobelフィルタで輪郭抽出を行うプログラムを作って提出しなさい。

  • 画像のダウンロードもプログラム中で行うように書くこと。
  • フィルタを作成して correlate() を使うこと。
  • フィルタはx方向、y方向それぞれ作って行うこと。

解答例

report2.R
  1. # 輪郭抽出(Sobelフィルタ)
  2.  
  3. library(imager)
  4.  
  5. # グレースケール画像
  6. im <- grayscale(load.image("画像のURL"))
  7.  
  8. # x方向のSobelフィルタ
  9. f.Sx <- as.cimg(c(-1, 0, 1, -2, 0, 2, -1, 0, 1), x = 3, y = 3)
  10. # y方向のSobelフィルタ
  11. f.Sy <- as.cimg(c(1, 2, 1, 0, 0, 0, -1, -2, -1), x = 3, y = 3)
  12.  
  13. # 畳み込み演算
  14. im.Sx = correlate(im, f.Sx)
  15. im.Sy = correlate(im, f.Sy)
  16.  
  17. # 同時に4枚並べるレイアウト
  18. layout(t(1 : 4))
  19.  
  20. plot(im, main = "元の画像")
  21. plot(im.Sx, main = "x方向のSobelフィルタ")
  22. plot(im.Sy, main = "y方向のSobelフィルタ")
  23. plot(sqrt(im.Sx ^ 2 + im.Sy ^ 2), main = "輪郭の強さ")
  24.  
  25. # レイアウトを元に戻す

フィルタを 8 で割ってもよい(結果は変わらない)。

# x方向のSobelフィルタ
f.Sx <- as.cimg(c(-1, 0, 1, -2, 0, 2, -1, 0, 1), x = 3, y = 3) / 8
# y方向のSobelフィルタ
f.Sy <- as.cimg(c(1, 2, 1, 0, 0, 0, -1, -2, -1), x = 3, y = 3) / 8
numericalipb/ans2.txt · 最終更新: 2025/06/25 14:23 by yuki