1

グリッド内の各ピクセルを通る交差の数を示すことにより、2D 空間での線の集中を伝えようとしています。密度プロットに似たものを描いていますが、より直感的な単位を使用しています。spatstat パッケージとその線分クラス (psp) に惹かれました。端点で線分を定義し、線全体を計算に組み込むことができるからです。ただし、これらの数を集計するための関数の適切な組み合わせを見つけるのに苦労しており、提案をいただければ幸いです。

以下の 50 ラインの例に示すように、密度関数は (0,140) の値を生成し、pixellate 関数は各ピクセルの全長を集計し、(0, 0.04) の値を取得します。線が各ピクセルを通過しました。スケールが整数値を取るもの、たとえば 0..10 を期待しています。

require(spatstat)  
set.seed(1234)  
numLines = 50  

# define line segments
L = psp(runif(numLines),runif(numLines),runif(numLines),runif(numLines), window=owin())

# image with 2-dimensional kernel density estimate
D = density.psp(L, sigma=0.03)  

# image with total length of lines through each pixel  
P = pixellate.psp(L)  

# binary mask giving whether a line went through a pixel  
B = as.mask.psp(L)  

par(mfrow=c(2,2), mar=c(2,2,2,2))
plot(L, main="L")  
plot(D, main="density.psp(L)")  
plot(P, main="pixellate.psp(L)")  
plot(B, main="as.mask.psp(L)")

pixellate.psp 関数を使用すると、オプションで、計算に使用する重みを指定できます。これを操作してピクセルを正規化し、交差ごとに 1 カウントすることを検討しましたが、重みは各ラインに一意に適用されます (ライン/ピクセルのペアに固有ではありません)。行ごとにバイナリ マスクを計算して結果を追加することも考えましたが、もっと簡単な方法があるはずです。線に沿ってポイントをサンプリングし、ピクセルごとにポイントをカウントできることを知っています。ただし、ピクセルのライン交差ごとに1つのポイントのみが存在するように、サンプリングを正しく行うことに関心があります。

Rでこれを行う簡単な方法はありますか? それ以外の場合、これは将来のパッケージ拡張のための適切な提案でしょうか? これは、python や matlab などの別の言語でより簡単に達成できますか?

上記の例と私のテストは、x86_64-w64-mingw32 上の spatstat 1.40-0、R 3.1.2 で行われました。

4

1 に答える 1

0

これが将来の拡張機能として組み込まれるものであることは間違いありません。これは、spatstat の次のバージョンのいずれかで行われる予定です。pixellate.psp全長を測るのではなく、交差する線の数を数えることも選択肢になるでしょう。

今のところ、たとえば次のように少し複雑なことをする必要があります。

require(spatstat)  
set.seed(1234)  
numLines = 50  

# define line segments
L <- psp(runif(numLines),runif(numLines),runif(numLines),runif(numLines), window=owin())

# split into individual lines and use as.mask.psp on each
masklist <- lapply(1:nsegments(L), function(i) as.mask.psp(L[i]))

# convert to 0-1 image for easy addition
imlist <- lapply(masklist, as.im.owin, na.replace = 0)
rslt <- Reduce("+", imlist)

# plot
plot(rslt, main = "")

各ピクセルを横切る線の数

于 2015-01-07T10:11:12.187 に答える