celestialgod

image processing

Nov 15th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 2.33 KB | None | 0 0
  1. library(plyr)
  2. library(dplyr)
  3. library(tidyr)
  4. library(magrittr)
  5. xDim = 200
  6. yDim = 200
  7. rawImageArray = array(runif(xDim*yDim*3), c(xDim,yDim,3))
  8. array2df <- function(arrayInput){
  9.   dimImage = dim(arrayInput)
  10.   data.frame(imageValues = as.vector(arrayInput),
  11.     x = rep(1:dimImage[2], dimImage[3],,dimImage[1]),
  12.     y = rep(1:dimImage[1], prod(dimImage[c(2,3)])),
  13.     z = rep(1:dimImage[3],,, prod(dimImage[1:2])))
  14. }
  15. df2array <- function(dtInput){
  16.   array(dtInput %>% arrange(z, x, y) %>% .$imageValues,
  17.     c(max(dtInput$y), max(dtInput$x), max(dtInput$z)))
  18. }
  19.  
  20. st = proc.time()
  21. imageDF = array2df(rawImageArray) %>% tbl_df
  22. meanFilter = list(xLen = 3, yLen = 3, Func = mean)
  23. outList = vector('list', meanFilter$xLen*meanFilter$yLen)
  24.  
  25. x2 = -floor(meanFilter$xLen / 2):floor(meanFilter$xLen / 2)
  26. y2 = -floor(meanFilter$yLen / 2):floor(meanFilter$yLen / 2)
  27. xR = range(imageDF$x)
  28. yR = range(imageDF$y)
  29. k = 1
  30. for (i in x2)
  31. {
  32.   for (j in y2)
  33.   {
  34.     outList[[k]] = imageDF %>% mutate(x = x+i, y = y+j) %>%
  35.       filter(x >= xR[1], x <= xR[2], y >= yR[1], y <= yR[2]) %>% tbl_df()
  36.     k = k + 1
  37.   }
  38. }
  39. out = outList %>% llply(function(dt){
  40.   gather(dt, variable, values, -x, -y, -z) %>% mutate(variable = as.character(variable))
  41.   }) %>% bind_rows %>% tbl_dt(FALSE) %>% group_by(x, y, z, variable) %>%
  42.   summarise(values = mean(values)) %>% spread(variable, values) %>% df2array
  43. proc.time() - st
  44. #   user  system elapsed
  45. #   0.71    0.11    0.81
  46.  
  47. filterImage <- function(imgArray, imgFilter) {
  48.   x <- dim(imgArray)[1]
  49.   y <- dim(imgArray)[2]
  50.   z <- dim(imgArray)[3]
  51.  
  52.   dx <- floor(dim(imgFilter)[1] / 2)
  53.   dy <- floor(dim(imgFilter)[2] / 2)
  54.  
  55.   newImgArray <- array(0, dim = c(x, y, z))
  56.   for (i in 1:x) {
  57.     for (j in 1:y) {
  58.       for (k in 1:z) {
  59.         for (p in (0 - dx):(0 + dx)) {
  60.           for (q in (0 - dy):(0 + dy)) {
  61.             if (i + p < 1 || i + p > x || j + q < 1 || j + q > y) {
  62.               next
  63.             }
  64.             newImgArray[i, j, k] <- newImgArray[i, j, k] +
  65.               imgArray[(i + p), (j + q), k] * imgFilter[dx + p + 1, dy + q + 1]
  66.           }
  67.         }
  68.       }
  69.     }
  70.   }
  71.   newImgArray
  72. }
  73. imgFilter <- array(1/9, dim=c(3, 3))
  74. st = proc.time()
  75. filteredImageArray <- filterImage(rawImageArray, imgFilter)
  76. proc.time() - st
  77. #   user  system elapsed
  78. #   6.33    0.07    6.81
Advertisement
Add Comment
Please, Sign In to add comment