Apply filter to a photo of my dog.

#' Stylistic low-res pixelated filter 
#' 
#' @param img 2D matrix of intensities
#' @param t Variance threshould
#' @param klist List of voxel sizes
#' @param style Pixelation style (triangle or otherwise square)
#' 
#' @return Pixelated matrix
pixel <- function(img, t=0.01, klist=c(5,10,20,40,80), style='triangle') {
  mat <- img
  # loop through all voxel sizes
  for(k in klist) {
    for(row in seq(1, nrow(mat)-k, by=k)) {
      for(col in seq(1, ncol(mat)-k, by=k)) {
        voxel <- mat[row:(row+k), col:(col+k)]
        v <- var(as.numeric(voxel))
        # if pixels within voxel have less variance than threshold, set to same intensity
        if(v < t) {
          set.seed(0)
          if(style=='triangle') {
            # set upper and lower triangles to different intensities
            mat[row:(row+k), col:(col+k)][lower.tri(mat[row:(row+k), col:(col+k)])] <- sample(voxel, 1)
            mat[row:(row+k), col:(col+k)][upper.tri(mat[row:(row+k), col:(col+k)])] <- sample(voxel, 1)
          } else {
            # set entire voxel to same intensity
            mat[row:(row+k), col:(col+k)] <- sample(voxel, 1)
          }
        }
      }
    }
  }
  return(mat)
}

# Runner
library(jpeg)
img <- readJPEG('~/Desktop/foxxy.jpg')

# Just use red channel layer for now
mat <- img[,,1]

# Plot original image
par(mfrow=c(1,1), mar=rep(0,4))
plot.new()
lim <- par()
rasterImage(mat, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])

# Plot pixelated image
mat <- pixel(mat, t=0.002, style='square')
par(mfrow=c(1,1), mar=rep(0,4))
plot.new()
lim <- par()
rasterImage(mat, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])




Apply filter to another of my photos.