2016-03-17 54 views
0

我有一个实际上是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]}。顶部和底部边界像素将具有{d [i-1,j],[i + 1,j],d [i,j-1]}的3个邻居。任何帮助表示赞赏。在R中获取邻居函数

> 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 

回答

2

此功能使您的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]) 
} 

使用零作为索引不会给一个错误的事实功能利润,只是没有返回值。因此,太大的指数设置为零。

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

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 
+0

非常感谢!这有很大帮助。还有一个问题。我如何修改这个函数来提取邻居的索引而不是实际的值。当我开始编码时,我意识到我还需要另一个返回邻域索引的函数。例如,对于点d [1,1],该函数将d [1,2]和d [2,1]作为邻居索引。如果它不合适,我可以将它作为另一个问题发布。 – user24318

+0

指数是在函数的第一行计算的。由此,您需要删除具有无效索引的行。 (在函数中,我只将无效索引设置为零,但您可能希望完全删除它们。)如果这不足以帮助您,我认为最好提出一个新问题。不要忘记首先在SO和Google上寻找有用的答案! – Stibu

+0

谢谢。我能够通过删除零行来修改你的函数! – user24318