如何在R语言的apply()调用的函数中传入矩阵与单元格坐标?
解决R语言邻域平均滤波中apply无法获取坐标的问题
你遇到的核心问题是:apply(matrix, 1:2, fun) 只会将当前元素的值传递给函数fun,不会自动传入该元素对应的行号i和列号j,所以直接在函数里使用i、j会因变量未定义报错。
下面提供两种可行的解决方案:
方法一:用outer生成坐标对并计算
通过outer生成所有行号和列号的组合,配合向量化包装的邻域平均函数实现:
# 定义邻域平均函数,参数为行号i、列号j和目标矩阵 neighbor_avg <- function(i, j, mat) { # 边界处理:避免越界,不存在的邻域用当前像素值替代(可根据需求修改) up <- if (j < ncol(mat)) mat[i, j+1] else mat[i, j] down <- if (j > 1) mat[i, j-1] else mat[i, j] left <- if (i > 1) mat[i-1, j] else mat[i, j] right <- if (i < nrow(mat)) mat[i+1, j] else mat[i, j] (up + down + left + right) / 4 } # 示例:初始化矩阵并填充数据(替换成你的实际矩阵) px <- 5 picture <- matrix(data = 0, nrow = px, ncol = px) # 绘制方块+添加噪声(示例代码) picture[2:4, 2:4] <- 1 picture <- picture + rnorm(px*px, 0, 0.1) # 用outer生成结果矩阵,Vectorize让函数支持向量输入 picture_2 <- outer(1:nrow(picture), 1:ncol(picture), Vectorize(neighbor_avg), mat = picture)
方法二:使用专门的图像处理包(可选)
如果不需要手动实现,可直接用EBImage包的滤波函数快速完成邻域平均:
library(EBImage) # 将矩阵转为图像对象 img <- Image(picture, dim = c(px, px)) # 创建上下左右四方向的平均滤波核 kernel <- matrix(c(0,1,0,1,0,1,0,1,0), nrow=3) /4 # 应用滤波 img_filtered <- filter2(img, kernel) # 转回矩阵 picture_2 <- as.matrix(img_filtered)
关键说明
- 边界处理必须重视:直接访问
i-1、j+1会在矩阵边缘触发越界错误,示例中用当前像素值替代缺失的邻域,你也可以根据需求改为忽略缺失值、填充0或复制边界像素。 Vectorize的作用是让neighbor_avg能接收outer传入的行号/列号向量,避免显式循环。
内容的提问来源于stack exchange,提问作者HopelessUser69
相关产品推荐
相关产品推荐

