#author: Nadezhda Shivarova
#date created: 30/11/15
#Description: Perform Bi-Level Image Threshold on a histogram to determine the optimal threshold level
#Using the algorithm in the paper Bi Level Img Thresholding, Antonio dos Anjos

import numpy as np

def bi_level_img_threshold( hist ):
    hist = hist.flatten()
    print('len hist ', len(hist))
    if(len(hist) !=0):
        #start and end index of the histogram
        I_s = 0
        I_e = len(hist)-1
        #print('I_e ', I_e, 'I_m ', (I_s+I_e)/2)
        #print('hist [Ie]', hist[I_e])
        # starting point: get right and left weights of histogram and
        # determine the midpoint base triangle

        I_m = (I_s+I_e)/2
        W_l = np.sum(hist[I_s : I_m])  
        W_r = np.sum(hist[I_m+1 : I_e])
        #print('W_l ', W_l, 'W_r ', W_r)

        while (I_s != I_e):
            if (W_r > W_l):
                W_r = W_r - hist[I_e]
                #print('Wr ', W_r)
                I_e = I_e - 1
                #print('Ie new', I_e)

                if ((I_s+I_e)/2 < I_m):
                    W_l = W_l - hist[I_m]
                    W_r = W_r + hist[I_m]
                    I_m = I_m - 1

            #apply the algorithm mirrored, I_m tends towards depression		
            elif (W_l >= W_r):
                W_l = W_l + hist[I_s]
                I_s = I_s + 1

                if ((I_s+I_e)/2 > I_m):
                    W_l = W_l + hist[I_m+1]
                    W_r = W_r - hist[I_m+1]
                    I_m = I_m + 1

        #I_s and I_e get closer until they are equal to I_m
        #I_m is the optimal threshold i.e. depression between left and right side
        return I_m
    else:
        return 45
