Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对R中的矩阵应用过滤器的最快方法_R_Image Processing_Matrix_Filter_Filtering - Fatal编程技术网

对R中的矩阵应用过滤器的最快方法

对R中的矩阵应用过滤器的最快方法,r,image-processing,matrix,filter,filtering,R,Image Processing,Matrix,Filter,Filtering,如果我有一个2d矩阵,并且我想在给定一些滤波器矩阵的情况下应用某种滤波器(例如,扩张、腐蚀、sobel边缘检测): 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 } }

如果我有一个2d矩阵,并且我想在给定一些滤波器矩阵的情况下应用某种滤波器(例如,扩张、腐蚀、sobel边缘检测):

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
    }
}

有一个函数叫做
卷积
,但我想它只适用于一维信号。因此,剩下的是
fft
选项。在频域中进行操作,然后转换回时域

在不知道预期输入/输出的情况下,很难显示准确的步骤,但请尝试以下方法:

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

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

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

但正如@joran所说,这取决于你想做什么

如果没有一个特定的函数应用于每个像素,这是不可能回答的。也许你可以从
SpatialVx
package中的
kernel2dsmooth
中得到启发…
focal()
光栅包支持非常一般的操作,在这些操作中,你想要为每个单元计算其附近值的函数。还有,@JoshO'Brien在阅读第一个链接中的注释时,看起来
焦点
已从
光栅
移动,而且效率低下。也许我错过了什么。@agstudy--不,你误读了第一条评论。Re:效率,这总是相对的。这些2-D邻域操作通常比较慢(我认为每个单元的b/c必须访问几个不连续的内存块),并且无法从OP的问题判断它们需要多快。另外,你知道有更快的(R)吗?
apply( m , 1:2 , function(x){ x * 10 } )
#    [,1] [,2] [,3]
#[1,]  240  160   20
#[2,]  110  100   50
#[3,]  230  190   80