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値化、回転、平行移動、反転など)についてはこちらでひと通りの紹介がされています。
でも、直接巨大ビットマップを扱いたいんだよなぁ・・・。