2013-02-16 79 views
1

我從一個圖像處理程序中獲取數據,需要將它們合併在一起。我的圖像數據最初是在顯微鏡載玻片上的18個(6 x 3)孔陣列,我需要對這些孔進行一致編號,以便我可以確定後面每個孔中的內容。我有井的大致x和y位置(以像素爲單位),我想對它們進行排序,從左至右,再從上到下(似乎簡單)和1個號碼他們18按2維排序R

這樣的:

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 2 3 4 5 6 
[2,] 7 8 9 10 11 12 
[3,] 13 14 15 16 17 18 

的告誡:

- 未所有孔中是由圖像處理程序拾取,所以有時也有小於18

- 未在同一行或列中的所有孔都在完全相同的x或y,他們似乎漂浮在20-40像素左右。

- 不是所有的圖像都集中在同一個點上,或者是以完全相同的放大倍數,所以好的位置不夠可靠,不足以編碼範圍。數據的

實施例:

Well BBXLeft BBYTop 
1  0  39 637 
2  1  43 1218 
3  2  596 630 
4  3  610 1212 
5  4 1161 633 
6  5 1164 1207 
7  6 1710 623 
8  7 1715 1202 
9  8 2267 620 
10 9 2271 1199 
11 10 2824 617 
12 11 2845 1197 
13 12  35  57 
14 13  593  53 
15 14 1709  45 
16 15 2262  41 
17 16 2820  38 

或者在再現的形式從dput

wells <- structure(list(Well = 0:16, BBXLeft = c(39L, 43L, 596L, 610L,1161L, 1164L, 1710L, 1715L, 2267L, 2271L, 2824L, 2845L, 35L, 593L, 1709L, 2262L, 2820L), BBYTop = c(637L, 1218L, 630L, 1212L, 633L, 1207L, 623L, 1202L, 620L, 1199L, 617L, 1197L, 57L, 53L, 45L, 41L, 38L)), .Names = c("Well", "BBXLeft", "BBYTop"), class = "data.frame", row.names = c(NA, -17L)) 

韋爾斯亂序從圖像分析程序 此示例缺失以及#15(或14,如果計數從0)

理想的輸出將是一個新的列與左右上,下井號碼(甚至「戰艦」coord inates)

對不起,如果這是一個家庭作業的問題,但我真的不知道如何有效地做到這一點沒有硬編碼的臨界值。我使用R是因爲它是我掌握的唯一語言,我還有其他代碼可以準備好解決這個問題。

+3

目前還不清楚你想要的輸出格式是什麼。我猜BBXLeft和BBYtop是你想要在矩陣或data.frame中放置的x和y座標,但是你的解釋很糟糕,太長了..保持簡單:我有這個..我想要這個。這是我試過的。 – N8TRO 2013-02-16 03:40:09

+0

我會第二次@ NathanG的評論。另外,關於失蹤的井......如何確定哪個井具體缺失? – 2013-02-16 04:03:07

回答

3

下面的代碼將幫助您根據像素位置對井進行排序。 但是,可能更重要的是以下內容 -
這些是您的WellNumber標籤對像素位置的繪製。 此標籤方案是故意的,還是在標註圖像數據時洗井的位置?

enter image description here



爲了對數據進行排序,我們只需要一個自然的休息,如圖像尺寸。在下面的例子中,我選擇了500,但您可以根據需要進行調整。

# sort & plot the pixel corners, to get an idea for where the boundaries re 
sort(wells$BBXLeft) 
sort(wells$BBYTop) 

plot(x=wells$BBXLeft, y=wells$BBYTop) 

# add an NA for the missing value (we cant just ignore it) 
wells[18,] <- c(NA, 1100, 30) 

imgSize <- 500 
nrows <- 3 
ncols <- 6 

# Assign row and col number based on boundaries set every 'imgSize' 
# Note that rows are reversed, top to bottom 
wells$row <- cut(wells$BBYTop, breaks=seq(imgSize*nrows, 0, -imgSize), label=1:nrows) 
wells$col <- cut(wells$BBXLeft, breaks=seq(0, imgSize*ncols, imgSize), label=1:ncols) 

# your battleship coordinates 
wells$battleship <- paste0("(", wells$row, ", ", wells$col, ")") 


# then to sort it, sorting by rows, then by cols 
orderedWells <- wells$WellNo[order(wells$row, wells$col)] 

# if you want to lay it out nicely, use a matrix 
matrix(orderedWells, nrow=nrows, ncol=ncols, byrow=TRUE) 

#   [,1] [,2] [,3] [,4] [,5] [,6] 
#  [1,] 12 13 NA 14 15 16 
#  [2,] 0 2 4 6 8 10 
#  [3,] 1 3 5 7 9 11 
+0

謝謝你,對於慢速響應感到抱歉,我還沒有完全將它集成到我的代碼的其餘部分,但它看起來像它所需要的。我現在知道了關於「剪切」功能。我希望我不必硬編碼imgSize,我有數百個圖像需要通過,並且總是有例外,我會嘗試構建一些標記潛在錯誤的東西。 – GregS 2013-02-18 22:22:22

+1

@GregS,沒有問題。您不一定必須硬編碼圖像大小。您可以編程方式找到時間間隔。例如,使用'diff()'和查找高於給定閾值的間隔。 – 2013-02-19 04:09:06