R rimage - eiichiromomma/CVMLAB GitHub Wiki

(R) rimage

Rで画像を扱うためのパッケージ

Rで画像解析でもこれの使用が前提となっている。

Windowsの場合はR-rimageOnWindowsも参照

概要

imagematrixオブジェクトが基準となり、画素値を埋め込んだ配列と"rgb"か"grey"を定めるtypeによって構成される。 配列は"rgb"だと行x列x3(r,g,b)、"grey"だと行x列になる。

imagematrix             Generate an imagematrix, i.e. primary data structure of rimage

2次元配列(行列)があればimagematrixへの変換は容易で

img<-imagematrix(行列,type="grey")

でimgが画像となる。

plot(img)

とすれば画像になった行列がプロットされる。 但し、濃度値は0から1の範囲を色に割り振るのでオーバーしている場合はnormalize(最大を1、最小を0に変換)やclipping(上下の閾値を指定してクリップ)を使う。

clippingのexampleが分かりやすい。

     data(logo)
     op <- par(mfrow=c(2,2))
     plot(logo, main="Source Image")

     # the appearance of next one doesn't change because of normalization.
     plot(normalize(2*logo), main="Doubled pixel value with normalization")

     # the next one is saturated as expected
     plot(clipping(2*logo), main="Doubled pixel value with clipping")

1枚目はオリジナルのlogoデータのプロット。 2枚目は値を2倍してnormalize。 3枚目はクリッピングをした結果、値を2倍して1をオーバーした値が白になっている。

フィルタ

詳細はhelp()参照

equalize    ヒストグラムの平坦化
highpass    ハイパスフィルタ
laplacian   ラプラシアンフィルタ
lowpass     ローパスフィルタ
meanImg     平均値フィルタ
minImg      最小値フィルタ
maxImg      最大値フィルタ(minImgと組み合わせて雑音除去に使う)
sobel       sobelフィルタ
sobel.h     sobelフィルタの横方向のみ
sobel.v     sobelフィルタの縦方向のみ

画像の取り扱い

imageType          画像が"rgb"か"grey"を返す
read.jpeg          jpeg画像の読み込み(Rで画像解析も参照)
rgb2grey           "rgb"のimagematrixを"grey"に変換

特殊な処理

fftImg     2次元FFTのおおざっぱな関数
fftw       順、逆FFTを行なう関数

      data(logo)
      plot(normalize(fftImg(logo)))

fftImgは順方向のFFTしかできない。

fftwの出力は複素数の配列になるので普通に周波数のフィルタリングをするだけならhighpassやlowpassに引数で閾値を指定した方が手っ取り早い。

thresholding  閾値処理

閾値を指定する2値化(mode="fixed")か、(確か)大津の方法(クラス間分散を使う方法)(mode="da")のいずれかを指定できる。

     data(logo)
     op <- par(mfrow=c(2,2))
     plot(logo, main="Original")
     plot(thresholding(logo, mode="fixed"), main="threshold=0.5")
     plot(thresholding(logo, mode="fixed", th=0.9), main="threshold=0.9")
     plot(thresholding(logo, mode="da"), main="auto threshold by discriminal analysis")
     par(op)

オリジナル、閾値0.5、閾値0.9、自動決定の画像となる。 自動決定の閾値を知りたい場合はthresholding関数のソースの一部を拝借する。

my.th.by.discrim <- function(img, L = 255) {
  img.int <- floor(L * img)
  h <- hist(img.int, breaks = 0:(L + 1), plot = FALSE)$density
  lv <- 0:L
  u.img <- sum(lv * h)/sum(h)
  s.img <- sum(h * (lv - u.img)^2)
  Fs <- sapply(1:(L - 1), function(k) {
    w.0 <- sum(h[1:k])
    w.1 <- sum(h[(k + 1):L])
    u.0 <- sum((1:k) * h[1:k])/w.0
    u.1 <- sum(((k + 1):L) * h[(k + 1):L])/w.1
    s.B <- w.0 * (u.0 - u.img)^2 + w.1 * (u.1 - u.img)^2
    s.B/s.img
  })
  lv[rev(order(Fs, na.last = NA))[1]]/L
}

とすれば

> plot(thresholding(logo,mode="da"))
> my.th.by.discrim(logo)
[1] 0.682353

のように閾値を得られる。

rimageをMacPortsのRで使う場合

前提

MacPortsでFFTwとlibjpegを導入済み。

問題

  1. ファイル名がfftwではなくdfftwとなっている
  2. install.packagesだと/opt/localを見ない

インストール方法

dfftw.h, dfftw_thread.h, libdfftw.a, libdfftw.la, libdfftw_thread.a, libdfftw_thread.laから

sudo ln -s dfftw.h fftw.h

みたいな感じでシンボリックリンクを作っておく。 (もっと上手い方法があると思うが)

あとはrimageのソースを拾ってきて、

R CMD INSTALL --configure-args='--with-fftw-include=/opt/local/include --with-fftw-lib=/opt/local/lib --with-jpeg-include=/opt/local/include --with-jpeg-lib=/opt/local/lib' rimage_x.x-x.x.tar.gz 

とする。