Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(plyr)
- library(dplyr)
- library(tidyr)
- library(magrittr)
- xDim = 200
- yDim = 200
- rawImageArray = array(runif(xDim*yDim*3), c(xDim,yDim,3))
- array2df <- function(arrayInput){
- dimImage = dim(arrayInput)
- data.frame(imageValues = as.vector(arrayInput),
- x = rep(1:dimImage[2], dimImage[3],,dimImage[1]),
- y = rep(1:dimImage[1], prod(dimImage[c(2,3)])),
- z = rep(1:dimImage[3],,, prod(dimImage[1:2])))
- }
- df2array <- function(dtInput){
- array(dtInput %>% arrange(z, x, y) %>% .$imageValues,
- c(max(dtInput$y), max(dtInput$x), max(dtInput$z)))
- }
- st = proc.time()
- imageDF = array2df(rawImageArray) %>% tbl_df
- meanFilter = list(xLen = 3, yLen = 3, Func = mean)
- outList = vector('list', meanFilter$xLen*meanFilter$yLen)
- x2 = -floor(meanFilter$xLen / 2):floor(meanFilter$xLen / 2)
- y2 = -floor(meanFilter$yLen / 2):floor(meanFilter$yLen / 2)
- xR = range(imageDF$x)
- yR = range(imageDF$y)
- k = 1
- for (i in x2)
- {
- for (j in y2)
- {
- outList[[k]] = imageDF %>% mutate(x = x+i, y = y+j) %>%
- filter(x >= xR[1], x <= xR[2], y >= yR[1], y <= yR[2]) %>% tbl_df()
- k = k + 1
- }
- }
- out = outList %>% llply(function(dt){
- gather(dt, variable, values, -x, -y, -z) %>% mutate(variable = as.character(variable))
- }) %>% bind_rows %>% tbl_dt(FALSE) %>% group_by(x, y, z, variable) %>%
- summarise(values = mean(values)) %>% spread(variable, values) %>% df2array
- proc.time() - st
- # user system elapsed
- # 0.71 0.11 0.81
- filterImage <- function(imgArray, imgFilter) {
- x <- dim(imgArray)[1]
- y <- dim(imgArray)[2]
- z <- dim(imgArray)[3]
- dx <- floor(dim(imgFilter)[1] / 2)
- dy <- floor(dim(imgFilter)[2] / 2)
- newImgArray <- array(0, dim = c(x, y, z))
- for (i in 1:x) {
- for (j in 1:y) {
- for (k in 1:z) {
- for (p in (0 - dx):(0 + dx)) {
- for (q in (0 - dy):(0 + dy)) {
- if (i + p < 1 || i + p > x || j + q < 1 || j + q > y) {
- next
- }
- newImgArray[i, j, k] <- newImgArray[i, j, k] +
- imgArray[(i + p), (j + q), k] * imgFilter[dx + p + 1, dy + q + 1]
- }
- }
- }
- }
- }
- newImgArray
- }
- imgFilter <- array(1/9, dim=c(3, 3))
- st = proc.time()
- filteredImageArray <- filterImage(rawImageArray, imgFilter)
- proc.time() - st
- # user system elapsed
- # 6.33 0.07 6.81
Advertisement
Add Comment
Please, Sign In to add comment