2013-02-16 18 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