【问题标题】:Fastest way to apply a filter to a matrix in R [closed]将过滤器应用于R中的矩阵的最快方法[关闭]
【发布时间】:2013-04-13 02:38:21
【问题描述】:

如果我有一个二维矩阵,并且我想在给定一些过滤矩阵的情况下应用某种过滤器(例如扩张、侵蚀、索贝尔边缘检测):

f = matrix(c(0,1,0,
             1,1,1,
             0,1,0), 3)

将它应用于矩阵的最有效方法是什么。

循环遍历每个像素似乎效率太低:

for(i in 2:nrow(mat)){
    for(j in 2:ncol(mat)){
        //Apply filter to pixel i,j
    }
}

【问题讨论】:

  • 如果没有适用于每个像素的特定函数,这是无法回答的。
  • 也许你可以从 SpatialVx 包中的 kernel2dsmooth 获得灵感...
  • raster 包中的 focal() 支持非常通用的操作,您可以在其中为每个像元计算其邻域中的值的函数。 Here is one examplehere is another.
  • @JoshO'Brien 在您的第一个链接中读取 cmets,看起来 focal 是从 raster 移动的,而且效率低下。也许我错过了什么。
  • @agstudy -- 不,您误读了第一条评论。回复:效率,这总是相对的。这些二维邻域操作通常相对较慢(我相信每个单元的 b/c 他们必须访问几个不连续的内存块),并且无法从 OP 的问题中判断他们需要多快是。另外,你知道什么更快(在 R 中)?

标签: r image-processing matrix filter filtering


【解决方案1】:

我猜这取决于你在做什么!您只需调用对矩阵进行操作的函数即可将函数应用于矩阵的每个单元格。像这样的:

f1 <- function(x){ x*2 }

m <- matrix(sample(25,9),nrow=3)
m
#    [,1] [,2] [,3]
#[1,]   24   16    2
#[2,]   11   10    5
#[3,]   23   19    8

## Operates on all cells as R treats the matrix like a vector
f1(m)
#    [,1] [,2] [,3]
#[1,]   48   32    4
#[2,]   22   20   10
#[3,]   46   38   16

或者,如果这种构造对您不起作用,那么您可以使用 apply 将函数应用于矩阵的每一行/列:

apply( m , 1:2 , function(x){ x * 10 } )
#    [,1] [,2] [,3]
#[1,]  240  160   20
#[2,]  110  100   50
#[3,]  230  190   80

但就像@joran 所说,这取决于你想做什么!

【讨论】:

    【解决方案2】:

    有一个名为convolve 的函数,但我猜它只适用于一维信号。所以你剩下fft 选项。在频域做运算并转换回时域。

    在不知道预期输入/输出的情况下很难显示确切的步骤,但试试这个:

    Re( fft( (1/dimension) * fft(signal) * fft(f), inverse=T))
    

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多