【R】輪郭抽出
2020年8月5日
1. はじめに
画像から輪郭を抽出したいときってありますよね。これを実現してくれるのが、image.ContourDetector
というパッケージです。こちらR-blogger(finding contour lines)とStatistical Odds & Endsのページを参考にしています。
2. インストール
CRANからできます。
install.packages("image.ContourDetector")
必要に応じて、magick
とsp
もインストールします。
install.packages("magick")
install.packages("sp")
3. 使ってみる
こちらの写真から輪郭を抽出してみます。これは、息子が富山旅行に行ったときに買ってきてくれたライチョウのキーホルダーです。
library(magick) library(image.ContourDetector) img_path <- "http://www.dinov.tokyo/Data/Upload/bird.jpg" img <- image_read(img_path) mat <- image_data(img, channels = "gray") mat <- drop(as.integer(mat, transpose = TRUE)) contourlines <- image_contour_detector(mat) plot(contourlines)
まあ、だいたい輪郭をとれていますが、もうちょっとですかね。Qの値を指定することで変更できるようです。
contourlines <- image_contour_detector(mat, Q=0.2) plot(contourlines)
ライチョウの輪郭全部の抽出は、色合いから難しそうですね。しかし、色がないとなんだか変な感じがします(笑)。
写真のみ、輪郭と写真、輪郭のみを1つのファイルに描いてみます。まずは、輪郭のみのデータの準備。
plt <- image_graph(width = image_info(img)$width, height = image_info(img)$height) plot(contourlines) dev.off()
次に輪郭と写真を合わせたデータの準備。輪郭は緑色にします。
plt_combined <- image_graph(width = image_info(img)$width, height = image_info(img)$height) plot(img) plot(contourlines, add = TRUE, col = "green", lwd = 3) dev.off()
そして、3つを合わせてファイルへ出力。
combi <- image_append(c(img, plt_combined, plt)) combi image_write(combi, "bird-contourlines.png", format = "png")
こんな感じにできました。
4. さいごに
画像から輪郭の抽出って、意外と使いますよね。もちろん、様々なドロー系ソフトウエアでもできますが、R
で手軽にできると良いですよね。