2015年4月5日日曜日

R言語で画像データハンドリング(EBImage)

R言語で画像データを取り扱う方法を調べています。
代表的なのはEBImageのようですので、まず試してみました。
とりあえず、
$ sudo R
> source("http://bioconductor.org/biocLite.R")
> biocLite("EBImage")
としてインストールします。ルート権限で実行しないとパッケージのアップデートができない、と怒られます。なので、ルート権限で実行します。すると途中、他のパッケージのアップデートをするか聞いてくるので、アップデートしてやります。
途中で「gfortranがない」と文句を言ってくるので、gfortran-4.8とlibgfortran-4.8-devをsynapticでインストールして、再度
> biocLite("EBImage")
としたらとりあえずエラー無しにインストールできたようです。
(あと、imagemagick、libtiff5-devもインストールしておいたほうが良さそうです)
データを読み込んでみます。
> install.packages("tiff")
> install.packages("png")
> install.packages("jpeg")
> install.packages("bmp")
> library(EBImage)
> library(bmp)
> setwd("/home/xxx/R")
> img <- read.bmp("small.bmp")
 以下にエラー read.bmp("small.bmp") : 
  Do not know how to handle compressed BMP
> img <- read.bmp("large.bmp")
> hist(img)
 エラー:  サイズ 795.6 Mb のベクトルを割り当てることができません 
> plot(img)
 エラー:  サイズ 1.6 Gb のベクトルを割り当てることができません 
>
まず、小さく切り出したビットマップを読み込もうとしたのですが、GIMPで保存する際に圧縮がかかっているようです。そのために読み込めません。かといって、GIMPで切りだす前の巨大なビットマップを読もうとすると、読むことはできてもその後の処理が32bit版ではメモリ不足を起こすようです。
仕方がないので、小さく切り出した画像を非圧縮のTIFで保存しなおしてみます。
> img <- readImage("tate.tif")
> display(img)
> bimg <- img*255
> bimg[,,1]
Image
  colormode: Color 
  storage.mode: double 
  dim: 210 210 
  nb.total.frames: 1 
  nb.render.frames: 1 

imageData(object)[1:5,1:6]:
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]  106  104  101  100   96   93
[2,]  138  139  143  140  135  137
[3,]  110  106  112  121  114  111
[4,]   52   50   52   54   54   49
[5,]   47   47   45   44   42   48

> bimg[,,2]
Image
  colormode: Color 
  storage.mode: double 
  dim: 210 210 
  nb.total.frames: 1 
  nb.render.frames: 1 

imageData(object)[1:5,1:6]:
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   88   91   93   96   88   89
[2,]  134  138  136  139  136  133
[3,]  121  111  115  114  115  118
[4,]   61   59   57   57   61   63
[5,]   50   48   43   46   51   44

> bimg[,,3]
Image
  colormode: Color 
  storage.mode: double 
  dim: 210 210 
  nb.total.frames: 1 
  nb.render.frames: 1 

imageData(object)[1:5,1:6]:
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   98  102  107  112  108  104
[2,]  141  143  147  145  143  145
[3,]  122  119  114  111  109  114
[4,]   53   51   52   51   51   49
[5,]   41   41   37   42   46   45

> hist(bimg)
>
最初の「img <- readImage("tate.tif")」で画像を読み込みます。
読み込んだ画像を確認するために「display(img)」で表示させて確認します。
次の「bimg <- img*255」は読み込んだ画像は0〜255の画素値が0〜1に割付け直されるようですので、これを0〜255に割りつけ直すために各画素を255倍します。RGBそれぞれの画素値はimg[,,x]の3番目の添字で選べるようです。
読み込んだ画像は「hist(bimg)」でヒストグラムを取ることができます。この場合、勝手に1枚のグラフにRGBそれぞれの値をプロットしてくれます。
さらにEBImageをつかって画像をハンドリングする例がこちらにありました。そのうち試してみたいと思います。
また、基本的な画像処理(明度、コントラスト、ガンマ、切り出し、2値化、回転、平行移動、反転など)についてはこちらでひと通りの紹介がされています。
でも、直接巨大ビットマップを扱いたいんだよなぁ・・・。

0 件のコメント: