【R】輪郭抽出

1. はじめに

画像から輪郭を抽出したいときってありますよね。これを実現してくれるのが、image.ContourDetectorというパッケージです。こちらR-blogger(finding contour lines)Statistical Odds & Endsのページを参考にしています。

2. インストール

CRANからできます。

install.packages("image.ContourDetector")

必要に応じて、magickspもインストールします。

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で手軽にできると良いですよね。

Add a Comment

メールアドレスが公開されることはありません。