我试图通过显示网格中每个像素的交叉数来传达2D空间中的线条浓度。我正在描绘类似于密度图的东西,但具有更直观的单位。我被spatstat包及其线段类(psp)所吸引,因为它允许您通过其端点定义线段并将整行包含在计算中。但是,我正在努力找到正确的功能组合来统计这些计数,并希望得到任何建议。
如下面的示例所示,50行,密度函数生成(0,140)中的值,pixellate函数计算每个像素的总长度,并取值(0,0.04),as.mask生成二进制指示线是否经过每个像素。我希望能看到比例为整数值的东西,比如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,但是权重唯一地应用于每一行(并不特定于行/像素对)。我还考虑为每一行计算二进制掩码并添加结果,但似乎应该有一种更简单的方法。我知道你可以沿着一条线采样点,然后按像素计算点数。但是,我担心采样正确,以便每个像素的每条线交叉点只有一个点。
在R中有直接的方法吗?否则这是否是未来包装增强的适当建议?用python或matlab等其他语言更容易实现吗?
以上示例和我的测试是在x86_64-w64-mingw32上使用spatstat 1.40-0,R 3.1.2。
答案 0 :(得分: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 = "")