我有一张图片,实际上是一个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
回答:
这个函数会返回m[i, j]
的邻居像素,并以向量的形式呈现:
get.nbhd <- function(m, i, j) { # 获取索引 idx <- matrix(c(i-1, i+1, i, i, j, j, j+1, j-1), ncol = 2) # 将超出边界的索引设为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 25get.nbhd(x, 2, 3)## [1] 11 13 17 7get.nbhd(x, 1, 5)## [1] 22 16get.nbhd(x, 5, 3)## [1] 14 20 10