1

我有来自图像处理程序的数据,我需要将它们拼凑起来。我的图像数据最初是显微镜载玻片上的 18 个(6 x 3)孔阵列,我需要对这些孔进行一致的编号,以便以后可以识别每个孔中的内容。我有孔的近似 x 和 y 位置(以像素为单位),我想从左到右然后从上到下(似乎最简单)对它们进行排序,并将它们编号为 1 到 18。

像这样:

     [,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(如果从 0 开始计数,则缺少 14)

理想的输出将是一个带有左右、上下井号(甚至“战舰”坐标)的新列

抱歉,如果这是一个家庭作业问题,但我真的不知道如何有效地做到这一点,而无需对截止点进行硬编码。我使用 R 是因为它是我掌握的唯一语言,并且我已经准备好围绕这个问题编写其他代码。

4

1 回答 1

3

下面的代码将帮助您根据像素位置对孔进行分类。但是,也许更重要的是以下内容——
这些是您针对像素位置绘制的 WellNumber 标签。 这种标记方案是有意的,还是在标记图像数据时井位置被打乱了?

在此处输入图像描述



为了对您的数据进行排序,我们只需要一个自然的中断,例如图像大小。在下面的示例中,我选择了 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
于 2013-02-16T04:23:49.467 回答