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

How to count line segment occurrences by pixel in R?

我试图通过显示网格中每个像素的交叉数来传达 2D 中线条的集中度 space。我正在描绘类似于密度图的东西,但具有更直观的单位。我被 spatstat 包及其线段 class (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 函数允许您有选择地指定要在计算中使用的权重。我考虑过尝试操纵它以标准化像素以对每个交叉点进行计数,但权重唯一地应用于每条线(而不是特定于 line/pixel 对)。我还考虑过为每一行计算一个二进制掩码并将结果相加,但似乎应该有更简单的方法。我知道您可以沿一条线采样点,然后按像素对点进行计数。但是,我担心采样是否正确,以便每个像素的线交叉只有一个点。

在 R 中是否有直接的方法来做到这一点?否则,这将是对未来软件包增强的适当建议吗?用 python 或 matlab 等其他语言更容易实现吗?

上面的示例和我的测试是在 x86_64-w64-mingw32.

上使用 spatstat 1.40-0、R 3.1.2 进行的

你完全正确,这是作为未来增强功能加入的东西。它将在 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 = "")