ランダムフィールドをウェーブレット変換する

  • RのRandomFieldsパッケージを使って粗密に違いのある2つの2次元ランダムフィールドをシミュレーション作成してみる

library(RandomFields)
n <- 2^8
nuA <- 0.1
nuB <- 0.9
modelA <- RMwhittle(nu=nuA)
modelB <- RMwhittle(nu=nuB)
# シミュレーション範囲
x <- y <- seq(from=-3,to=3,length=n)
# シミュレーション
simuA <- RFsimulate(modelA,x,y)
simuB <- RFsimulate(modelB,x,y)
plot(simuA)
plot(simuB)
  • さて、これをウェーブレット変換してみよう(Rのwaveslimパッケージ)
    • この仕組みも粗密を段階的に変えて情報を分解する仕組みなので、うまく粗密を取り出せるのでは、と思う

library(waveslim)
k <- 5
A.dwt <- dwt.2d(as.matrix(simuA), "haar", k)
B.dwt <- dwt.2d(as.matrix(simuB), "haar", k)
par(mfcol=c(1,2))
plot.dwt.2d(A.dwt)
plot.dwt.2d(B.dwt)
    • この表示の仕方は、左下隅に、もっとも粗い絵、そのL字型周囲に残りの情報の細かい成分が配されている。これを、L字単位でま「成分の二乗和」を取ってみる(これは、単なる試み)
sum(plot.dwt.2d(A.dwt, plot=FALSE)^2)
sum(plot.dwt.2d(B.dwt, plot=FALSE)^2)
sA <- sapply(A.dwt,function(x){sum(x^2)})
sB <- sapply(B.dwt,function(x){sum(x^2)})
sA
sB
d <- 2 # 画像の次元
m.sA <- matrix(c(sA,rep(sA[length(sA)],d^2-2)),byrow=TRUE,ncol=d^2-1)
m.sB <- matrix(c(sB,rep(sB[length(sB)],d^2-2)),byrow=TRUE,ncol=d^2-1)
sA.2 <- apply(m.sA,1,sum)
sB.2 <- apply(m.sB,1,sum)
sA.2[length(sA.2)] <- sA.2[length(sA.2)]/ncol(m.sA)
sB.2[length(sB.2)] <- sB.2[length(sB.2)]/ncol(m.sB)

plot(sA.2,sB.2)
    • それなりに、値に違いのあるものが出た。これを「粗密ベクトル」とすれば、この「粗密ベクトル」は画像の何かしらの情報なのではないだろうか
2
[1] 23378.453  9318.149  6632.126  6399.840  7183.711 18488.662
> sB.2
[1]   112.7862   294.8789   830.9757  2096.2763  4341.9278 53639.2285