library(raster)
## Loading required package: sp
library(randomForest)
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
library(psych)
## 
## Attaching package: 'psych'
## The following object is masked from 'package:randomForest':
## 
##     outlier
setwd("~/Dropbox/BGU/1_Other/Amos_Bouskila/p_01_rgb_image_supervised_classification_example/")

###############################################

# Raster
r = brick("DSC_0588.JPG")

# Classified points
dat = read.csv("DSC_0588.csv", stringsAsFactors = FALSE)
dat$type = as.factor(dat$type)
xy = xyFromCell(r, dat$cell)

# Plot raster & classified points
plotRGB(r)
points(xy)
text(xy, as.character(dat$type), col = c("brown", "green", "yellow")[dat$type], pos = 3)

# Add 'greenness' index
dat$greenness = (dat$DSC_0588.2 - dat$DSC_0588.1) / (dat$DSC_0588.2 + dat$DSC_0588.1)

# Split to 'training' and 'test' data
test = sample(1:nrow(dat), 25)
test = (1:nrow(dat)) %in% test

# Fit model
fit = randomForest(type ~ DSC_0588.1 + DSC_0588.2 + DSC_0588.3 + greenness, data = dat[!test, ])
fit
## 
## Call:
##  randomForest(formula = type ~ DSC_0588.1 + DSC_0588.2 + DSC_0588.3 +      greenness, data = dat[!test, ]) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 18%
## Confusion matrix:
##       dry green soil class.error
## dry    14     5    1   0.3000000
## green   2    12    0   0.1428571
## soil    1     0   15   0.0625000
# Predict on 'test' data
dat$pred = predict(fit, dat)

# Evaluate model accuracy
tab = table(dat$type[test], dat$pred[test])
cohen.kappa(tab)
## Warning in cohen.kappa1(x, w = w, n.obs = n.obs, alpha = alpha, levels =
## levels): upper or lower confidence interval exceed abs(1) and set to +/- 1.
## Call: cohen.kappa1(x = x, w = w, n.obs = n.obs, alpha = alpha, levels = levels)
## 
## Cohen Kappa and Weighted Kappa correlation coefficients and confidence boundaries 
##                  lower estimate upper
## unweighted kappa  0.71     0.88     1
## weighted kappa    0.57     0.82     1
## 
##  Number of subjects = 25
# Predict on entire image
img = as.data.frame(r)
img$greenness = (img$DSC_0588.2 - img$DSC_0588.1) / (img$DSC_0588.2 + img$DSC_0588.1)
img$pred = predict(fit, img)
pred = r[[1]]
pred[] = as.numeric(factor(img$pred, levels = c("green", "dry", "soil")))

# Plot
plot(pred, col = c("brown", "green", "yellow"))