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