# 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)