PY


Processamento digital de imagens
Contraste


Manipulação de contraste

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.
As imagens se encontram a seguir:

Usando um programa de visualização de imagens, como paint visualize as imagens:

  1. - imagem01, TIFF Tamanho 600 POR 400,
  2. - imagem02, TIFF tamanho 400 por 300,
  3. - imagem03, TIFF tamanho 500 por 400 pixels e
  4. - imagem04, TIFF tamanho 351 por 500.

tarefa:

  1. Elabore um programa para a visualização do histograma da imagem.
  2. Analisando o histograma 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. Proponha uma transformação linear de contraste para cada caso.
  5. Elabore um programa para melhorar o brilho e contraste destas imagens e gere novas imagens com melhor qualidade.
  6. Quem é o fotógrafo amador?

Resposta:

imagem

mínimo

máximo

brilho

contraste

bits

a

b

600-400

400-300

500-400

351-500

Etapas do programa
Ler a imagem (I)
definir os valores do parâmetros "a" e "b" da transformação linear
varrer a imagem (variando linhas e colunas)
em cada posição:
ler o valor digital na posicao (linha,coluna)... v=I(linha, coluna)
v= H(i,j) [v em double]
aplicar a transformacao linear w = a * v +b
copiar este valor na posicao do pixel (linha, coluna)
H(i,j)=w [H em uint8]
cuidado! H(i,j) deve ficar na faixa 0 a 255
visualizar resultado na tela

Dada uma imagem "I" de uma única banda, com nl linhas e nc colunas, podemos visualizar o histograma e identificar os valores mínimo e máximo contendo informações (mini, e maxi).
Com estes valores extremos, calcule os coeficientes da transformação linear de contraste Y = a * X + b

Aplique a transformação linear a dotos os pixels, cuidando com o ormato dos dados (uint8, float). for L in range(nl):
   for C in range (nc):
     v=np.float( I[L,C] ) # valor digital da posicao L,C, em float, para multiplicar e somar corretamemte
     Y= a * v +b # transformação
     w= np.uint8( np.round(Y) ) # transformamos a uint8
     if w<0: # verificamos que o valor fique entre 0 e 255
       w=0
     if w>255:
       w=255
     I[L,C] =w # atribuímos o novo valor ao pixel

usando OpenCV

Podemos aplicar a transformação linear de contraste usando ferramentas de OpenCV. Por exemplo, você já sabe ler uma imagem e criar seu histograma (veja aula anterior ).

Use estes exemplos para ler a imagem "igreja.jpg", transformar apra gray (RGB2GRAY) e criar o histograma (histo). # transformação RGB a gray
G = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)
# calcular o histograma na faixa de 0-255, ou seja, 256 valores
histo= cv2.calcHist([I],[0],None,[256],[0,256])

Agora calcule os valores mínimo e máximo do histograma, necessários para a transformação linear de contraste. minimo=0
maximo=255
for i in range(256):
   if histo[i]>0 and minimo==0:
     minimo=i
   if histo[i]>0:
      maximo=i
print(minimo, maximo)

Crie uma Look Up Table (LUT) com os 256 novos possíveis valores... x = np.arange(256) # faixa de variação dos valores digitais (0-255)
xp = [0, minimo, maximo, 255] # valores do eixo "horizontal" de entrada para a transformação
fp = [0, 0, 255, 255] # valores da imagem de saída , eixo "vertical"
plt.plot(xp, fp )
# interpolar valores para "y" com as entradas dadas em "x"
y = np.interp(x, xp, fp).astype('uint8')
plt.plot(x,y '*' )

FInalmente, aplique esta tabela a cada pixel na imagem usando OpenCV # aplicar esta tabela a cada pixel na imagem original (LUT=Look Up Table)
img = cv2.LUT(G, y)
# mostrar as duas imagens, entrada e saída
cv2_imshow( G)
cv2_imshow( img)