【问题标题】:get neighbors function in R在R中获取邻居函数
【发布时间】:2016-07-04 13:59:22
【问题描述】:

我的数据实际上是 256 x 256 矩阵形式的图像。我想编写一个名为“get.nbhd”的函数,它为一个像素选择 4 个邻居并将其存储为向量。然后在需要时调用该函数。如果像素在角落或边界上,则分别有 2 个和 3 个邻居。这是一个玩具数据集。所以对于中间的任何像素说 d[i,j] 4 个邻居将是 {d[i-1,j],d[i+1,j],d[i,j+1],d[i ,j-1]}。对于 4 个角像素,2 个相邻像素将是 {d[i,j-1],[i+1,j]} ,{d[i,j+1],d[i+1,j]}, {d[i-1,j],d[i,j-1]}, {d[i-1,j],d[i,j+1]}。顶部和底部边框像素将有 3 个邻域,分别为 {d[i-1,j],[i+1,j],d[i,j-1]}。任何帮助表示赞赏。

    > x<- matrix(rbinom(8*8,1,0.5),8,8)
    > x
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    1    1    0    1    0    1    0
    [2,]    1    1    0    1    0    1    1    1
    [3,]    1    1    1    1    1    0    0    0
    [4,]    1    1    1    0    1    1    1    1
    [5,]    1    1    1    1    0    1    0    0
    [6,]    1    1    1    0    0    1    1    1
    [7,]    0    1    1    1    1    0    0    0
    [8,]    0    1    0    0    0    1    1    0

【问题讨论】:

    标签: r image-processing machine-learning image-segmentation


    【解决方案1】:

    此函数为您提供向量中m[i, j] 的邻居:

    get.nbhd <- function(m, i, j) {
      # get indices
      idx <- matrix(c(i-1, i+1, i, i, j, j, j+1, j-1), ncol = 2)
      # set out of bound indices to 0
      idx[idx[, 1] > nrow(m), 1] <- 0
      idx[idx[, 2] > ncol(m), 2] <- 0
      return (x[idx])
    }
    

    函数受益于使用零作为索引的事实不会给出错误,但只是不返回任何值。因此,太大的索引被设置为零。

    作为一个例子,我使用了一个与你不同的矩阵,因为如果只有 1 和 0,那么检查结果的正确性并不容易。

    x<- matrix(1:25,5,5)
    x
    ##      [,1] [,2] [,3] [,4] [,5]
    ## [1,]    1    6   11   16   21
    ## [2,]    2    7   12   17   22
    ## [3,]    3    8   13   18   23
    ## [4,]    4    9   14   19   24
    ## [5,]    5   10   15   20   25
    get.nbhd(x, 2, 3)
    ## [1] 11 13 17  7
    get.nbhd(x, 1, 5)
    ## [1] 22 16
    get.nbhd(x, 5, 3)
    ## [1] 14 20 10
    

    【讨论】:

    • 非常感谢!这很有帮助。还有一个问题。如何修改此函数以提取邻居索引而不是实际值。当我开始编码时,我意识到我还需要另一个返回邻域索引的函数。例如,对于点 d[1,1],该函数将 d[1,2] 和 d[2,1] 作为相邻索引。如果它不合适,那么我可以将其作为另一个问题发布。
    • 索引在函数的第一行计算。由此,您需要删除具有无效索引的行。 (在函数中,我只将无效索引设置为零,但您可能希望完全删除它们。)如果这还不足以帮助您,我认为最好提出一个新问题。不要忘记先在 SO 和 Google 上寻找有用的答案!
    • 谢谢。我可以通过删除零的行来修改你的函数!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2017-12-23
    相关资源
    最近更新 更多