# Image Pyramid basics demo -
# Laplacian = Original - Gaussian blur of Original.
#
# Original = Laplacian + Gaussian Blur of Original.
#
# Jay Summet 2024
#
#Python 3.10, OpenCV 4.5.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


#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  )
gBlur8 = scaleTo8Bit(gBlurImg)
cv2.imshow("GaussianBlur", gBlur8)

laplacian = imgIn - gBlurImg

lap8 = scaleTo8Bit(laplacian)
cv2.imshow("Laplacian", lap8)

newOriginal = gBlurImg + laplacian
new8 = scaleTo8Bit(newOriginal)
cv2.imshow("New Original", new8)

diff = newOriginal - imgIn
print( "Difference amount:", np.sum(diff) )

#We don't bother converting to 8 bit, as trying that on an image with
#only zeros gives a divide by zero error!
#Uncomment below to show the difference image...
#cv2.namedWindow("Difference")
#cv2.imshow("Difference", diff)


cv2.waitKey(0)

#Linux window threading setup code.
cv2.startWindowThread()


