====== 【数値情報処理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