Rでお遊び:jpegとpngファイルから色コードの連続取得とプログレスバー「progress」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

コンソールにプログレスバーを表示することができる「progress」パッケージを紹介します。Rでは処理の状況を示すプログレスバーが標準では表示されません。本パッケージを利用することで、終了時間が予想できるので効率良く時間を使えるのではと思います。

jpegやpngファイルから色コードを取得するのは時間がかかる処理です。
そこで、「フォルダに保存したjpegとpngファイルのLABと色コードを連続取得し、結果をプロットする処理にプログレスバーを組み込んだ」コマンド例と共に紹介します。

パッケージのバージョンは1.0.2です。コマンドはR version 3.2.0で確認しています。

スポンサーリンク

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

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

ifelse(!require(devtools), install.packages("devtools"), library("devtools"))
install_github("gaborcsardi/progress")

パッケージの基本的な使い方

バージョン1.0.2では”progress_barコマンド”のみが収録されています。使用方法は単純です。詳細はコマンド内を確認してください。

#パッケージの読み込み
library("progress")

#繰り返し回数
n <- 1000

#プログレスバーの設定
#formatオプションの説明":eta"は残り時間,":elapsed"は経過時間,":percent"はパーセント
#その他のオプションはヘルプを確認してください
pb <- progress_bar$new(format = "  処理状況 [:bar] :percent eta: :elapsed",
                          total = n, clear = FALSE, width= 60)

#実行するとコンソールに表示されます。
for (i in seq(n)) {
  
  pb$tick()
  Sys.sleep(1 / 100)
  
}

<表示例>

スクリーンショット 2015-06-06 16.37.37

使用例のコマンド

使用した画像ファイルは、読んで大感動した新川 直司(著)「四月は君の嘘」全11巻の表紙画像です。画像はAmazonで表示される内容を利用しています。非常におすすめです。週末にいかがでしょうか。

保存フォルダ名とファイル名は英数字で処理を確認しています。また、ファイル名に”001″、”002″などの連番を先頭または末尾に追加すると、画像ファイルが正確に昇順で処理されます。ファイルが読み込まれた順番は”ItemList変数”を実行して確認してください。詳細はコマンド内のコメントを確認してください。

なお、画像ファイルが多いと非常に時間がかかりますのでご注意ください。取得した色コードは参考情報として認識いただければと思います。

・コマンドでは”png”、”jpeg”、”colorspace”パッケージを利用しています。インストールされていない場合は下記コマンドを実行してください。

#パッケージのインストール
install.packages(c("png", "jpeg", "colorspace"))

<jpeg,pngファイルからカラーコードを取得するコマンド例>

#パッケージの読み込み
library("tcltk")
library("png")
library("jpeg")
library("progress")
library("colorspace")

#読み込みフォルダを選択
FoldPath <- paste(as.character(tkchooseDirectory(title = "読み込みフォルダを選択"), sep = "", collapse =""))

#フォルダ内のアイテムを取得
ItemList <- list.files(path = FoldPath)

#データ格納用の変数を初期化
MasterRGBCol <- NULL

#アイテム数の取得
ItemVol <- length(ItemList)

#プログレスバーの設定
pb <- progress_bar$new(format = "  処理状況 [:bar] :percent",
                       total = ItemVol, clear = FALSE, width= 60)

