Rで解析:画像のカラーコードを取得する方法!「EBImage」パッケージの紹介

Rの解析に役に立つ記事

画像で使用されているカラーコードの取得には、画像編集ソフトを使用する方法があります。

「Rでお遊び:プレゼン資料の配色に使えるかも?キャラクターの髪の色?」でも、画像をフォトショップで読み込み、スポイトでカラーコードを取得しました。非常に手間がかかる作業です。

そこで、「Rで目的画像内の全ピクセルのカラーコードから、使用量が多いTOP5のカラーコードを取得する方法」を考えました。

紹介するコードでは、Rで画像の加工や情報を取得できる「EBImage」パッケージを使用しています。EBImageパッケージはbioLiteコマンドでbioconductorから簡単にインストールすることができます。

EBImageのバージョンは4.6.0です。

なお、bioconductorはRから利用出来るバイオインフォマティクス解析パッケージを提供しているサイトです。
参考URL:http://www.bioconductor.org/

スポンサーリンク
スポンサーリンク

画像からカラーコードを取得する他のお勧めパッケージ

おすすめのパッケージです。

パッケージのインストール

下記コマンドを実行してください。

source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")

実行コマンドの紹介

画像ファイルをダイアログで選択できるようにtcltkパッケージを利用しています。
今回の画像は「やはり俺の青春ラブコメはまちがっている。続」から「雪ノ下雪乃」の肩から上の画像を利用しています。

参考URL:http://www.tbs.co.jp/anime/oregairu/

personal02

使用画像です。

なお、Mac mini(Late 2012)、メモリ16GBの環境で2000×1260ピクセルの処理は約1分ほどです。

library("EBImage")
#Imageファイルの読み込み
selectAImage <- paste(as.character(tkgetOpenFile(title = "Imageを選択",filetypes = '{"Imageファイル" {".*"}}',initialfile = "*.*")), sep = "", collapse =" ")
Image <- readImage(selectAImage, mode = "x11")

#読み込んだImageをブラウザで表示
display(Image)

#Imageからカラーコードを取得
#ピクセル数が多いImageほどメモリが必要です
ColCode <- channel(Image, mode = "x11")

#2000×1260ピクセルの処理で私の環境で約1分ほどかかりました。
CountColor <- sort(table(ColCode), decreasing = TRUE)

#特定の色を削除。今回は白色を削除
CountColor <- CountColor[names(CountColor) != "#FFFFFF"]

#検知数TOP5を表示
SelectCol <- 5
head(CountColor, SelectCol)

ColCode
#FAE7D8 #DBD5D4 #CFC8C8 #333335 #5C6062
3422     954     810     779     712 

pie(rep(1, SelectCol),
    labels = names(head(CountColor, SelectCol)),
    col = names(head(CountColor, SelectCol)))

出力

雪ノ下雪乃

画像処理コマンドの紹介

EBImageパッケージでは画像の明度、コントラスト、ガンマ値、カラーモードの変更、クリッピング、回転などが可能です。

#おまけ
#明度は「+」または「-」で指定します
#明るく
Image1 <- Image + 0.4
display(Image1)
#暗く
Image2 <- Image - 0.4
display(Image2)

#コントラストは「*」で指定します
#明るく
Image3 <- Image * 1.3
display(Image3)
#暗く
Image4 <- Image * 0.7
display(Image4)

#ガンマ値は「^」で指定します
#高い
Image5 <- Image ^ 1.3
display(Image5)
#低い
Image6 <- Image ^ 0.7
display(Image6)

#クリッピングもできます。範囲はdisplayコマンドで画像を表示して座標を取得すると便利です
#指定は[x軸の範囲(幅), y軸の範囲(高さ),]です
display(Image[39:159, 87:122,])

#回転も可能です
#translate(rotate(Image, 「+」または「-」で回転), 回転の原点)です
display(translate(rotate(Image, -45), c(0, 0)))

#カラーチャンネルも変更できます
colorMode(Image) <- Grayscale
display(Image)

#カラーにも簡単に戻せます
colorMode(Image) <- Color

出力

名称未設定-1

少しでも、あなたのウェブや実験の解析が楽になりますように!!

タイトルとURLをコピーしました