PY


Processamento digital de imagens
Histograma


Contraste

Neste módulo vamos aprender calcular e visualizar o histograma de uma imagem. O histograma de uma imagem é um gráfico que monstra a distribuição de frequências dos valores digitais dos pixels. No histograma, o eixo "x" representa cada um dos possíveis valores digitais (0 0 255, ou 1-256) e a altura representa a quantidade ou frequência absoluta com que cada valor digital ocorre.

Passos

  1. incluir os cabeçãlhos de import, e montar drive.
  2. ler a imagem do google drive(já sabemos) I=....
  3. alocar um vetor H de tamanho 256 para armazenar o histograma com np.zeros
  4. varrer as linhas
    • varrer as colunas
      1. ler o valor digital do pixel na posição linha coluna
      2. somar uma unidade ao respectivo elemento do vetor H (contador de ocorrencias)
    • mistrar o grafico (H) com matplotlib.

Não vamos repetir a parte inicial, então vamos para a segunda parte.

Dada a imagem I (igreja.jpg disponível no seu drive) con n linhas e m colunas, podemos ler ela, calcular seu tamanho (n e m) e também seus valores mínimos e máximos pasta= "/content/drive/My Drive/images/"
nome="igreja.jpg"
arq=pasta+nome
print(arq)
I = plt.imread(arq)
print('tamanho',I.shape) # numero de linhas, colunas e bandas!
n,m=I.shape
minimo=np.min(I)
maximo=np.max(I)
print('minimo=', minimo, 'maximo=', maximo)
plt.imshow(I, cmap=plt.get_cmap('gray'),vmin=0,vmax=255)

Agora, calcule o histograma, para isto devemos:

  1. alocar o vetor vazio
  2. varrer a imagem de inico ao fim, variando linhas e depois colunas.
    1. ler valor do pixel e acumular o respectivo contador
  3. mostrar resultado
H=np.zeros( (256))
for i in range(n):
   for j in range(m):
     v=int( I[i,j] )
     H[v]=H[v]+1

plt.plot(H)
plt.title("Histograma da imagem")
plt.legend()
plt.show()

Como função

Como o histograma pode ser uma função que podemos chamar de diferentes partes do programa, não vale a pena repetir toda vez estas linhas. Poderiamos agrupar estes comandos sob forma de uma função, dar nome a ela, e chamar a função de dentro do programa em diferentes locais.

Para isto, os comandos debem ser incluídos no programa antes de sua chamada. Geralmente fazemos isso no início do programa, após as linhas de import

Note que a imagem, dentro da função se chama X, não mais I. isto é porque as variáveis usadas valem apenas dentro da função. mesmom que usemos variáveis com o mesmo nome dentro e fora da função, elas são independentes.

a função:

  • recebe variavei de entrada (argumentos)
  • pode devolver uma saída

    vejamos: def histograma(X): # define a funcao histograma de imagem X
      minimo=np.min(I)
      maximo=np.max(I)
      n,m=I.shape
      print('minimo=', minimo, 'maximo=', maximo)

      h = [0 for x in range(256)] # aloca vetor para histograma
      # calcula histograma
      H=np.zeros( (256))
      for i in range(n):
         for j in range(m):
           v=int( I[i,j] )
           H[v]=H[v]+1

      plt.plot(H)
      plt.title("Histograma da imagem")
      plt.legend()
      plt.show()
       return(H)
    # FIM de funcao
    # inicio de processamento da imagem
    pasta= "/content/drive/My Drive/images/"
    nome="igreja.jpg"
    arq=pasta+nome
    I = plt.imread(arq)
    print('tamanho',I.shape) # numero de linhas, colunas e bandas!
    n,m=I.shape

    # chamar função Histograma
    h=histograma(I)

    Desafio

    Um fotógrafo amador, na sua viagem por Curitiba, obteve várias imagens usando sua câmara digital. Como ele não leu o manual da câmara antes de fotografar, algumas imagens não apresentam boa qualidade. Para sua correção, o fotógrafo enviou as imagens para que nosso laboratório as recuperasse.

    1. Elabore um programa para a visualização do histograma da imagem.
    2. Verifique os valores máximos e mínimos e avalie a qualidade da imagem em termos de brilho e contraste.
    3. Com quantos Bits poderia ser armazenada cada imagem original?
    4. Calcule os parâmetros da transformação linear de contrasate para cada caso.

    imagem

    mínimo

    máximo

    brilho

    contraste

    bits

    a

    b

    600-400

    400-300

    500-400

    351-500