code: def grid_distortion(img, num_steps=10, xsteps=[], ysteps=[], interpolation=cv2.INTER_LINEAR,
                      border_mode=cv2.BORDER_REFLECT_101, value=None):
      
      height, width = img.shape[:2]
  
      x_step = width // num_steps
      xx = np.zeros(width, np.float32)
      prev = 0
      for idx, x in enumerate(range(0, width, x_step)):
          start = x
          end = x + x_step
          if end > width:
              end = width
              cur = width
          else:
              cur = prev + x_step * xsteps[idx]
  
          xx[start:end] = np.linspace(prev, cur, end - start)
          prev = cur
  
      y_step = height // num_steps
      yy = np.zeros(height, np.float32)
      prev = 0
      for idx, y in enumerate(range(0, height, y_step)):
          start = y
          end = y + y_step
          if end > height:
              end = height
              cur = height
          else:
              cur = prev + y_step * ysteps[idx]
  
          yy[start:end] = np.linspace(prev, cur, end - start)
          prev = cur
  
      map_x, map_y = np.meshgrid(xx, yy)
      map_x = map_x.astype(np.float32)
      map_y = map_y.astype(np.float32)
      img = cv2.remap(img, map_x, map_y, interpolation=interpolation, borderMode=border_mode, borderValue=value)
      return img
docs: Reference:
          http://pythology.blogspot.sg/2014/03/interpolation-on-regular-distorted-grid.html