From: David Winsemius <dwinsemius_at_comcast.net>

Date: Sun, 27 Mar 2011 17:44:50 -0400

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. Received on Sun 27 Mar 2011 - 21:48:19 GMT

Date: Sun, 27 Mar 2011 17:44:50 -0400

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. Received on Sun 27 Mar 2011 - 21:48:19 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Mon 28 Mar 2011 - 00:30:25 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*