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を導入済み。
問題
- ファイル名がfftwではなくdfftwとなっている
- 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
とする。