# Programa para COntraste LINEAR
# PROGRAMA para fazer contraste
##################################################################
import numpy as np
import matplotlib.pyplot as plt

# primeiro: uma funcao que calcule o hiostograma
# histograma(X) mostra histograma de matriz X
def histograma(X):     # define a funcao hostograma
    nl,nc = X.shape   # tamanho
    maximo= 1+np.uint8( np.round( np.max(X) ) ) #(maximo e minimo)
    minimo= 1+np.uint8( np.round( np.min(X) ) )
    print('minimo/maximo=',minimo,maximo )
    h = [0 for x in range(256)]          # aloca vetor para histograma
    # calcula histograma
    for L in range(nl):
        for C in range (nc):
            v=np.uint8( np.round( X[L,C] ) )
            h[v]=h[v]+1
    # Plot the data
    plt.plot(h, label='histograma')     # mostra histograma
    plt.show()
    return(h)
 # FIM de funcao


print('+------------------------+')
print('| Programa de contraste  |')
print('+------------------------+')
# passos
#a) ler imagem e seu tamanho
#b) calcular o minimo e maximo dessa imagem
#c) aplicar transf linear
#d) salvar

# ler imagem
B1= plt.imread('escura.tif')  # esta imagem está em Uint8 (8 bits unsigned int)
 
nl, nc = B1.shape     # recuperar dimensões da matriz (shale)
print('dimensoes', nl, nc)
histograma(B1)

# mudo a imagem para float, para poder calcular com quebrados
C1=np.array(B1, dtype=float)
maxi=np.max(C1)    # ler vamor digital maximo e minimo (em float)
mini=np.min(C1)
print('minimo e maximo', mini, maxi)
#  meus minimos e maximos
# mini=0
# maxi=30
# print('Meus minimo e maximo', mini, maxi)

# calcular parametros de transformacao lineax Y= a * X + b
a=(255-0)/(maxi-mini)
b = - a * mini
print("a e b= ", a,b)



# solucao simples _____ multiplicar matriz e somar um valor
# C1 = a * C1 + b


# solucao GERAL
for L in range(nl):         # varrer em linhas
    for C in range (nc):    # varrer em colunas
        vd=C1[L,C]          # valor original na posicao L,C
        nv=a *vd + b        # novo valor apos contraste
        if nv>255:
           nv=255
        if nv<0:
           nv=0
        C1[L,C]=nv

B2=np.uint8(np.round( C1)) # transfromar pata Uint 8 para salvar
plt.imsave('saida.png',B2,cmap='gray')

maxi=np.max(C1)      # novos minimos e maximos
mini=np.min(C1)
print('novos valores', mini, maxi)
histograma(B2)