text: import numpy as np
  import scipy.ndimage
  
  def gen_gauss_window(lw, sigma):
      sd = np.float32(sigma)
      lw = int(lw)
      weights = [0.0] * (2 * lw + 1)
      weights[lw] = 1.0
      sum = 1.0
      sd *= sd
      for ii in range(1, lw + 1):
          tmp = np.exp(-0.5 * np.float32(ii * ii) / sd)
          weights[lw + ii] = tmp
          weights[lw - ii] = tmp
          sum += 2.0 * tmp
      for ii in range(2 * lw + 1):
          weights[ii] /= sum
      return weights
  
  def compute_image_mscn_transform(image, C=1, avg_window=None, extend_mode='constant'):
      if avg_window is None:
        avg_window = gen_gauss_window(3, 7.0/6.0)
      assert len(np.shape(image)) == 2
      h, w = np.shape(image)
      mu_image = np.zeros((h, w), dtype=np.float32)
      var_image = np.zeros((h, w), dtype=np.float32)
      image = np.array(image).astype('float32')
      scipy.ndimage.correlate1d(image, avg_window, 0, mu_image, mode=extend_mode)
      scipy.ndimage.correlate1d(mu_image, avg_window, 1, mu_image, mode=extend_mode)
      scipy.ndimage.correlate1d(image**2, avg_window, 0, var_image, mode=extend_mode)
      scipy.ndimage.correlate1d(var_image, avg_window, 1, var_image, mode=extend_mode)
      var_image = np.sqrt(np.abs(var_image - mu_image**2))
      return (image - mu_image)/(var_image + C), var_image, mu_image
  