====== 【数値情報処理b】第2回の答え ======
===== 課題 =====
gradient_forward.R を書き換えて、画像(人によって異なる)をダウンロードしてグレースケール画像にした後にSobelフィルタで輪郭抽出を行うプログラムを作って提出しなさい。
* 画像のダウンロードもプログラム中で行うように書くこと。
* フィルタを作成して correlate() を使うこと。
* フィルタはx方向、y方向それぞれ作って行うこと。
----
==== 解答例 ====
# 輪郭抽出(Sobelフィルタ)
library(imager)
# グレースケール画像
im <- grayscale(load.image("画像のURL"))
# x方向のSobelフィルタ
f.Sx <- as.cimg(c(-1, 0, 1, -2, 0, 2, -1, 0, 1), x = 3, y = 3)
# y方向のSobelフィルタ
f.Sy <- as.cimg(c(1, 2, 1, 0, 0, 0, -1, -2, -1), x = 3, y = 3)
# 畳み込み演算
im.Sx = correlate(im, f.Sx)
im.Sy = correlate(im, f.Sy)
# 同時に4枚並べるレイアウト
layout(t(1 : 4))
plot(im, main = "元の画像")
plot(im.Sx, main = "x方向のSobelフィルタ")
plot(im.Sy, main = "y方向のSobelフィルタ")
plot(sqrt(im.Sx ^ 2 + im.Sy ^ 2), main = "輪郭の強さ")
# レイアウトを元に戻す
layout(1)
フィルタを 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