# Image Pyramid basics demo -
# Reduce an image in size by 1/2 ( edge length) -or-  1/4 (area)
# This example uses a 5x5 gausian filter before sampling!
#
# Jay Summet 2015
#
#Python 2.7, OpenCV 2.4.x
#

import cv2
import numpy as np

def scaleTo8Bit(image, displayMin = None, displayMax=None ):

   if displayMin == None:
       displayMin = np.min(image)

   if displayMax == None:
      displayMax = np.max(image)

   np.clip(image, displayMin, displayMax, out=image)

   image = image - displayMin
   cf = 255. / (displayMax - displayMin)
   imageOut = ( cf * image).astype(np.uint8)

   return imageOut


#Linux window threading setup code.
cv2.startWindowThread()
cv2.namedWindow("Original")
cv2.namedWindow("Reduced 1")
cv2.namedWindow("Reduced 2")
cv2.namedWindow("Reduced 3")

#Load source / input image as grayscale, also works on color images...
imgIn = cv2.imread("oscar512.png", cv2.IMREAD_GRAYSCALE)
cv2.imshow("Original", imgIn)
imgIn = imgIn.astype(np.float32)

#Using sigmal of 1.7, try 2.5 and 0.5 instead...
gBlurImg = cv2.GaussianBlur(imgIn, (5,5), 1.7  )

#Make a reduced size image from the Gausian Blurred version...
reduced1 = gBlurImg[::2,::2]
reduced1_8 = scaleTo8Bit(reduced1)
cv2.imshow("Reduced 1", reduced1_8)


#Do it a 2nd time
gBlurImg = cv2.GaussianBlur(reduced1, (5,5), 1.7  )

reduced2 = gBlurImg[::2,::2]
reduced2_8 = scaleTo8Bit(reduced2)
cv2.imshow("Reduced 2", reduced2_8)

#Do it a 3rd time
gBlurImg = cv2.GaussianBlur(reduced2, (5,5), 1.7  )

reduced3 = gBlurImg[::2,::2]
reduced3_8 = scaleTo8Bit(reduced3)
cv2.imshow("Reduced 3", reduced3_8)

#Write the result!
cv2.imwrite("oscarReducedGausian.png", reduced3)
cv2.waitKey(0)


