## -----------------------------------------------------------------------------
#| label: setup
library(imagine)


## -----------------------------------------------------------------------------
#| eval: false
# install.packages("imagine")


## -----------------------------------------------------------------------------
#| eval: false

# # Build kernels
# # Kernel 1: For bottom edge recognition
# kernel1 <- matrix(
#   data = c(-1, -2, -1,
#             0,  0,  0,
#             1,  2,  1),
#   nrow = 3
# )
# 
# # Kernel 2: Diagonal weighting
# kernel2 <- matrix(
#   data = c(-2, 0, 0,
#             0, 1, 0,
#             0, 0, 2),
#   nrow = 3
# )
# 
# # Apply filters
# convolutionExample  <- convolution2D(X = wbImage, kernel = kernel1)
# convQuantileExample <- convolutionQuantile(X = wbImage, kernel = kernel2, probs = 0.1)


## -----------------------------------------------------------------------------
#| message: false
#| label: fig-2d-quantile-conv
#| fig-width: 5.33
#| fig-height: 8.5
#| fig-cap: "2D vs 2D quantile convolutions"
#| fig-pos: "h"
#| results: hide
#| echo: false

# Defining a copy of wbImage
myMatrix <- wbImage

# Defining color palette
cols <- gray.colors(n = 1e3, start = 0, end = 1)

# Build kernels
# Kernel 1: For bottom edge recognition
kernel1 <- matrix(
  data = c(-1, -2, -1,
            0,  0,  0,
            1,  2,  1), 
  nrow = 3
)

# Kernel 2: Diagonal weighting 
kernel2 <- matrix(
  data = c(-2, 0, 0,
            0, 1, 0,
            0, 0, 2), 
  nrow = 3
)

# Apply filters
convolutionExample  <- convolution2D(X = myMatrix, kernel = kernel1)
convQuantileExample <- convolutionQuantile(
  X = myMatrix, 
  kernel = kernel2, 
  probs = 0.8
)

# Make plots
par(
  mar = c(0, 0.5, 0, 0.5), 
  oma = c(0, 0, 2, 0), 
  mfrow = c(3, 1)
)

image(wbImage, col = cols, axes = FALSE)
mtext(text = "Original", side = 3, line = -1.5, font = 2, adj = 0.99)

image(convolutionExample, col = cols, axes = FALSE)
mtext(
  text = "2D convolution", 
  side = 3, 
  line = -1.5, 
  col = "white", 
  font = 2, 
  adj = 0.99
)

image(convQuantileExample, col = cols, axes = FALSE)
mtext(
  text = "2D quantile convolution", 
  side = 3, 
  line = -1.5, 
  col = "black", 
  font = 2, 
  adj = 0.99
)


## -----------------------------------------------------------------------------
#| eval: false

# # Add some noise (NA) to the image (matrix)
# set.seed(7)
# naIndex <- sample(
#   x = seq(prod(dim(myMatrix))),
#   size = as.integer(0.4*prod(dim(myMatrix))),
#   replace = FALSE
# )
# myMatrix[naIndex] <- NA
# 
# # Build kernel
# radius <- 3
# 
# # Apply filters
# meanfilterExample     <- meanFilter(X = myMatrix, radius = radius)
# quantilefilterExample <- quantileFilter(X = myMatrix, radius = radius, probs = 0.1)
# medianfilterExample   <- medianFilter(X = myMatrix, radius = radius)


## -----------------------------------------------------------------------------
#| message: false
#| label: fig-basic-filter-comparison
#| fig-width: 7.5
#| fig-height: 5
#| fig-cap: "Basic filters comparison"
#| fig-pos: "h"
#| results: hide
#| echo: false

# Defining a copy of wbImage
myMatrix <- wbImage

# Defining color palette
cols <- gray.colors(n = 1e3, start = 0, end = 1)

# Add some noise (NA) to the image (matrix)
set.seed(7)
naIndex <- sample(
  x = seq(prod(dim(myMatrix))), 
  size = as.integer(0.4*prod(dim(myMatrix)))
)
myMatrix[naIndex] <- NA

# Apply filters
meanfilterExample   <- meanFilter(X = myMatrix, radius = 3)
medianfilterExample <- medianFilter(X = myMatrix, radius = 3)

# Make plots
par(mar = rep(0, 4), oma = rep(0.5, 4), mfrow = c(2, 2))

image(wbImage, col = cols, axes = FALSE)
mtext(text = "Original", side = 3, line = -1.5, font = 2, adj = 0.99)

image(myMatrix, col = cols, axes = FALSE)
mtext(
  text = "Original with noise (NA)", 
  side = 3, 
  line = -1.5, 
  font = 2, 
  adj = 0.99
)

# meanfilterExample[meanfilterExample < 0] <- 0
image(meanfilterExample, col = cols, axes = FALSE)
mtext(
  text = "Mean filter", 
  side = 3, 
  line = -1.5, 
  font = 2, 
  adj = 0.99
)

# medianfilterExample[medianfilterExample < 0] <- 0
image(medianfilterExample, col = cols, axes = FALSE)
mtext(
  text = "2D median filter", 
  side = 3, 
  line = -1.5, 
  font = 2, 
  adj = 0.99
)


## -----------------------------------------------------------------------------
#| eval: false

# medianFilter(X = wbImage, radius = 5, times = 50)


## -----------------------------------------------------------------------------
#| message: false
#| label: fig-recursive-filtering
#| fig-width: 7.5
#| fig-height: 5
#| fig-cap: "Filters with several time settings"
#| fig-pos: "h"
#| results: hide
#| echo: false

times <- c(1, 5, 15)

# Defining color palette
cols <- gray.colors(n = 1e3, start = 0, end = 1)

# Apply filters
median_times1 <- medianFilter(X = wbImage, radius = 5, times = times[1])
median_times2 <- medianFilter(X = wbImage, radius = 5, times = times[2])
median_times3 <- medianFilter(X = wbImage, radius = 5, times = times[3])

# Make plots
par(mar = rep(0, 4), oma = rep(0.5, 4), mfrow = c(2, 2))

image(wbImage, col = cols, axes = FALSE)
mtext(text = "Original", side = 3, line = -1.5, font = 2, adj = 0.99)

image(median_times1, col = cols, axes = FALSE)
mtext(text = paste("2D median filter\ntimes =", times[1]), 
      side = 3, line = -2.5, font = 2, adj = 0.99)

image(median_times2, col = cols, axes = FALSE)
mtext(text = paste("2D median filter\ntimes =", times[2]), 
      side = 3, line = -2.5, font = 2, adj = 0.99)

image(median_times3, col = cols, axes = FALSE)
mtext(text = paste("2D median filter\ntimes =", times[3]), 
      side = 3, line = -2.5, font = 2, adj = 0.99)

