old_contents: """
  ===============================================
  Local Binary Pattern for texture classification
  ===============================================
  
  In this example, we will see how to classify textures based on LBP (Local Binary
  Pattern). The histogram of the LBP result is a good measure to classify
  textures. For simplicity the histogram distributions are then tested against
  each other using the Kullback-Leibler-Divergence.
  """
  
  import os
  import glob
  import numpy as np
  import pylab
  import scipy.ndimage as nd
  import skimage.feature as ft
  from skimage.io import imread
  from skimage import data
  
  
  # settings for LBP
  METHOD = 'uniform'
  P = 16
  R = 2
  
  
  def kullback_leibler_divergence(p, q):
      p = np.asarray(p)
      q = np.asarray(q)
      filt = np.logical_and(p != 0, q != 0)
      return np.sum(p[filt] * np.log2(p[filt] / q[filt]))
  
  
  def match(refs, img):
      best_score = 10
      best_name = None
      lbp = ft.local_binary_pattern(img, P, R, METHOD)
      hist, _ = np.histogram(lbp, normed=True, bins=P + 2, range=(0, P + 2))
      for name, ref in refs.items():
          ref_hist, _ = np.histogram(ref, normed=True, bins=P + 2,
                                     range=(0, P + 2))
          score = kullback_leibler_divergence(hist, ref_hist)
          if score < best_score:
              best_score = score
              best_name = name
      return best_name
  
  
  brick = data.load('brick.png')
  grass = data.load('grass.png')
  wall = data.load('rough-wall.png')
  
  refs = {
      'brick': ft.local_binary_pattern(brick, P, R, METHOD),
      'grass': ft.local_binary_pattern(grass, P, R, METHOD),
      'wall': ft.local_binary_pattern(wall, P, R, METHOD)
  }
  
  print match(refs, nd.rotate(brick, angle=30, reshape=False))
  print match(refs, nd.rotate(brick, angle=70, reshape=False))
  print match(refs, nd.rotate(grass, angle=145, reshape=False))
  
new_contents: """
  ===============================================
  Local Binary Pattern for texture classification
  ===============================================
  
  In this example, we will see how to classify textures based on LBP (Local Binary
  Pattern). The histogram of the LBP result is a good measure to classify
  textures. For simplicity the histogram distributions are then tested against
  each other using the Kullback-Leibler-Divergence.
  """
  
  import os
  import glob
  import numpy as np
  import matplotlib
  import matplotlib.pyplot as plt
  import scipy.ndimage as nd
  import skimage.feature as ft
  from skimage.io import imread
  from skimage import data
  
  
  # settings for LBP
  METHOD = 'uniform'
  P = 16
  R = 2
  
  
  def kullback_leibler_divergence(p, q):
      p = np.asarray(p)
      q = np.asarray(q)
      filt = np.logical_and(p != 0, q != 0)
      return np.sum(p[filt] * np.log2(p[filt] / q[filt]))
  
  
  def match(refs, img):
      best_score = 10
      best_name = None
      lbp = ft.local_binary_pattern(img, P, R, METHOD)
      hist, _ = np.histogram(lbp, normed=True, bins=P + 2, range=(0, P + 2))
      for name, ref in refs.items():
          ref_hist, _ = np.histogram(ref, normed=True, bins=P + 2,
                                     range=(0, P + 2))
          score = kullback_leibler_divergence(hist, ref_hist)
          if score < best_score:
              best_score = score
              best_name = name
      return best_name
  
  
  brick = data.load('brick.png')
  grass = data.load('grass.png')
  wall = data.load('rough-wall.png')
  
  refs = {
      'brick': ft.local_binary_pattern(brick, P, R, METHOD),
      'grass': ft.local_binary_pattern(grass, P, R, METHOD),
      'wall': ft.local_binary_pattern(wall, P, R, METHOD)
  }
  
  # classify rotated textures
  print match(refs, nd.rotate(brick, angle=30, reshape=False))
  print match(refs, nd.rotate(brick, angle=70, reshape=False))
  print match(refs, nd.rotate(grass, angle=145, reshape=False))
  
  # plot histograms of LBP of textures
  matplotlib.rcParams['font.size'] = 9
  plt.figure(figsize=(9, 6))
  plt.subplot(231)
  plt.imshow(brick)
  plt.axis('off')
  plt.gray()
  plt.subplot(234)
  plt.hist(refs['brick'].ravel(), normed=True, bins=P + 2, range=(0, P + 2))
  plt.subplot(232)
  plt.imshow(grass)
  plt.axis('off')
  plt.gray()
  plt.subplot(235)
  plt.hist(refs['grass'].ravel(), normed=True, bins=P + 2, range=(0, P + 2))
  plt.subplot(233)
  plt.imshow(wall)
  plt.axis('off')
  plt.gray()
  plt.subplot(236)
  plt.hist(refs['wall'].ravel(), normed=True, bins=P + 2, range=(0, P + 2))
  plt.show()
  
subject: add plots to local binary pattern example