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

#&#12503;&#12525;&#12464;&#12524;&#12473;&#12496;&#12540;&#12398;&#35373;&#23450;
#format&#12458;&#12503;&#12471;&#12519;&#12531;&#12398;&#35500;&#26126;":eta"&#12399;&#27531;&#12426;&#26178;&#38291;,":elapsed"&#12399;&#32076;&#36942;&#26178;&#38291;,":percent"&#12399;&#12497;&#12540;&#12475;&#12531;&#12488;
#&#12381;&#12398;&#20182;&#12398;&#12458;&#12503;&#12471;&#12519;&#12531;&#12399;&#12504;&#12523;&#12503;&#12434;&#30906;&#35469;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;
pb <- progress_bar$new(format = "  &#20966;&#29702;&#29366;&#27841; [:bar] :percent eta: :elapsed",
                          total = n, clear = FALSE, width= 60)

#&#23455;&#34892;&#12377;&#12427;&#12392;&#12467;&#12531;&#12477;&#12540;&#12523;&#12395;&#34920;&#31034;&#12373;&#12428;&#12414;&#12377;&#12290;
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ファイルからカラーコードを取得するコマンド例>

#&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#35501;&#12415;&#36796;&#12415;
library("tcltk")
library("png")
library("jpeg")
library("progress")
library("colorspace")

#&#35501;&#12415;&#36796;&#12415;&#12501;&#12457;&#12523;&#12480;&#12434;&#36984;&#25246;
FoldPath <- paste(as.character(tkchooseDirectory(title = "&#35501;&#12415;&#36796;&#12415;&#12501;&#12457;&#12523;&#12480;&#12434;&#36984;&#25246;"), sep = "", collapse =""))

#&#12501;&#12457;&#12523;&#12480;&#20869;&#12398;&#12450;&#12452;&#12486;&#12512;&#12434;&#21462;&#24471;
ItemList <- list.files(path = FoldPath)

#&#12487;&#12540;&#12479;&#26684;&#32013;&#29992;&#12398;&#22793;&#25968;&#12434;&#21021;&#26399;&#21270;
MasterRGBCol <- NULL

#&#12450;&#12452;&#12486;&#12512;&#25968;&#12398;&#21462;&#24471;
ItemVol <- length(ItemList)

#&#12503;&#12525;&#12464;&#12524;&#12473;&#12496;&#12540;&#12398;&#35373;&#23450;
pb <- progress_bar$new(format = "  &#20966;&#29702;&#29366;&#27841; [:bar] :percent",
                       total = ItemVol, clear = FALSE, width= 60)

for(i in seq(ItemVol)){
  #&#12503;&#12525;&#12464;&#12524;&#12473;&#12496;&#12540;&#12398;&#34920;&#31034;
  pb$tick()
  
  #Image&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;
  selectAImage <- paste(FoldPath, "/", ItemList[i],
                        sep = "", collapse = "")
  
  #jpeg/png/gif&#12501;&#12449;&#12452;&#12523;&#12398;&#21028;&#26029;
  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))
    
  }
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12398;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
  RGBCol <- as.data.frame(RGBCol)
  
  #&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12434;&#25991;&#23383;&#21015;&#21270;
  RGBCol[, 4] <- as.character(RGBCol[, 4])
  #head(RGBCol)
  
  #&#30011;&#20687;&#12391;&#20351;&#29992;&#12373;&#12428;&#12390;&#12356;&#12427;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12434;&#38598;&#35336;
  CountColor <- as.data.frame(table(RGBCol[, 4]))
  
  #&#38598;&#35336;&#12487;&#12540;&#12479;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12391;&#20006;&#12403;&#26367;&#12360;
  CountColor <- CountColor[order(CountColor[, 1], decreasing = TRUE), ]
  head(CountColor)
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12398;&#37325;&#35079;&#12434;&#21066;&#38500;
  RGBCol <- RGBCol[!duplicated(RGBCol[, 4]),]
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12391;&#20006;&#12403;&#26367;&#12360;
  RGBCol <- RGBCol[order(RGBCol[, 4], decreasing = TRUE),]
  
  #&#32080;&#21512;
  RGBCol <- cbind(ItemList[i], RGBCol, CountColor[, 2])
  
  #&#12503;&#12525;&#12483;&#12488;&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
  MasterRGBCol <- rbind(MasterRGBCol, RGBCol)
  
  #&#24517;&#35201;&#12398;&#12394;&#12356;Image,LABCol,RGBCol&#12398;&#21066;&#38500;
  rm(Image,LABCol,RGBCol)
  
}

