PY
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:
tarefa:
Resposta:
imagem |
mínimo |
máximo |
brilho |
contraste |
bits |
a |
b |
600-400 |
|||||||
400-300 |
|||||||
500-400 |
|||||||
351-500 |
Etapas do programa
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
Aplique a transformação linear a dotos os pixels, cuidando com o ormato dos dados (uint8, float).
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
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).
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.
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...
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
img = cv2.LUT(G, y)
# mostrar as duas imagens, entrada e saída
cv2_imshow( G)
cv2_imshow( img)