2015-01-07 63 views
1

我想通過顯示網格中每個像素的交叉點數量來傳達2D空間中線條的濃度。我想像的是類似於密度圖的東西,但具有更直觀的單位。我被吸引到spatstat包及其線段類(psp)中,因爲它允許您通過它們的端點定義線段,並將整個線段包含在計算中。然而,我很努力地找到正確的功能組合來計算這些數字,並會很感激任何建議。如何在R中按像素計算線段出現次數?

如下例中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

我已經做到了這一點,將挖出的東西了,但crossing.psp和pixellate.ppp – mdsumner

+0

由於啓動對於這個建議,我在下面回答Ege的回答。 – bph

回答

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