for(i in seq(ItemVol)){
  #プログレスバーの表示
  pb$tick()
  
  #Imageファイルの読み込み
  selectAImage <- paste(FoldPath, "/", ItemList[i],
                        sep = "", collapse = "")
  
  #jpeg/png/gifファイルの判断
  if (unlist(strsplit(ItemList[i], "\\."))[2] == "png"){
    
    Image <- readPNG(selectAImage)
    LABCol <- as(RGB(as.vector(Image[,, 1]), as.vector(Image[,, 2]), as.vector(Image[,, 3])), "LAB")
    RGBCol <- cbind(LABCol@coords[,1:3], hex(LABCol))
    
  }else{
    
    Image <- readJPEG(selectAImage, native = FALSE)
    LABCol <- as(RGB(as.vector(Image[,, 1]), as.vector(Image[,, 2]), as.vector(Image[,, 3])), "LAB")
    RGBCol <- cbind(LABCol@coords[,1:3], hex(LABCol))
    
  }
  
  #マスターデータのデータフレーム化
  RGBCol <- as.data.frame(RGBCol)
  
  #カラーコードを文字列化
  RGBCol[, 4] <- as.character(RGBCol[, 4])
  #head(RGBCol)
  
  #画像で使用されているカラーコードを集計
  CountColor <- as.data.frame(table(RGBCol[, 4]))
  
  #集計データをカラーコードで並び替え
  CountColor <- CountColor[order(CountColor[, 1], decreasing = TRUE), ]
  head(CountColor)
  
  #マスターデータの重複を削除
  RGBCol <- RGBCol[!duplicated(RGBCol[, 4]),]
  
  #マスターデータをカラーコードで並び替え
  RGBCol <- RGBCol[order(RGBCol[, 4], decreasing = TRUE),]
  
  #結合
  RGBCol <- cbind(ItemList[i], RGBCol, CountColor[, 2])
  
  #プロットデータの作成
  MasterRGBCol <- rbind(MasterRGBCol, RGBCol)
  
  #必要のないImage,LABCol,RGBColの削除
  rm(Image,LABCol,RGBCol)
  
}

#行名の付与
colnames(MasterRGBCol) <- c("ファイル名", "明度:l", "補色次元:a", "補色次元:b", "カラーコード", "出現数")

#ファイルの保存、解析画像数によってはファイルサイズが非常に大きい場合があります
#また、エクセルなどで読み込めないことがあるのでコメントアウトしています。
#setwd(paste(as.character(tkchooseDirectory(title = "保存場所を選択"), sep = "", collapse ="")))
#write.csv(MasterRGBCol, "分析結果.csv", fileEncoding = "CP932", eol = "\r\n")

<取得したデータを図で出力するコマンド例> 設定を変更することで”明度:l”、”補色次元:a”、”補色次元:b”、”カラーコード”などで色の並び替えを変更したり出現数が多い色を抽出しプロットすることができます。 また、左からファイルの順番になるようにプロットされます。ファイルが読み込まれた順番は”ItemList変数”を実行して確認してください。詳細はコマンド内のコメントを確認してください。

#軸の設定
xRange <- seq(0, 1, by = 1/ItemVol)

#グラフ幅の設定
xWidth <- seq(1/ItemVol, 1, by = 1/ItemVol)

#プロット領域の作成
par(bg = "gray")
#plot(0:max(c(xRange, xWidth)), 0:max(c(xRange, xWidth)), type = "n", axes = FALSE, xlab = "", ylab = "")
plot(0:1, 0:1, type = "n", axes = FALSE, xlab = "", ylab = "")
box()

#プログレスバーの設定
pb <- progress_bar$new(format = "  処理状況 [:bar] :percent",
                       total = ItemVol, clear = FALSE, width = 60)

for(k in seq(ItemVol)){
  
  #プログレスバーの表示
  pb$tick()
  
  #データの抽出
  Plot <- subset(MasterRGBCol, MasterRGBCol[, 1] == ItemList[k])
  
  #出現数を並び替えて、TOP15を抽出
  #Plot <- Plot[order(as.vector(Plot[, 6]), decreasing = TRUE),]
  #Plot <- head(Plot, n = 15)
  
  #明度で並び替え
  #行番号を指定することで並び替えの基準を変更できます
  #2行目"明度:l", 3行目"補色次元:a", 4行目"補色次元:b", 5行目"カラーコード"
  Plot <- Plot[order(as.vector(Plot[, 2]), decreasing = TRUE),]
  
  #データのプロット
  rasterImage(as.raster(Plot[, 5]),
              xRange[k], 0, xWidth[k], 1, interpolate = FALSE)
  
}

出力例

・検出した全色コードを明度で降順に並び替え、各巻毎にプロットした例

ALL

・検出した全色コードを補色次元:aで降順に並び替え、各巻毎にプロットした例

aPlot

・各巻で出現数がTOP15の色コードを降順にプロットした例

TOP15

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

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