R EBImage - eiichiromomma/CVMLAB GitHub Wiki
R) EBImage
(BioconductorのEBImageを使った画像解析
BioconductorのPackage
Bioconductorはオープンソースなゲノム解析ソフト群で、その中に色々な画像を扱えるEBImageがある。 EBImageはUnixではお馴染のImageMagicを利用している上に、データについては素直にRの配列で扱える仕様となっている。
が、Windows環境では普通使わないImageMagic(とGTK)に頼っている事がネックとなり、すんなり使えず導入にはImageMagicとGTKのインストールが必須となる。
使える画像フォーマット
ImageMagicのAPIを使っているので恐らくImageMagick: Formats に記載されているものが全て使える筈だが、取り敢えずBMPしか試してない。
EBImageを使う準備
によればエラい楽になった。ImageMagicとgtkは必要だが、 これらのインストール、PATHの設定を終えていればRで
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")
と入力するだけで良くなった。
旧バージョン
Bioconductor関連はCRANには登録されていないのでinstall.packagesは使えずに手動インストールとなる。 CRANでの紹介ではWindows用バイナリは存在しないとなっているが、メンテナのページ にはしっかり存在する。
"Win32 binary and dependencies"のリンクを辿るとEBImage_x.xx.xx.zip)の他、ImageMagic-x.x.x-Q16-windows-dll.exe、gtk-x.x.x-win32-1.exeが置かれているので、それぞれバージョンの一番大きいものを拾ってくる。 (gtkについてはGimp for Windowsを導入していれば不要)
gtk, ImageMagicを実行してインストールした後に、EBImage_x.xx.xx.zip)をRのlibraryフォルダ(デフォルトではC:\Program Files\R\R-x.x.x\library)に展開する。(EBImageフォルダが追加されている筈)
EBImageの利用
Rを起動して
library(EBImage)
とするだけで使える。 関数群については
help(package="EBImage")
の他、EBImageフォルダのdocフォルダ内にAnalysisWithEBImage.pdfがあり、具体的な操作法が記載されている。
画像の読み込み
read.imageを使う。定義は以下の通り。
im<-read.image(ファイル名, colormode)
colormodeはTrueColorあるいはGrayscaleのみが用意されている。ファイル名にはURLでも良いらしい。
例: test.jpgをフルカラーで読み込む
im<-read.image("test.jpg)",TrueColor)
ちなみにグレースケールで読む場合はファイル名のみで良い。
Image-class
読み込んだ画像はImage-classとして格納される。 他の画像処理packageでの取扱と決定的な違いは終始x,yの概念でデータを扱える仕様となっている点にある。 640x480の画像を読み込むとimは
>dim(im)
[1] 640 480 1
となる。つまり行、列が自動で入れ替えられているため、rimageの時のようなややこしい脳内変換をせずに画像f(x,y)についてのデータの参照は
im[x,y]
で行なえる。
またTrueColorで読み込んだ場合にはchannelでチャネル毎にデータを取り出す必要がある。
channel(Image,mode)
modeは
- rgb:TrueColorの整数値。値を弄るのには不向き。
- gray:グレースケール値。値は0~1の範囲。
- red, green, blue:Red, Green, Blueの値。値は0~1の範囲。
- asred, asgreen, asblue: Red, Green, Blueの値。値は0~255の範囲(8bitの場合)。
- x11:RGBの順での16進表示。用途不明。
となる。 ちなみにImageは要素指定をしても有効。
表示はimageやplotではなく
display(im)
とする。
注意点
当然ながら画像f(x,y)としての完結しか出来ないため、行、列データとして保存するためには入れ替える必要が生じる。 入れ替えはflip, rotateを使えば良い。
imx<-flip(rotate(im,angle=-90))
とすると通常の行列データの並びになる。
rimageとの互換性
rimage用に作成した関数をそのまま使いたいのでImage-classをimagematrix-classに変換してみる。 変換にはflip, rotate済みのデータを使う。
x<-c(channel(imx,"red"),channel(imx,"green"),channel(imx,"blue"))
dim(x)<-c(dim(imx)[1:2],3)
immat<-imagematrix(x)
これでimmatはrimageで読み込んだ行列として扱える。