import numpy as np
import cv2
import matplotlib.pyplot as plt

STANDARD_THRESHOLDING = False
ADAPTIVE_THRESHOLDING = False
OTSU_BINARIZATION = True

def main():
    img = cv2.imread('../samples/hammerhead.jpg',0)

    if STANDARD_THRESHOLDING:
        # First argument is the source image, which should be a grayscale image.
        # Second argument is the threshold value which is used to classify the pixel values.
        # Third argument is the maxVal which represents the value to be given
        # if pixel value is more than (sometimes less than) the threshold value
        ret,thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
        ret,thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
        ret,thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
        ret,thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
        ret,thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

        titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
        images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

        for i in range(6):
            plt.subplot(2, 3, i+1),plt.imshow(images[i], 'gray')
            plt.title(titles[i])
            plt.xticks([]), plt.yticks([])

    elif ADAPTIVE_THRESHOLDING:
        img = cv2.medianBlur(img, 5)

        ret,th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
        th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
                    cv2.THRESH_BINARY, 11, 2)
        th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
                    cv2.THRESH_BINARY, 11, 2)

        titles = ['Original Image', 'Global Thresholding (v = 127)',
                    'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
        images = [img, th1, th2, th3]

        for i in range(4):
            plt.subplot(2, 2, i+1), plt.imshow(images[i], 'gray')
            plt.title(titles[i])
            plt.xticks([]), plt.yticks([])

    elif OTSU_BINARIZATION:
        ret1,th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

        # Otsu's thresholding
        ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

        # Otsu's thresholding after Gaussian filtering
        blur = cv2.GaussianBlur(img, (5, 5), 0)
        ret3,th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

        # plot all the images and their histograms
        images = [img, 0, th1,
                  img, 0, th2,
                  blur, 0, th3]
        titles = ['Original Noisy Image', 'Histogram', 'Global Thresholding (v=127)',
                  'Original Noisy Image', 'Histogram', "Otsu's Thresholding",
                  'Gaussian filtered Image', 'Histogram', "Otsu's Thresholding"]

        for i in range(3):
            plt.subplot(3, 3, i*3+1), plt.imshow(images[i*3], 'gray')
            plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
            
            plt.subplot(3, 3, i*3+2), plt.hist(images[i*3].ravel(), 256)
            plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
            
            plt.subplot(3, 3, i*3+3), plt.imshow(images[i*3+2], 'gray')
            plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])

    else:
        pass

    plt.show()


if __name__ == '__main__':
    main()