text: # https://youtu.be/5x-CIHRmMNY
  """
  @author: Sreenivas Bhattiprolu
  https://scikit-image.org/docs/dev/auto_examples/features_detection/plot_glcm.html
  skimage.feature.greycomatrix(image, distances, angles, levels=None, symmetric=False, normed=False)
  distances - List of pixel pair distance offsets.
  angles - List of pixel pair angles in radians.
  skimage.feature.greycoprops(P, prop)
  prop: The property of the GLCM to compute.
  {‘contrast’, ‘dissimilarity’, ‘homogeneity’, ‘energy’, ‘correlation’, ‘ASM’}
  """
  
  import matplotlib.pyplot as plt
  
  from skimage.feature import graycomatrix, graycoprops
  from skimage import io
  import cv2
  import numpy as np
  
  PATCH_SIZE = 35
  
  image = io.imread('Scratch.jpg')
  plt.imshow(image, cmap='gray')
  
  #Full image
  GLCM = graycomatrix(image, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4])
  a= graycoprops(GLCM, 'energy')[0, 0]
  
  # select some patches from grassy areas of the image
  cell_locations = [(50, 50), (200, 50), (50, 350), (200, 350)]
  cell_patches = []
  for loc in cell_locations:
      cell_patches.append(image[loc[0]:loc[0] + PATCH_SIZE,
                                 loc[1]:loc[1] + PATCH_SIZE])
  
  # select some patches from sky areas of the image
  scratch_locations = [(50, 200), (150, 200), (250, 150), (200, 200)]
  scratch_patches = []
  for loc in scratch_locations:
      scratch_patches.append(image[loc[0]:loc[0] + PATCH_SIZE,
                               loc[1]:loc[1] + PATCH_SIZE])
  
  # compute some GLCM properties each patch
  diss_sim = []
  corr = []
  homogen = []
  energy = []
  contrast = []
  for patch in (cell_patches + scratch_patches):
      glcm = graycomatrix(patch, distances=[5], angles=[0], levels=256,
                          symmetric=True, normed=True)
      diss_sim.append(graycoprops(glcm, 'dissimilarity')[0, 0]) #[0,0] to convert array to value
      corr.append(graycoprops(glcm, 'correlation')[0, 0])
      homogen.append(graycoprops(glcm, 'homogeneity')[0, 0])
      energy.append(graycoprops(glcm, 'energy')[0, 0])
      contrast.append(graycoprops(glcm, 'contrast')[0, 0])
  
  
  # OPTIONAL PLOTTING for Visualization of points and patches
  # create the figure
  fig = plt.figure(figsize=(8, 8))
  
  # display original image with locations of patches
  ax = fig.add_subplot(3, 2, 1)
  ax.imshow(image, cmap=plt.cm.gray,
            vmin=0, vmax=255)
  for (y, x) in cell_locations:
      ax.plot(x + PATCH_SIZE / 2, y + PATCH_SIZE / 2, 'gs')
  for (y, x) in scratch_locations:
      ax.plot(x + PATCH_SIZE / 2, y + PATCH_SIZE / 2, 'bs')
  ax.set_xlabel('Original Image')
  ax.set_xticks([])
  ax.set_yticks([])
  ax.axis('image')
  
  # for each patch, plot (dissimilarity, correlation)
  ax = fig.add_subplot(3, 2, 2)
  ax.plot(diss_sim[:len(cell_patches)], corr[:len(cell_patches)], 'go',
          label='Cells')
  ax.plot(diss_sim[len(cell_patches):], corr[len(cell_patches):], 'bo',
          label='Scratch')
  ax.set_xlabel('GLCM Dissimilarity')
  ax.set_ylabel('GLCM Correlation')
  ax.legend()
  
  # display the image patches
  for i, patch in enumerate(cell_patches):
      ax = fig.add_subplot(3, len(cell_patches), len(cell_patches)*1 + i + 1)
      ax.imshow(patch, cmap=plt.cm.gray,
                vmin=0, vmax=255)
      ax.set_xlabel('Cells %d' % (i + 1))
  
  for i, patch in enumerate(scratch_patches):
      ax = fig.add_subplot(3, len(scratch_patches), len(scratch_patches)*2 + i + 1)
      ax.imshow(patch, cmap=plt.cm.gray,
                vmin=0, vmax=255)
      ax.set_xlabel('Scratch %d' % (i + 1))
  
  
  # display the patches and plot
  fig.suptitle('Grey level co-occurrence matrix features', fontsize=14, y=1.05)
  plt.tight_layout()
  plt.show()