#&#34892;&#21517;&#12398;&#20184;&#19982;
colnames(MasterRGBCol) <- c("&#12501;&#12449;&#12452;&#12523;&#21517;", "&#26126;&#24230;:l", "&#35036;&#33394;&#27425;&#20803;:a", "&#35036;&#33394;&#27425;&#20803;:b", "&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;", "&#20986;&#29694;&#25968;")

#&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#12289;&#35299;&#26512;&#30011;&#20687;&#25968;&#12395;&#12424;&#12387;&#12390;&#12399;&#12501;&#12449;&#12452;&#12523;&#12469;&#12452;&#12474;&#12364;&#38750;&#24120;&#12395;&#22823;&#12365;&#12356;&#22580;&#21512;&#12364;&#12354;&#12426;&#12414;&#12377;
#&#12414;&#12383;&#12289;&#12456;&#12463;&#12475;&#12523;&#12394;&#12393;&#12391;&#35501;&#12415;&#36796;&#12417;&#12394;&#12356;&#12371;&#12392;&#12364;&#12354;&#12427;&#12398;&#12391;&#12467;&#12513;&#12531;&#12488;&#12450;&#12454;&#12488;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;
#setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#36984;&#25246;"), sep = "", collapse ="")))
#write.csv(MasterRGBCol, "&#20998;&#26512;&#32080;&#26524;.csv", fileEncoding = "CP932", eol = "\r\n")

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

#&#36600;&#12398;&#35373;&#23450;
xRange <- seq(0, 1, by = 1/ItemVol)

#&#12464;&#12521;&#12501;&#24133;&#12398;&#35373;&#23450;
xWidth <- seq(1/ItemVol, 1, by = 1/ItemVol)

#&#12503;&#12525;&#12483;&#12488;&#38936;&#22495;&#12398;&#20316;&#25104;
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()

#&#12503;&#12525;&#12464;&#12524;&#12473;&#12496;&#12540;&#12398;&#35373;&#23450;
pb <- progress_bar$new(format = "  &#20966;&#29702;&#29366;&#27841; [:bar] :percent",
                       total = ItemVol, clear = FALSE, width = 60)

for(k in seq(ItemVol)){
  
  #&#12503;&#12525;&#12464;&#12524;&#12473;&#12496;&#12540;&#12398;&#34920;&#31034;
  pb$tick()
  
  #&#12487;&#12540;&#12479;&#12398;&#25277;&#20986;
  Plot <- subset(MasterRGBCol, MasterRGBCol[, 1] == ItemList[k])
  
  #&#20986;&#29694;&#25968;&#12434;&#20006;&#12403;&#26367;&#12360;&#12390;&#12289;TOP15&#12434;&#25277;&#20986;
  #Plot <- Plot[order(as.vector(Plot[, 6]), decreasing = TRUE),]
  #Plot <- head(Plot, n = 15)
  
  #&#26126;&#24230;&#12391;&#20006;&#12403;&#26367;&#12360;
  #&#34892;&#30058;&#21495;&#12434;&#25351;&#23450;&#12377;&#12427;&#12371;&#12392;&#12391;&#20006;&#12403;&#26367;&#12360;&#12398;&#22522;&#28310;&#12434;&#22793;&#26356;&#12391;&#12365;&#12414;&#12377;
  #2&#34892;&#30446;"&#26126;&#24230;:l", 3&#34892;&#30446;"&#35036;&#33394;&#27425;&#20803;:a", 4&#34892;&#30446;"&#35036;&#33394;&#27425;&#20803;:b", 5&#34892;&#30446;"&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;"
  Plot <- Plot[order(as.vector(Plot[, 2]), decreasing = TRUE),]
  
  #&#12487;&#12540;&#12479;&#12398;&#12503;&#12525;&#12483;&#12488;
  rasterImage(as.raster(Plot[, 5]),
              xRange[k], 0, xWidth[k], 1, interpolate = FALSE)
  
}

出力例

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

ALL

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

aPlot

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

TOP15

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

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