如何在R中按像素计算线段出现次数?

时间:2015-01-07 04:33:55

标签: r spatstat

我试图通过显示网格中每个像素的交叉数来传达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。

1 个答案:

答案 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 = "")

Number of lines crossing each pixel