[R] Asking Favor For the Script of Median Filter

Bert Gunter gunter.berton at gene.com
Mon Mar 28 02:12:35 CEST 2011


?runmed

-- Bert

On Sun, Mar 27, 2011 at 2:44 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>
> On Mar 27, 2011, at 10:56 AM, chuan_zl wrote:
>
>> Hello,everybody. My name is Chuan Zun Liang. I come from Malaysia. I am
>> just
>> a beginner for R. Kindly to ask favor about median filter. The problem I
>> facing as below:
>>
>>
>>> x<-matrix(sample(1:30,25),5,5)
>>> x
>>
>>    [,1] [,2] [,3] [,4] [,5]
>> [1,]    7    8   30   29   13
>> [2,]    4    6   12    5    9
>> [3,]   25    3   22   14   24
>> [4,]    2   15   26   23   19
>> [5,]   28   18   10   11   20
>>
>> This is example original matrices of an image. I want apply with median
>> filter with window size 3X# to remove salt and pepper noise in my matric.
>> Here are the script I attend to writing.The script and output shown as
>> below:
>>
>>> MedFilter<-function(mat,sz)
>>
>> + {out<-matrix(0,nrow(mat),ncol(mat))
>> +  for(p in 1:(nrow(mat)-(sz-1)))
>> + {for(q in 1:(ncol(mat)-(sz-1)))
>> + {outrow<-median(as.vector(mat[p:(p+(sz-1)),q:(q+(sz-1))]))
>> + out[(p+p+(sz-1))/2,(q+q+(sz-1))/2]<-outrow}}
>> + out}
>>
>
> Noting that median is probably the "rate-limiting" factor, I looked for
> another way to get the "middle" of 9 items. Using order seem faster:
>
>> system.time( replicate(100000, x2s <- sort(x2)))
>   user  system elapsed
>  9.829   0.212  10.029
>> system.time( replicate(100000, x2m <- median(x2)))
>   user  system elapsed
>  7.169   0.126   7.272
>> system.time( replicate(100000, x2s <-x2[order(x2)[5] ]))
>   user  system elapsed
>  1.907   0.051   1.960
>
> So see if this is any faster. On my system it's about three times faster:
>
> x <- matrix(sample(364*364), 364,364)
> out <- matrix(0, 364,364)
> for(xi in 1:(nrow(x)-2)) {
>      for(yi in 1:(ncol(x)-2) ) {
>         xm <- x[xi+0:2, yi+0:2]
>          d[xi+1, yi+1] <-xm[order(xm)[5] ]}}
>
> #---------tests ------
>> system.time(for(xi in 1:(nrow(x)-2)) {
> +       for(yi in 1:(ncol(x)-2) ) {
> +          xm <- x[xi+0:2, yi+0:2]
> +           d[xi+1, yi+1] <-xm[order(xm)[5] ]}} )
>   user  system elapsed
>  3.806   0.083   3.887
>
>> system.time(MedFilter(x,3) )
>   user  system elapsed
>  11.242   0.202  11.427
>
>
>>> MedFilter(x,3)
>>
>>    [,1] [,2] [,3] [,4] [,5]
>> [1,]    0    0    0    0    0
>> [2,]    0    8   12   14    0
>> [3,]    0   12   14   19    0
>> [4,]    0   18   15   20    0
>> [5,]    0    0    0    0    0
>>
>> Example to getting value 8 and 12 as below:
>>
>> 7  8 30                         8 30 29
>> 4  6 12 (median=8)         6 12   5 (median=12)
>> 25 3 22                         3 22 14
>>
>> Even the script can give output. However, it is too slow. My image size is
>> 364*364. It is time consumption. Is it get other ways to improving it?
>
> David Winsemius, MD
> West Hartford, CT
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



-- 
Bert Gunter
Genentech Nonclinical Biostatistics



More information about the R-help mailing list